Linux 可以使用什么值作为默认的 unix 套接字缓冲区大小?

Linux 可以使用什么值作为默认的 unix 套接字缓冲区大小?

Linux 记录了 tcp 的默认缓冲区大小,但没有记录 AF_UNIX(“本地”)套接字的默认缓冲区大小。该值可以在运行时读取(或写入)。

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

该值在不同的 Linux 内核中是否始终设置为相同,或者是否存在一系列可能的值?

答案1

默认值是不可配置的,但 32 位和 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 会将其加倍以提供开销。这意味着,如果您发送较小的数据包(例如小于上面的 576 字节),您将无法在缓冲区中容纳您指定的大小的用户数据字节数。

相关内容