繁体   English   中英

C:epoll和多线程

[英]C: epoll and multithreading

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

谢谢你的回答。

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

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

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

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

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

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

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

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

除非您有太比特上行链路并且计划在单个服务器上同时为10000个连接提供服务,否则请忘记epoll 这只是无偿的不可移植性; poll甚至select也一样。 请记住,在太比特上行链路等标准时,您的服务器也将足够快,您仍然不需要epoll

如果您只是提供静态内容,请忘记线程并使用Linux sendfile系统调用。 这也是非标准的,但至少它提供了巨大的实际性能优势。

另请注意,其他设计决策(尤其是过多的复杂性)将更多地影响服务器可以处理的负载量。 举个例子,看看适度的单线程,单进程thttpd如何在静态内容上吹嘘Apache和朋友的表现 - 根据我的经验,即使是传统的cgi动态内容!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM