Уменьшение частоты таймера ядра Linux - программирование
Подтвердить что ты не робот

Уменьшение частоты таймера ядра Linux

Когда я запускаю свою виртуальную машину с Gentoo в качестве гостя, я обнаружил, что из tick_periodic есть значительные накладные расходы. (Это функция, которая выполняется при каждом прерывании таймера.) Эта функция обновляет глобальный jiffy с помощью write_seqlocks, что приводит к накладным расходам.

Здесь содержится grep HZ и соответствующий материал в файле конфигурации ядра.

[email protected]:~$ cat /boot/config | egrep 'HZ|TIME'

# CONFIG_RCU_FAST_NO_HZ is not set
CONFIG_NO_HZ=y
# CONFIG_HZ_100 is not set
# CONFIG_HZ_250 is not set
# CONFIG_HZ_300 is not set
CONFIG_HZ_1000=y
CONFIG_HZ=1000
# CONFIG_MACHZ_WDT is not set
CONFIG_TIMERFD=y
CONFIG_HIGH_RES_TIMERS=y
CONFIG_X86_CYCLONE_TIMER=y
CONFIG_HPET_TIMER=y

Ясно, что он установил конфигурацию в 1000, но когда я делаю sysconf(_SC_CLK_TCK), я получаю 100 в качестве частоты таймера. Итак, какова частота моего системного таймера?

Что я хочу сделать, так это снизить частоту до 100, даже если это возможно. Хотя это может повлиять на интерактивность и точность сегмента времени poll/select и планировщика, я готов пожертвовать этими вещами для меньшего прерывания таймера, так как это ускорит работу виртуальной машины.

Когда я попытался выяснить, что нужно сделать, я прочитал в некотором месте, что вы можете сделать это, изменив конфигурационный файл, еще где я прочитал, что добавление divider = 10 к параметру загрузки выполняет задание, иначе Я читал, что ничто из этого не требуется, если вы можете установить CONFIG_HIGH_RES_TIMERS на слабые таймеры с малой задержкой, даже не увеличивая частоту таймера, и это возможно с помощью системы без тэгов CONFIG_NO_HZ.

Я очень запутался в правильном подходе.

Все, что я хочу, - это максимально сократить прерывание таймера.

Могу ли я знать правильный способ сделать это?

4b9b3361

Ответ 1

Не волнуйся! Ваше замешательство - не что иное, как ожидаемое. Прерывания таймера Linux очень сбивают с толку и имеют долгую и довольно захватывающую историю.

CLK_TCK

Linux не имеет системного вызова sysconf, а glibc просто возвращает значение 100. Извините.

HZ < - что вы, вероятно, хотите

При настройке ядра вы можете выбрать частоту таймера 100 Гц, 250 Гц, 300 Гц или 1000 Гц. Все они поддерживаются, и хотя 1000 Гц по умолчанию не всегда лучше.

Люди обычно выбирают высокое значение, когда они оценивают задержку (рабочий стол или веб-сервер) и низкое значение, когда они оценивают пропускную способность (HPC).

CONFIG_HIGH_RES_TIMERS

Это не имеет никакого отношения к прерываниям таймера, это просто механизм, который позволяет вам иметь таймеры с более высоким разрешением. Это в основном означает, что тайм-ауты при вызовах типа select могут быть более точными, чем 1/HZ секунды.

делитель

Этот параметр командной строки является патчем от Red Hat. Вероятно, вы можете использовать это (если вы используете Red Hat или CentOS), но я буду осторожен. Это вызвало множество ошибок, и вы, вероятно, должны просто перекомпилировать с другим значением Hz.

CONFIG_NO_HZ

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

Фредерик Вайсбеккер на самом деле имеет исправление, которое обобщает это на случаи, когда выполняется только одна задача, но это еще немного.