C:epoll和多线程

Dan*_*iel 12 c architecture high-load epoll

我需要创建专门的HTTP服务器,为此我计划使用epoll sycall,但我想利用多个处理器/核心,我无法提出架构解决方案.ATM我的想法是跟随:用自己的epoll描述符创建多个线程,主线程接受连接并在线程epoll之间分配它们.但有更好的解决方案吗?我可以在高负载架构上阅读哪些书籍/文章/指南?我只看过C10K文章,但大多数链接到例子已经死了:(并且仍然没有关于这个主题的深入书籍:(.

谢谢你的回答.

UPD:请更具体,我需要材料和示例(nginx不是一个例子,因为它太复杂,并且有多个抽象层来支持多个系统).

sle*_*man 12

我的想法是跟随:用自己的epoll描述符创建多个线程,主线程接受连接并在线程epoll之间分配它们.

是的,这是目前最好的方法,它是Nginx如何做到的.可以根据负载和/或机器上的物理核心数量来增加或减少线程数.

额外线程(超过物理内核数量)和事件之间的权衡是延迟和吞吐量之一.线程可以提高延迟,因为它们可以先发制人地执行,但是由于上下文切换和线程创建/删除引起的开销而导致吞吐量损失.事件提高了吞吐量,但缺点是长时间运行的代码会导致整个线程停止.

第二个最好的是Apache2如何使用阻塞线程的线程池来完成它.这里没有事件处理,所以实现更简单,池意味着线程不会被不必要地创建和销毁,但它不能真正与你正在尝试实现或Nginx实现的良好实现的线程/异步混合竞争.

第三个是单独的异步事件处理,如Lighttpd或Node.js. 嗯,如果您没有在服务器中进行繁重的处理,那么它是第二好的.但如前所述,单个长时间运行的while循环会阻塞整个服务器.


Jav*_*ier 11

检查libeventlibev来源.它们具有高可读性,并且已经是一个很好的基础设施.

另外,libev的文档中有很多尝试和真实策略的例子.即使您更喜欢直接写epoll(),但这些示例可以带来一些见解.