使用线程池提升 asio 多线程 tcp 服务器
boost asio multithreaded tcp server with thread pool
我有一个使用 boost asio 编写的单线程异步 tcp 服务器。每个传入请求都会经过几个处理步骤(同步和异步),最后使用异步写入发回响应。
对于具有 10 个并发请求的小负载,它工作得很好。然而,当我使用 100 的并行度进行测试时,情况开始恶化。随着时间的推移,响应延迟开始增加。所以,我想尝试一些多线程处理来处理请求。
我正在寻找一个不错的例子/帮助创建和 运行 为客户端异步 reading/writing 设置多个线程。我有以下疑惑:
- 我应该使用单个 IOS 对象并在线程池的所有线程中调用其 运行 方法,还是应该为每个线程使用单独的 IOS?
- 如果我使用单个IOS,是否有可能部分tcp数据进入一个线程,而另一部分进入另一个线程等等。这种理解是否正确?
- 还有其他更好的方法吗?
在此感谢您的帮助和指点。
没有看到你的代码,我只能猜测哪里出了问题。您很可能 运行 在异步完成处理程序中进行了长时间的操作。完成处理程序应该很快 - 获取数据,将其交给进一步处理,完成。
作为首要任务,我会 full-asynchronous 和 运行 在线程池中进行所有处理。您可以找到一个示例 here,其中为每个新客户端启动一个新线程,您可以将其替换为线程池。
使用单个 io_service
。一个 io_service
可以处理 很多 的并行性,前提是 你 不要在完成处理程序中延迟它。这简化了实现,因为您不必担心并行完成处理程序 运行,如果您在多个线程中 运行 多个 IOS,就会发生这种情况。
Q1: 我应该使用单个 IOS 对象并在线程池的所有线程中调用它的 运行 方法,还是应该使用单独的 IOS 每个线程?
你可以
- HTTP Server 2 - IOS 每个线程
- HTTP Server 3 - 单线程池IOS
Q2:如果我使用单个IOS,是否有可能部分tcp数据进入一个线程,而另一部分进入另一个线程等等。这个理解对吗?
是的,存在竞争条件,但是boost.asio支持strand来避免它。
Q3:还有其他更好的方法吗?
对我来说,没有找到更好的方法,如果你找到了,告诉我或者过去这里,谢谢。
顺便说一句,正如@rustyx 所说,您的程序在同步调用时被阻塞,转向 full-asynchronous 调用会有所帮助。
我有一个使用 boost asio 编写的单线程异步 tcp 服务器。每个传入请求都会经过几个处理步骤(同步和异步),最后使用异步写入发回响应。
对于具有 10 个并发请求的小负载,它工作得很好。然而,当我使用 100 的并行度进行测试时,情况开始恶化。随着时间的推移,响应延迟开始增加。所以,我想尝试一些多线程处理来处理请求。
我正在寻找一个不错的例子/帮助创建和 运行 为客户端异步 reading/writing 设置多个线程。我有以下疑惑:
- 我应该使用单个 IOS 对象并在线程池的所有线程中调用其 运行 方法,还是应该为每个线程使用单独的 IOS?
- 如果我使用单个IOS,是否有可能部分tcp数据进入一个线程,而另一部分进入另一个线程等等。这种理解是否正确?
- 还有其他更好的方法吗?
在此感谢您的帮助和指点。
没有看到你的代码,我只能猜测哪里出了问题。您很可能 运行 在异步完成处理程序中进行了长时间的操作。完成处理程序应该很快 - 获取数据,将其交给进一步处理,完成。
作为首要任务,我会 full-asynchronous 和 运行 在线程池中进行所有处理。您可以找到一个示例 here,其中为每个新客户端启动一个新线程,您可以将其替换为线程池。
使用单个 io_service
。一个 io_service
可以处理 很多 的并行性,前提是 你 不要在完成处理程序中延迟它。这简化了实现,因为您不必担心并行完成处理程序 运行,如果您在多个线程中 运行 多个 IOS,就会发生这种情况。
Q1: 我应该使用单个 IOS 对象并在线程池的所有线程中调用它的 运行 方法,还是应该使用单独的 IOS 每个线程?
你可以
- HTTP Server 2 - IOS 每个线程
- HTTP Server 3 - 单线程池IOS
Q2:如果我使用单个IOS,是否有可能部分tcp数据进入一个线程,而另一部分进入另一个线程等等。这个理解对吗?
是的,存在竞争条件,但是boost.asio支持strand来避免它。
Q3:还有其他更好的方法吗?
对我来说,没有找到更好的方法,如果你找到了,告诉我或者过去这里,谢谢。
顺便说一句,正如@rustyx 所说,您的程序在同步调用时被阻塞,转向 full-asynchronous 调用会有所帮助。