gpt4 book ai didi

c++ - boost::asio:线程本地异步事件

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:32:50 32 4
gpt4 key购买 nike

我将在我的服务器应用程序中创建 x 个线程。 x 将是机器上的内核数量,这些线程将是(非超线程)内核绑定(bind)的。自然地,对于这个方案,我想跨线程分配传入连接,目的是确保一旦将连接分配给线程,它只会从该特定线程中得到服务。这是如何在 boost::asio 中实现的?

我在想:单个 socket 绑定(bind)到由多个 io_service 共享的地址,其中每个线程都有自己的 io_service。这种推理是否正确?

编辑:看来我得自己回答这个问题了。

最佳答案

是的,你的推理基本正确。您将为每个核心创建一个线程,为每个线程创建一个 io_service 实例,并在每个线程中调用 io_service.run()。

但是,问题在于您是否真的会那样做。这些是我看到的问题:

  • 您最终可能会遇到非常繁忙的核心和空闲的核心,具体取决于连接之间的工作平衡方式。对内核中的缓存命中进行微优化可能意味着当“最佳”内核未准备就绪时,您最终将失去让空闲内核工作的能力。

  • 在套接字速度(即:慢)下,CPU 高速缓存命中率有多少优势?如果一个连接需要足够的 CPU 来保持核心繁忙,而您只建立与核心一样多的连接,那就太好了。否则,无法移动工作来处理工作负载的变化可能会破坏您从缓存命中中获得的任何胜利。如果您在每个线程中执行大量不同的工作,缓存也不会变得那么热。

  • 如果您只是进行 I/O,无论如何,缓存赢利可能不会那么大。取决于您的实际工作量。

我的建议是拥有一个 io_service 实例并在每个内核的线程中调用 io_service.run()。如果您的性能不足或连接类别中每个连接占用大量 CPU,并且您可以获得缓存,请将它们移动到特定的 io_service 实例。

在这种情况下,您应该进行分析以了解有多少缓存未命中以及在何处造成的损失。

关于c++ - boost::asio:线程本地异步事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2325043/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com