我们有一个 Linux 项目,我们在其中通过缓冲区推送结构信息。最近发现内核参数optmem_max太小了。我被主管要求增加这个。虽然我知道如何做到这一点,但我真的不明白我是如何知道要做到这一点的。
此外,我真的不明白 optmem_max 是什么。
内核文档是这样说的:
“每个套接字允许的最大辅助缓冲区大小。辅助数据是带有附加数据的 struct cmsghdr 结构序列。”
(我不太明白这在英文里是什么意思)。
我在 Internet 上看到许多示例建议应该增加此值以获得更好的性能。
在:
/etc/sysctl.conf
我添加了这一行来解决问题:
net.core.optmem_max=1020000
完成此操作后,我们获得了更好的性能。
总结一下我的问题:
-
optmem_max 的英文是什么?
-
如果增大它可以提高性能,为什么大多数 Linux 发行版的默认值这么低?
-
如何衡量这个数字的合适大小?
-
将其变大会产生什么后果?
-
除了/etc/sysctl.conf,默认设置在内核的什么位置?我对内核进行了 grep,但我找不到将 optmem_max 的默认值设置为 20480 的痕迹,这是我们系统上的默认值。
最佳答案
- In English, what is optmem_max?
optmem_max是影响分配给 cmsg 的内存的内核选项由内核维护的列表,包含“额外”数据包信息,如 SCM_RIGHTS或 IP_TTL .
增加此选项允许内核根据需要为需要为每个连接的套接字发送更多控制消息(包括 IPC 套接字/管道)分配更多内存。
- Why is it so low by default in most Linux distros if making it bigger improves performance?
大多数发行版都考虑到了普通用户,而大多数普通用户,即使使用 Linux/Unix 作为服务器,也没有一个服务器群,它们之间有光纤 channel ,或者不需要 GB 的 IPC 传输的服务器进程.
20KB 的缓冲区对于“大多数”来说已经足够大了,它最大限度地减少了默认情况下所需的内核内存,而且配置起来也很容易,如果需要的话可以这样做。
- How does one measure what a good size for this number to be?
取决于您的使用情况,但 Arch Wiki建议 optmem_max
大小为 64KB,rmem_max
和 wmem_max
(发送和接收缓冲区)大小为 16MB。
- What are the ramifications of making this really large?
更多的内核内存可以分配给每个连接的套接字,而且可能是不必要的。
- Aside from /etc/sysctl.conf, where is this set in the kernel by default? I grepped the kernel, but I could find no trace of the default value of optmem_max being set to 20480 which is the default on our system.
我不是 Linux 内核源码爱好者,但它看起来可能在 net/core/sock.c:318 中.
希望对您有所帮助。
关于c - 在 Linux 中,如何确定 optmem_max 的最佳值?,我们在Stack Overflow上找到一个类似的问题: c - In Linux, how do I determine optimal value of optmem_max? - Stack Overflow