首页 > 解决方案 > seastar 如何在不同的 cpu 上调用代码?

问题描述

我目前正在使用 seastart 框架,发现它声称 seastart 可以将任务提交到不同的 cpu。

Seastar 声称它在不同的 coers 之间没有任何共享。

在此处输入图像描述

所以我认为seastar将不同的网络线程绑定到不同的cpu,并将不同的任务提交给不同的后台线程(称为引擎、容器或其他东西)。

seastar 如何实现这一点,使用pthread_setaffinity_np

但是在提交任务之前,代码仍然在随机线程上工作吗?只是通过smp::submit_to显式编码将网络套接字或存储等关键资源分配到不同的 cpu?

标签: c++performancec++11smp

解决方案


直到现在我才听说过 Seastar,而且这张照片看起来非常低效。正如基准所证实的那样。每个线程有一个堆栈会更有效,因为堆栈的顶部总是“热”的(缓存在 L1 中)。

无论如何,是的,要将线程固定到核心,您可以使用特定于平台的 API。如果是 POSIX,那将是pthread_setaffinity_np

cpu_set_t cpuset;
CPU_ZERO(&cpuset);
CPU_SET(core, &cpuset); // core number starts from 0
int rc = pthread_setaffinity_np(myThread.native_handle(), (cpu_set_t), &cpuset);

SetThreadAffinityMask在 Windows 上:

DWORD_PTR mask = (DWORD_PTR) (1 << core); // core number starts from 0
auto rc = SetThreadAffinityMask(GetCurrentThread(), mask);

推荐阅读