【问题标题】:programatically evaluating the value of somaxconn, to set the listen backlog parameter以编程方式评估 somaxconn 的值,以设置监听积压参数
【发布时间】:2010-11-14 23:24:44
【问题描述】:

对于服务器端编程,我使用监听函数:

int listen(int sockfd, int backlog); 

我了解积压工作应小于或等于在我将运行我的服务器程序的主机系统上设置的 somaxconn。 如果我使用 SOMAXCONN 作为 backlog,则相当于将其硬编码为 SOMAXCONN 的值,通常在 tcp.h 中定义为 128。

不过,somaxconn 是一个可调的 sysctl 参数,可以通过改变 /proc/sys/net/core/somaxconn 的值或使用 sysctl 修改 net.core.somaxconn 来修改

人们通常会修改 somaxconn 以获得更好的系统性能。 我希望我的程序能够在程序启动时评估系统的 somaxconn。

我可以打开文件 /proc/sys/net/core/somaxconn 并读取包含的值,但这似乎是一种不优雅的处理方式,特别是因为我认为 somaxconn 的文件路径可能会有所不同,具体取决于发行版。

是否有允许在 c/c++ 中评估 somaxconn 的 API 或示例代码?

如果我遗漏了一些关键点,导致思维有缺陷,请告诉我。

我也想将我的应用程序移植到 Windows,因此 Windows 程序员可能也有一些有用的见解要分享!

在此先感谢所有黑客。

【问题讨论】:

  • 在windows上,这里msdn.microsoft.com/en-us/library/windows/desktop/ms739168.aspx记录为“如果设置为SOMAXCONN,负责socket的底层服务提供商会将积压设置为最大合理值。没有标准规定来获取实际积压值”。所以使用这个特殊值并忘记它。在 windows SDK 中,winsock2.h 将 SOMAXCONN 定义为 0x7fffffff,这确实是一个特殊的值。不要传递其他任何东西

标签: c++ sockets tcp tcplistener


【解决方案1】:

根据您的平台,带有 kern.ipc.somaxconn 的 sysctl() 可能是您正在寻找的。​​p>

但是,如果我正确理解您的问题,您的目标是始终使用最大可能的积压工作。据我了解,传递给 listen() 的积压值将被默默地限制为系统配置的限制。因此,您的解决方案可能是简单地调用具有“非常大”积压值的 listen()。

【讨论】:

  • 然后是 GOOGLE 服务器,例如如果它们在 Linux 上运行,则具有相同的积压值 128 ??
  • @codingfreak:不确定我理解你的意思。正如 mdk 在其问题中所述,somaxconn 是一个可调参数。 128 不是硬限制,只是 SOMAXCONN 在 tcp.h 中“通常”#defined 为 128。此值不一定反映系统的价值。
  • 不要将 backlog 设置为大于 net.core.somaxconn 的值,至少在 linux 上,因为它似乎没有按照手册页所说的截断该值。我花了一整天的时间试图找出为什么我的系统总是在快速打开许多连接的基准上停滞不前。一旦我将积压值降低到 (somaxconn-1),问题就消失了。
猜你喜欢
  • 1970-01-01
  • 2020-02-26
  • 1970-01-01
  • 2021-08-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-14
  • 2017-05-17
相关资源
最近更新 更多