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バイト未満のパケット)を送信すると、指定したバッファにユーザーデータのバイト数を合わせることができないことを意味します。