web-dev-qa-db-ja.com

LinuxがデフォルトのUNIXソケットバッファーサイズに使用できる値は何ですか?

Linuxは、tcpのデフォルトのバッファーサイズを文書化しますが、AF_UNIX(「ローカル」)ソケットの文書化しません。値は実行時に読み取る(または書き込む)ことができます。

cat /proc/sys/net/core/[rw]mem_default

この値は常に異なるLinuxカーネルで同じに設定されていますか、それとも可能な値の範囲はありますか?

5
sourcejedi

デフォルトは設定できませんが、32ビットLinuxと64ビットLinuxでは異なります。値は、各256バイトの256パケットを許可するように書き込まれているようで、パケットごとのさまざまなオーバーヘッド(32ビットと64ビットのポインターまたは整数を持つ構造体)を考慮しています。

64ビットLinux 4.14.18の場合:212992バイト

32ビットLinux 4.4.92の場合:163840バイト

デフォルトのバッファーサイズは、読み取りバッファーと書き込みバッファーの両方で同じです。パケットごとのオーバーヘッドはstruct sk_buffstruct skb_shared_infoの組み合わせであるため、これらの構造の正確なサイズに依存します(アライメントのために少し切り上げられます)。例えば。上記の64ビットカーネルでは、オーバーヘッドはパケットあたり576バイトです。

http://elixir.free-electrons.com/linux/v4.5/source/net/core/sock.c#L265

/* Take into consideration the size of the struct sk_buff overhead in the
 * determination of these values, since that is non-constant across
 * platforms.  This makes socket queueing behavior and performance
 * not depend upon such differences.
 */
#define _SK_MEM_PACKETS     256
#define _SK_MEM_OVERHEAD    SKB_TRUESIZE(256)
#define SK_WMEM_MAX     (_SK_MEM_OVERHEAD * _SK_MEM_PACKETS)
#define SK_RMEM_MAX     (_SK_MEM_OVERHEAD * _SK_MEM_PACKETS)

/* Run time adjustable parameters. */
__u32 sysctl_wmem_max __read_mostly = SK_WMEM_MAX;
EXPORT_SYMBOL(sysctl_wmem_max);
__u32 sysctl_rmem_max __read_mostly = SK_RMEM_MAX;
EXPORT_SYMBOL(sysctl_rmem_max);
__u32 sysctl_wmem_default __read_mostly = SK_WMEM_MAX;
__u32 sysctl_rmem_default __read_mostly = SK_RMEM_MAX;

興味深いことに、デフォルト以外のソケットバッファーサイズを設定すると、Linuxはそれを2倍にしてオーバーヘッドを提供します。これは、小さいパケット(上記の576バイト未満など)を送信する場合、そのサイズで指定した数のバイト数のユーザーデータをバッファーに収めることができないことを意味します。

7
sourcejedi