[英]C: epoll and multithreading
我需要创建专门的HTTP服务器,为此我计划使用epoll sycall,但我想利用多个处理器/核心,我无法提出架构解决方案。 ATM我的想法是跟随:用自己的epoll描述符创建多个线程,主线程接受连接并在线程epoll之间分配它们。 但有更好的解决方案吗? 我可以在高负载架构上阅读哪些书籍/文章/指南? 我只看过C10K文章,但大多数链接到例子已经死了:(并且仍然没有关于这个主题的深入书籍:(。
谢谢你的回答。
UPD:请更具体,我需要材料和示例(nginx不是一个例子,因为它太复杂,并且有多个抽象层来支持多个系统)。
我的想法是跟随:用自己的epoll描述符创建多个线程,主线程接受连接并在线程epoll之间分配它们。
是的,这是目前最好的方法,它是Nginx如何做到的。 可以根据负载和/或机器上的物理核心数量来增加或减少线程数。
额外线程(超过物理内核数量)和事件之间的权衡是延迟和吞吐量之一。 线程可以提高延迟,因为它们可以先发制人地执行,但是由于上下文切换和线程创建/删除引起的开销而导致吞吐量损失。 事件提高了吞吐量,但缺点是长时间运行的代码会导致整个线程停止。
第二个最好的是Apache2如何使用阻塞线程的线程池来完成它。 这里没有事件处理,所以实现更简单,池意味着线程不会被不必要地创建和销毁,但它不能真正与你正在尝试实现或Nginx实现的良好实现的线程/异步混合竞争。
第三个是单独的异步事件处理,如Lighttpd或Node.js. 嗯,如果您没有在服务器中进行繁重的处理,那么它是第二好的。 但如前所述,单个长时间运行的while循环会阻塞整个服务器。
除非您有太比特上行链路并且计划在单个服务器上同时为10000个连接提供服务,否则请忘记epoll
。 这只是无偿的不可移植性; poll
甚至select
也一样。 请记住,在太比特上行链路等标准时,您的服务器也将足够快,您仍然不需要epoll
。
如果您只是提供静态内容,请忘记线程并使用Linux sendfile
系统调用。 这也是非标准的,但至少它提供了巨大的实际性能优势。
另请注意,其他设计决策(尤其是过多的复杂性)将更多地影响服务器可以处理的负载量。 举个例子,看看适度的单线程,单进程thttpd
如何在静态内容上吹嘘Apache和朋友的表现 - 根据我的经验,即使是传统的cgi动态内容!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.