Has*_*yed 4 c++ sockets network-programming boost-asio
我将在我的服务器应用程序中创建x个线程.x将是计算机上的核心数量,这些线程将是(非超线程)核心绑定.自然地,通过这种方案,我希望在线程之间分配传入连接,目的是确保一旦将连接分配给线程,它将仅在该特定线程之外提供.这是如何在boost :: asio中实现的?
我在想:一个socket绑定到多个共享的地址io_service,每个线程都有自己的地址io_service.这种推理是否正确?
编辑:看起来我将不得不自己回答这个问题.
是的,你的推理基本上是正确的.您将为每个核心创建一个线程,为每个线程创建一个io_service实例,并在每个线程中调用io_service.run().
然而,问题是你是否真的这样做.这些是我看到的问题:
您可以最终使用非常繁忙的内核和空闲内核,具体取决于您的连接中的工作平衡方式.针对内核中缓存命中的微优化可能意味着当"最佳"内核尚未就绪时,您最终失去了使空闲内核工作的能力.
在套接字速度(即:慢)下,您将从CPU缓存命中获得多少胜利?如果一个连接需要足够的CPU来保持核心繁忙,并且你只需要连接核心数量,那就太好了.否则,无法移动处理工作负载的变化可能会破坏从缓存命中获得的任何胜利.如果你在每个线程中做了很多不同的工作,那么缓存也不会那么热.
如果您正在进行I/O,则无论如何,缓存获胜可能不会那么大.取决于您的实际工作量.
我的建议是拥有一个io_service实例,并在每个核心的一个线程中调用io_service.run().如果性能不足或连接类别,每个连接有大量CPU,并且您可以获得缓存获胜,请将它们移动到特定的io_service实例.
在这种情况下,您应该进行性能分析,以查看缓存未命中对您造成的损失,以及在何处.
| 归档时间: |
|
| 查看次数: |
1801 次 |
| 最近记录: |