【问题标题】:In Linux, how do I determine optimal value of optmem_max?在 Linux 中,如何确定 optmem_max 的最佳值?
【发布时间】:2017-12-08 23:52:59
【问题描述】:

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

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

内核文档是这样说的:

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

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

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

在:

/etc/sysctl.conf

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

net.core.optmem_max=1020000

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

所以总结一下我的问题:

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

  2. 如果增大它可以提高性能,为什么在大多数 Linux 发行版中默认它会这么低?

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

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

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

【问题讨论】:

    标签: c linux linux-kernel network-programming


    【解决方案1】:
    1. 在英文中,optmem_max 是什么?

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

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

    1. 如果增大它可以提高性能,为什么在大多数 Linux 发行版中默认情况下它会这么低?

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

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

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

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

    1. 把它做大有什么影响?

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

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

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

    希望能有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-04-14
      • 2016-04-04
      • 2020-09-27
      • 2010-11-20
      • 1970-01-01
      • 2018-10-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多