与HTTP服务器共享TBB的线程池是个好主意吗?



我知道这是一个奇怪的问题,但请听我说完。我正在用C++开发一个高吞吐量、计算量大的HTTP后端服务器。这是非常直接的:

  1. 启动HTTP服务器
  2. 收到一些请求
  3. 做很多数学运算
    • 此步骤使用TBB并行化
  4. 将结果发回(大约需要20ms(
  5. 回应的时间没有限制。但最坏的情况越低越好

现在我的瓶颈是的服务器部分使用了与TBB不同的线程池。因此,当TBB忙于做数学时。服务器可能会突然收到几十个新请求,然后来自服务器端的线程被调度,并导致大量缓存丢失和分支预测失败。

我提出的一个解决方案是与服务器共享TBB的线程池。然后,在TBB繁忙时不会注册任何请求,并在TBB空闲后立即进行处理。

这是个好主意吗?或者它可能存在潜在的问题?

如果不知道其他线程池在做什么,很难回答这个问题。如果它处理文件或网络I/O,那么将其与CPU密集型池相结合可能是一种令人讨厌的做法,因为I/O不消耗CPU。

通常情况下,应该有一个小池,甚至可能只有一个线程来处理接受循环和异步I/O,将新请求交给工作池进行处理,并将结果发送回网络。

尽量避免将CPU密集型工作与I/O工作混合在一起,因为这会使资源利用率难以管理。话虽如此,有时它只是更容易,而且无论如何,以100%的CPU运行从来都不是好事。所以,是的,你应该试着只有一个游泳池。但要衡量变更前后的表现。

最新更新