监听系统调用中的backlog值

10

我对listen系统调用中的backlog值有疑问。根据listen系统调用的man页面:

如果backlog参数大于/proc/sys/net/core/somaxconn中的值,则会被静默截断为该值;此文件中的默认值为128。

这意味着我的服务器一次只能接受小于128个连接。如果我想要接受更多的连接,比如大于128个,我应该怎么做?我可以简单地将该值设置为可能的最大数字,以便我可以访问更多的连接吗?

3个回答

9

这个数字只是“连接队列”的大小,新的连接会在这里等待被接受。一旦你的应用程序调用了accept(),一个等待的连接就会从队列中移除。因此,你绝对可以处理超过128个同时连接,因为它们通常只在队列中停留很短的时间。


@Greg - 所以积压值仅表示连接队列的大小,而不是要接受的连接数量。一旦接受完成,它将从队列中移除,为其他连接提供空间。 - codingfreak

4

是的。使用像以下这样的命令:

$ echo 1000 >/proc/sys/net/core/somaxconn

要将限制设置得更高。例如,有关更多调优提示,请参见此页面

这似乎非常简单和直接。但是将积压值增加到最大值确实会增加内核中用于侦听队列的内存分配。是否有称为合理值的东西,它不会增加开销并提供更好的性能? - codingfreak
4
嗯...通常存储东西需要内存。如果您需要更大的缓冲区,但不想花费额外的内存来存储它...恐怕我不确定还能做什么。 - unwind

1

待处理队列的值并不是最大连接数,而是未处理连接的数量,即您尚未accept()的连接。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接