@Eddik

Как убрать IRQ системного таймера для потока приложения или ядра CPU?

Здравствуйте. Есть есть поток, который добровольно не отдает управление ЦП и не должен. Вот статистика за 18 часов работы


voluntary_ctxt_switches: 6
nonvoluntary_ctxt_switches: 68267288


Проблема в том, что системный таймер присылает прерывание LOC (Local timer interrupts) 1000 раз в секунду, убивая тем самым производительность потока и создавая нехилый джиттер. Я бы не хотел манипулировать таймером вообще, или собирать ядро со специальными опциями, потому что не уверен что это не отразится на бизнес логике приложения в других местах. Можно ли как то запретить LOC прерывания для конкретного потока или для конкретного CPU в системе? (поток всегда прибивается к CPU)
  • Вопрос задан
  • 462 просмотра
Решения вопроса 1
jcmvbkbc
@jcmvbkbc
"I'm here to consult you" © Dogbert
Есть есть поток, который добровольно не отдает управление ЦП и не должен.
nonvoluntary_ctxt_switches: 68267288

Этого недостаточно. Нужно чтобы кроме этого потока на данном CPU не было других. ctxt switch это переключение с одного потока на другой.

Проблема в том, что системный таймер присылает прерывание LOC (Local timer interrupts) 1000 раз в секунду.

Похоже, что у вас ядро с обычными тиками (не dyntick / tickless). Само таймерное прерывание, однако, не должно заметно влиять на производительность.

Я бы не хотел манипулировать таймером вообще, или собирать ядро со специальными опциями

Думаю, что вариантов без сборки ядра с опцией CONFIG_NO_HZ_FULL нет. Но и в этом случае, чтобы не было nonvoluntary ctxt switch на данном CPU должен быть единственный поток. См. https://www.kernel.org/doc/Documentation/timers/NO...
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы