У меня есть процесс, который запускается на компьютере под управлением Linux с ровно двумя ядрами.
Давайте предположим, что мой процесс — единственный процесс в системе (я буду игнорировать другие процессы и даже системные).
Мой процесс разделен на две части:
Также давайте предположим, что мой основной процесс был запущен на Core 0, и я хочу исключительно зарезервировать Core 1 для кода критической производительности.
Я хотел бы разделить вопрос на два:
Как я могу удостовериться что каждый поток в моем процессе (включая сторонние библиотеки, с которыми я связал свой код, который может вызывать pthread_create и т. д.) всегда будет открывать новые потоки в Core 0?
Как я могу написать тестовое задание что может проверить, что Core 1 не делает абсолютно ничего, кроме критического пути производительности?
Я знаком с такими API, как:
pthread_setaffinity_np
это может установить конкретную привязку к потоку, но я хочу знать, есть ли более низкоуровневый способ убедиться, что даже потоки, созданные сторонними библиотеками (изнутри процесса), также будут прикреплены к Core 0.
Возможно, я могу установить дефолт сходство процесса с Core 0 и с конкретным потоком — прикрепить его к Core 1?
Вы уже описали решение, которое вы хотите:
Возможно, я могу установить сходство по умолчанию для процесса, равного Core 0, а для определенного потока — прикрепить его к Core 1?
Но, возможно, вопрос в том, что вы не уверены, как этого добиться.
Linux предоставляет sched_setaffinity
установить сродство текущего процесса.
Чтобы заставить вновь созданные потоки работать на определенном ядре, самый простой способ — это инициализировать pthread_attr_t
, и установить желаемое сродство ядра с pthread_attr_setaffinity_np
.
Одним из решений является установка (если у вас его еще нет) и запуск утилиты Cpuset. Подробности можно найти Вот