在 Linux 中,如何确定 optmem_max 的最佳值?

Fre*_*ger 5 c linux network-programming linux-kernel

我们有一个 Linux 项目,我们将结构信息推送到缓冲区。最近发现内核参数 optmem_max 太小了。我被主管要求增加这个。虽然我知道如何做到这一点,但我真的不明白我怎么知道要做到这一点。

此外,我真的不明白optmem_max 是什么

这是内核文档所说的:

“每个套接字允许的最大辅助缓冲区大小。辅助数据是带有附加数据的 struct cmsghdr 结构序列。”

(我真的不明白这在英语中是什么意思)。

我在互联网上看到很多例子表明应该增加这个以获得更好的性能。

在:

/etc/sysctl.conf

我添加了这一行来解决这个问题:

net.core.optmem_max=1020000

完成此操作后,我们获得了更好的性能。

所以总结一下我的问题:

  1. 在英语中,optmem_max 是什么?

  2. 为什么在大多数 Linux 发行版中默认设置如此之低,如果将其放大以提高性能?

  3. 如何衡量这个数字的合适大小?

  4. 把它做得这么大有什么后果?

  5. 除了/etc/sysctl.conf,这个默认设置在内核的什么地方?我搜索了内核,但找不到 optmem_max 的默认值设置为 20480 的痕迹,这是我们系统的默认值。

txt*_*elp 7

  1. 在英语中,optmem_max 是什么?

optmem_max是一个内核选项,它影响分配给cmsg内核维护的列表的内存,该列表包含“额外”数据包信息,如SCM_RIGHTSIP_TTL

增加此选项允许内核根据需要分配更多内存,以便为每个连接的套接字(包括IPC套接字/管道)发送更多控制消息。

  1. 为什么在大多数 Linux 发行版中默认设置如此之低,如果将其放大以提高性能?

大多数发行版都考虑到普通用户,大多数普通用户,即使使用 Linux/Unix 作为服务器,也没有服务器群在它们之间具有光纤通道或不需要 GB 的 IPC 传输的服务器进程。

一个 20KB 的缓冲区对于“大多数”来说已经足够大,它可以最大限度地减少默认情况下所需的内核内存,并且也很容易配置,如果需要,可以这样做。

  1. 如何衡量这个数字的合适大小?

取决于您的使用情况,但Arch Wiki建议 64KB 大小optmem_max和 16MB 大小用于rmem_maxwmem_max(这是发送和接收缓冲区)。

  1. 把它做得这么大有什么后果?

更多的内核内存可以分配给每个连接的套接字,而且可能是不必要的。

  1. 除了/etc/sysctl.conf,这个默认设置在内核的什么地方?我搜索了内核,但找不到 optmem_max 的默认值设置为 20480 的痕迹,这是我们系统的默认值。

我不是 Linux 内核源代码爱好者,但看起来它可能在net/core/sock.c:318.

希望能有所帮助。