c/c++语言开发共享C:epoll和multithreading

我需要创建专门的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

      (0)
      上一篇 2021年12月13日
      下一篇 2021年12月13日

      精彩推荐