Linux — убедитесь, что ядро ​​сохранено исключительно для критических задач

У меня есть процесс, который запускается на компьютере под управлением Linux с ровно двумя ядрами.

Давайте предположим, что мой процесс — единственный процесс в системе (я буду игнорировать другие процессы и даже системные).

Мой процесс разделен на две части:

  1. Критический код производительности
  2. Код с низким приоритетом

Также давайте предположим, что мой основной процесс был запущен на Core 0, и я хочу исключительно зарезервировать Core 1 для кода критической производительности.

Я хотел бы разделить вопрос на два:

  1. Как я могу удостовериться что каждый поток в моем процессе (включая сторонние библиотеки, с которыми я связал свой код, который может вызывать pthread_create и т. д.) всегда будет открывать новые потоки в Core 0?

  2. Как я могу написать тестовое задание что может проверить, что Core 1 не делает абсолютно ничего, кроме критического пути производительности?

Я знаком с такими API, как:

pthread_setaffinity_np

это может установить конкретную привязку к потоку, но я хочу знать, есть ли более низкоуровневый способ убедиться, что даже потоки, созданные сторонними библиотеками (изнутри процесса), также будут прикреплены к Core 0.

Возможно, я могу установить дефолт сходство процесса с Core 0 и с конкретным потоком — прикрепить его к Core 1?

3

Решение

Вы уже описали решение, которое вы хотите:

Возможно, я могу установить сходство по умолчанию для процесса, равного Core 0, а для определенного потока — прикрепить его к Core 1?

Но, возможно, вопрос в том, что вы не уверены, как этого добиться.

Linux предоставляет sched_setaffinity установить сродство текущего процесса.

Чтобы заставить вновь созданные потоки работать на определенном ядре, самый простой способ — это инициализировать pthread_attr_t, и установить желаемое сродство ядра с pthread_attr_setaffinity_np.

1

Другие решения

Одним из решений является установка (если у вас его еще нет) и запуск утилиты Cpuset. Подробности можно найти Вот

0

По вопросам рекламы [email protected]