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

时间:2017-12-08 23:53:00

标签: c linux linux-kernel network-programming

我们有一个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的痕迹,这是我们系统的默认值。

1 个答案:

答案 0 :(得分:2)

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

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

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

  
      
  1. 为什么在大多数Linux发行版中默认它如此低,如果大大提高性能呢?
  2.   

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

一个20KB的缓冲区已经足够大了#34;大多数"它最大限度地减少了默认所需的内核内存,也很容易配置,以便在需要时可以这样做。

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

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

  
      
  1. 使这个真的很大的后果是什么?
  2.   

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

  
      
  1. 除了/etc/sysctl.conf之外,默认情况下在内核中设置了什么?我抓住了内核,但是我找不到将optmem_max的默认值设置为20480的痕迹,这是我们系统的默认值。
  2.   

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

希望可以提供帮助。