处理超过1024个文件描述符,在Linux上的C语言中

时间:2009-05-11 15:43:41

标签: c linux multithreading networking

我正在使用epoll(边缘触发)和线程的线程网络服务器,我正在使用httperf来对我的服务器进行基准测试。

到目前为止,它的表现非常好或几乎完全符合请求的发送速度。直到1024障碍,一切都减慢到大约30个请求/秒。

在64位Ubuntu 9.04上运行。

我已经尝试过了:

  • 成功增加文件描述符的ulimit数。它只是没有提高1024个并发连接以上的性能。
      

    andri @ filefridge:〜/ Dropbox / School / Group 452 / Code / server $ ulimit -n
      20000

我很确定在事件发送到epoll之前发生在操作系统中的这种减速(是的,我也增加了epoll的限制)。

我需要对程序可以处理的并发连接数进行基准测试,直到它开始变慢(没有操作系统干扰)。

如何让我的程序运行超过1024个文件描述符?

这个限制可能是有原因的,但出于基准测试的目的,我需要它。

更新

感谢您的所有答案,但我认为我找到了罪魁祸首。在我的程序中重新定义__FD_SETSIZE后,一切开始变得更快。当然ulimit也需要提升,但没有__FD_SETSIZE,我的程序从不利用它。

3 个答案:

答案 0 :(得分:6)

感谢您的所有答案,但我认为我找到了罪魁祸首。在我的程序中重新定义__FD_SETSIZE后,一切开始变得更快。当然ulimit也需要提升,但没有__FD_SETSIZE,我的程序从不利用它。

答案 1 :(得分:4)

请参阅the C10K problem页面。它包含有关如何实现“10000个并发连接”目标的深入讨论,同时保持高性能并管理为每个客户提供服务。

它还包含有关在一次处理大量连接时如何提高内核性能的信息。

答案 2 :(得分:-5)

请不要。

是的,我的意思是。

如果您需要增加文件描述符,则代码中存在隐藏的错误。追捕它而不是治疗它的症状。记得在完成后关闭文件描述符。