Linux 记录了 tcp 的默认缓冲区大小,但没有记录 AF_UNIX(“本地”)套接字的默认缓冲区大小。该值可以在运行时读取(或写入)。
cat /proc/sys/net/core/[rw]mem_default
这个值在不同的 Linux 内核中是否始终设置相同,或者是否存在一系列可能的值?
Linux 记录了 tcp 的默认缓冲区大小,但没有记录 AF_UNIX(“本地”)套接字的默认缓冲区大小。该值可以在运行时读取(或写入)。
cat /proc/sys/net/core/[rw]mem_default
这个值在不同的 Linux 内核中是否始终设置相同,或者是否存在一系列可能的值?
默认值不可配置,但在 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
有趣的是,如果您设置一个非默认的套接字缓冲区大小,Linux 会将其加倍以提供开销。这意味着如果您发送较小的数据包(例如,小于上面的 576 字节),您将无法在缓冲区中容纳与您为其大小指定的一样多的用户数据字节。