LinuxでデフォルトのUnixソケットバッファサイズとして使用できる値は何ですか?

LinuxでデフォルトのUnixソケットバッファサイズとして使用できる値は何ですか?

Linuxはtcpのデフォルトのバッファサイズを文書化しますが、AF_UNIX(「ネイティブ」)ソケットについては文書化しません。この値は実行時に読み書きできます。

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

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

答え1

デフォルトは設定できませんが、32ビットと64ビットLinuxの間で異なります。この値を使用すると、パケットごとに異なるオーバーヘッド(32ビット対64ビットポインタまたは整数構造)を考慮して、それぞれ256バイトの256パケットを許可するようです。

64ビットLinux 4.14.18:212992バイト

32ビットLinux 4.4.92:163840バイト

読み出しバッファと書き込みバッファのデフォルトバッファサイズは同じです。パケットあたりのオーバーヘッドはstruct sk_buffとの組み合わせでstruct 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バイト未満のパケット)を送信すると、指定したバッファにユーザーデータのバイト数を合わせることができないことを意味します。

関連情報