Как seastar вызывает коды на разных процессорах? - PullRequest
1 голос
/ 09 января 2020

В настоящее время я работаю со структурой seastart и считаю, что seastart может отправлять задачи другому процессору.

Seastar утверждает, что он ничего не разделяет между разными слоями.

enter image description here

Так что я думаю, что seastar связывает разные потоки rnet с разными процессорами и создайте различные задачи для различных фоновых потоков (так называемый движок 、 контейнер или что-то в этом роде).

Как seastar достигает этого, используйте pthread_setaffinity_np?

Но перед отправкой задачи коды все еще работают на случайная тема? Просто ключевые ресурсы, такие как сетевой сокет или хранилища, распределяются по различным процессорам путем кодирования с использованием явного smp::submit_to?

1 Ответ

1 голос
/ 09 января 2020

Я никогда не слышал о Seastar до сих пор, и картина выглядит ужасно неэффективной. Как подтверждают отметки . Гораздо эффективнее иметь один стек на поток, так как его верхняя часть всегда «горячая» (кэшируется в L1).

В любом случае, да, для закрепления потока на ядре, которое вы можете использовать спецификация платформы c 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);
...