Как NOHZ = On влияет на do_timer в ядре linux

В простом эксперименте я установил NOHZ=OFF и использовал printk для печати, как часто вызывается функция do_timer. Он вызывается каждые 10 мс на моей машине.

Однако, если NOHZ=ON, тогда существует много джиттера, на который вызывается do_timer. Большую часть времени он звонит каждые 10 мс, но есть моменты, когда он полностью пропускает крайние сроки.

Я исследовал как do_timer, так и NOHZ. do_timer - это функция, ответственная за обновление значения jiffies, а также отвечает за циклическое планирование процессов.

Функция NOHZ отключает таймеры hi-res в системе.

Что я не могу понять, так это то, как таймеры hi-res влияют на do_timer? Даже если аппаратное обеспечение hi-res находится в состоянии ожидания, стойкие часы более чем способны выполнять do_timer каждые 10 мс. Во-вторых, если do_timer не выполняется, когда это необходимо, это означает, что некоторые процессы не получают свой таймшер, когда они в идеале должны его получать. Многие поисковые запросы показывают, что для многих людей многие приложения начинают работать намного лучше, когда NOHZ=OFF.

Короче говоря, как влияет NOHZ=ON на do_timer?
Почему do_timer пропускает свои сроки?

Ответы

Ответ 1

Сначала давайте понять, что такое набор tickless kernel (NOHZ=On или CONFIG_NO_HZ) и какова мотивация его внедрения в ядро ​​Linux из 2.6.17

Из http://www.lesswatts.org/projects/tickless/index.php,

Традиционно ядро ​​Linux использовало периодический таймер для каждого процессора. Этот таймер сделал множество вещей, таких как учет процессов, балансировку нагрузки планировщика и сохранение событий таймера каждого процессора. Старшая Ядра Linux использовали таймер с частотой 100 Гц (100 событий таймера в секунду или одно событие каждые 10 мс), в то время как новые ядра используют 250 Гц (250 событий в секунду или одно событие каждые 4 мс) или 1000 Гц (1000 событий в секунду или одно событие каждые 1 мс).

Это событие периодического таймера часто называют "таймер". Таймер тик прост в своем дизайне, но имеет существенный недостаток: таймер происходит периодически, независимо от состояния процессора, независимо от того, работает он или занят. Если процессор простаивает, он должен проснуться из энергосберегающего состояния сна каждые 1, 4 или 10 миллисекунд. Эта стоит немного энергии, потребляет время автономной работы в ноутбуках и вызывая ненужное энергопотребление на серверах.

С "безрадовым бездействием" ядро ​​Linux устранило это периодическое таймер, когда процессор находится в режиме ожидания. Это позволяет процессору оставаться в энергосберегающие состояния в течение более длительного периода времени, уменьшая общую потребляемая мощность системы.

Таким образом, снижение энергопотребления было одной из основных причин отсутствия явного ядра. Но, как и в большинстве случаев, производительность поражает снижением энергопотребления. Для настольных компьютеров производительность очень важна, поэтому вы видите, что для большинства из них NOHZ=OFF работает очень хорошо.

В Ingo Molnar собственные слова

Функция безъядерного ядра (CONFIG_NO_HZ) включает таймер "по требованию" прерывания: если таймер не истечет, например, 1,5 секунды когда система переходит в режим ожидания, система будет оставаться бездействующей для 1,5 секунды. Это должно принести более холодные процессоры и экономию энергии: на наших тестовых площадках (x86) мы измерили эффективную скорость IRQ, чтобы перейти от HZ до 1-2 таймерных прерываний в секунду.

Теперь попробуйте ответить на ваши запросы -

Что я не могу понять, так это то, как таймеры hi-res влияют на do_timer?

Если система поддерживает таймеры с высоким разрешением, прерывания таймера могут происходить чаще, чем обычные 10ms для большинства систем. i.e эти таймеры пытаются сделать систему более восприимчивой, используя возможности системы и прерывая прерывания таймера еще быстрее, скажем, каждый 100us. Таким образом, с опцией NOHZ, эти таймеры остывают и, следовательно, нижнее выполнение do_timer

Даже если аппаратное обеспечение hi-res находится в состоянии ожидания, постоянное время больше чем способен выполнять do_timer каждые 10 мс

Да, он способен. Но намерение NOHZ в точности противоположно. Чтобы предотвратить частые прерывания таймера!

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

Как caf, отмеченный в комментариях, NOHZ не приводит к тому, что процессы получают запланированные реже, потому что они запускаются только тогда, когда CPU неактивен - другими словами, когда никакие процессы не планируются. Только материал учета процесса будет выполнен с задержкой.

Почему do_timer не хватает сроков?

Как уже было сказано, это предполагаемый дизайн NOHZ

Я предлагаю вам перейти в tick-sched.c источники ядра в качестве отправной точки. Найдите CONFIG_NO_HZ и попытайтесь понять новую функциональность, добавленную для функции NOHZ

Вот один тест, выполненный для измерения Влияние ясного неба