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