3

我正在开发一个高性能 tcp 服务器的项目,我决定使用 epoll 和多线程。但是我在设计服务器时发现很难,现在我对这两种设计感到很困惑:

一个调度程序,一些工作人员,调度程序使用 epoll 侦听所有连接并将传入数据分派给工作人员,工作人员不处理任何 IO 事件。

一个监听器,只处理监听事件,当一个新的连接到来时,它接受它并将它分派给一个worker,每个worker都有一个epoll fd然后监听这个新的socket。

女巫一个更好,还是有更好的设计?

谢谢!</p>

4

4 回答 4

4

没有简单的答案。你想要什么类型的服务器?

  1. 许多并行短连接(标准 www)
  2. 许多并行相当长的连接(中小型上传)
  3. 1和2的混合
  4. 很长的重连接(大上传)

您将使用什么服务器(机器)(128 x 弱 cpu/8 x 强大 cpu)?

更通用的是:一个dispatcher,一些worker,dispatcher使用epoll监听所有连接,将传入的数据分派给worker,worker不处理IO事件

于 2012-12-21T08:46:17.030 回答
2

libevent在这里将非常有用。它为解决您的问题而生。构建概念验证,以您期望的最大负载为其提供服务,并测量真正的瓶颈在哪里。然后优化—— “过早优化是万恶之源”

于 2012-12-21T08:59:44.253 回答
2

In general it's very difficult to come up with a high performance architecture that doesn't make too many assumptions about the connections.

I have tried to some work in that area and some information is available at http://nginetd.cmeerw.org

Basically, I am using a single epoll fd (in edge-triggered mode) with a single thread pool. That means that each thread can do any work (accepting new connections, reading data, processing requests, sending replies) and therefore no additional thread context switches are needed. The main challenge with this architecture is to get synchronization just about right so you minimize contention, but still don't get any race conditions.

于 2012-12-21T10:48:52.960 回答
1

关于这个主题的一个很好的资源是C10K 问题

于 2012-12-21T08:19:22.720 回答