系统相关
首页 > 系统相关> > Linux可以使用哪些值作为默认的unix套接字缓冲区大小?

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

作者:互联网

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

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

这个值是否总是在不同的Linux内核中设置相同,或者它可能是一系列可能的值?

解决方法:

默认值不可配置,但在32位和64位Linux之间有所不同.该值似乎是为了允许256个256字节的数据包,占每个数据包开销的不同(使用32位v.s.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个字节),您将无法在缓冲区中容纳尽可能多的用户数据字节,就像您为其大小指定的那样.

标签:linux,unix-sockets
来源: https://codeday.me/bug/20190816/1665075.html