Linuxは、tcpのデフォルトのバッファーサイズを文書化しますが、AF_UNIX(「ローカル」)ソケットの文書化しません。値は実行時に読み取る(または書き込む)ことができます。
cat /proc/sys/net/core/[rw]mem_default
この値は常に異なるLinuxカーネルで同じに設定されていますか、それとも可能な値の範囲はありますか?
デフォルトは設定できませんが、32ビットLinuxと64ビットLinuxでは異なります。値は、各256バイトの256パケットを許可するように書き込まれているようで、パケットごとのさまざまなオーバーヘッド(32ビットと64ビットのポインターまたは整数を持つ構造体)を考慮しています。
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バイト未満など)を送信する場合、そのサイズで指定した数のバイト数のユーザーデータをバッファーに収めることができないことを意味します。