c++ - 带有 boost::asio 的 TCP 服务器,线程池的可扩展性与无堆栈协程

标签 c++ multithreading boost boost-asio coroutine

我正在构建一个基于 TCP 的守护进程,用于对 HTTP 请求进行预处理/后处理。客户端将连接到 Apache HTTPD(或 IIS),自定义 Apache/IIS 模块将请求转发到我的 TCP 守护程序以进行进一步处理。我的守护进程需要扩展(但不是扩展)以处理大量流量,而且大多数请求都是小而短暂的。守护进程将使用 C++ 构建,并且必须是跨平台的。

我目前正在研究 boost asio 库,它看起来很适合。但是,我无法理解无堆栈协程与线程池模式的优点。具体来说,我在这里查看 HTTP 服务器示例 #3 和 HTTP 服务器示例 #4:http://www.boost.org/doc/libs/1_49_0/doc/html/boost_asio/examples.html

尽管我进行了所有谷歌搜索,但我无法完全理解无堆栈协程服务器的优点,以及它在多核系统上相对于线程池服务器的表现如何。

根据我的要求,两者中哪一个最合适,为什么?请随时“简化”您关于无堆栈协同程序想法的答案,我在这里仍然处于不稳定状态。谢谢!

编辑:讨论的另一个随机想法/问题: Boost HTTP 服务器示例 #4 被描述为“使用无堆栈协程实现的单线程 HTTP 服务器”。好的,所以它完全是单线程的(对吗?即使在父进程“ fork ”给子进程之后?参见示例 #4 中的 server.cpp)...单线程会成为多核系统的瓶颈吗?我假设任何阻塞操作都会阻止所有其他请求的执行。如果确实如此,为了最大化吞吐量,我正在考虑一个基于协程的接收数据异步事件,一个用于我的内部阻塞任务的线程池(以利用多核),然后是一个异步发送和关闭连接机制。同样,可扩展性至关重要。有什么想法吗?

最佳答案

我最近研究了 boost.asio 在多核机器上的可扩展性。到目前为止的主要结论是它确实引入了开销、锁争用和额外的上下文切换(至少在 Linux 上),请参阅我关于这些主题的一些博客文章:

我还在 asio 邮件列表上发起了一个话题来检查我没有遗漏任何明显的东西,请参阅 http://comments.gmane.org/gmane.comp.lib.boost.asio.user/5133

如果您主要关心的是性能和可扩展性,那么恐怕没有明确的答案 - 您可能需要做一些原型(prototype)设计并查看性能。

如果您有任何阻塞操作,那么您肯定会希望使用多线程 - 另一方面,上下文切换和锁争用会降低多线程的性能(至少您必须非常小心)。

编辑:只是为了澄清无堆栈协程的东西:它本质上只是一些语法糖,使异步 API 看起来更像顺序/阻塞调用。

关于c++ - 带有 boost::asio 的 TCP 服务器,线程池的可扩展性与无堆栈协程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10553761/

相关文章:

c++ - QSyntaxHighlighter 和多行注释

c++ - 父类上的方法没有被覆盖

Java - 不在多线程程序中循环

c++ - 我可以使用 Boost::program_options 将可猜测和不可猜测的选项一起解析吗?

c++ - 帮助 boost 语法

c++ - 我想我已经重写了一个虚拟方法,但我仍然得到 : "X must implement the inherited pure virtual method Y"

c++ - 在 C++ 模板中省略参数

c++ - 一次处理许多流操作

c# - Monitor.Enter 与 Monitor.Wait

c++ - Boost IOStream 创建 zip 文件的示例?