带有epoll的TCP服务器的线程和扩展模型

sel*_*bie 7 sockets linux epoll tcp

我已经阅读了C10K文档以及关于扩展套接字服务器的许多相关文章.所有道路都指向以下内容:

  1. 避免"每个连接的线程"的经典错误.

  2. 优先选择epoll.

  3. 同样,unix中的遗留异步io机制可能很难使用.

我的简单TCP服务器只是在专用端口上侦听侦听套接字上的客户端连接.收到新连接后,解析请求,然后发回响应.然后优雅地关闭套接字.

我想我可以很好地处理如何使用epoll在单个线程上扩展它.只有一个循环调用epoll_wait作为listen套接字以及现有的客户端连接.返回后,代码将处理新的创建新客户端连接以及管理现有连接的状态,具体取决于刚刚发出信号的套接字.也许还有一些逻辑来管理连接超时,正常关闭套接字以及为每个连接分配有效的资源.看起来很简单.

但是如果我想扩展它以利用多个线程和多个cpu内核呢? 想到的核心理念是:

一个专用线程,用于侦听TCP侦听套接字上的传入连接.然后是一组N个线程(或线程池)来处理所有活动的并发客户端连接.然后发明一些线程安全的方法,其中listen线程将"新的连接(套接字)""分派"到一个可用的工作线程.(Windows中的ala IOCP).工作线程将在其处理的所有连接上使用epoll循环来执行单线程方法将执行的操作.

我是在正确的轨道上吗?或者是否有一个标准的设计模式用于在多个线程上使用epoll执行TCP服务器?

关于监听线程如何将新连接分派给线程池的建议?

Bas*_*tch -1

我猜你是在正确的轨道上。但我也认为细节取决于特定情况(带宽、请求模式、单独的请求处理等)。我认为你应该尝试并仔细进行基准测试。