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

我正在使用epoll(边缘触发)和线程的线程networking服务器上工作,我使用httperf来testing我的服务器。

到目前为止,它的性能performance非常好,或者接近发送请求的速度。 直到1024屏障,一切都减慢到大约30个请求/秒。

在Ubuntu 9.04 64位上运行。

我已经试过了:

  • 增加文件描述符的ulimit数量,成功。 它不会改善超过1024个并发连接的性能。

    andri @ filefridge:〜/ Dropbox / School / Group 452 /代码/服务器$ ulimit -n
    20000

我很肯定,这个缓慢发生在操作系统发生事件发送到epoll之前(是的,我也增加了epoll的限制)。

我需要testing一下我的程序可以处理多less个并发连接,直到它开始变慢(没有操作系统的干扰)。

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

这个限制可能是有原因的,但是为了基准的目的,我需要它。

更新

感谢所有的答案,但我认为我find了罪魁祸首。 在我的程序中重新定义了__FD_SETSIZE之后,所有东西都开始移动了很多。 当然ulimit也需要提出,但是没有__FD_SETSIZE我的程序永远不会利用它。

感谢所有的答案,但我认为我找到了罪魁祸首。 在我的程序中重新定义了__FD_SETSIZE之后,所有东西都开始移动了很多。 当然ulimit也需要提出,但是没有__FD_SETSIZE我的程序永远不会利用它。

请参阅C10K问题页面。 深入讨论如何实现“同时连接”的目标,同时保持高性能,为每个客户服务。

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

只是不要。

是的,我的意思是。

如果你需要增加文件描述符,你的代码中会有一个隐藏的错误。 狩猎而不是治疗其症状。 请记住在完成后关闭文件描述符。