Как NOHZ = On влияет на do_timer в ядре Linux - PullRequest
19 голосов
/ 19 марта 2012

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

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

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

Функция NOHZ отключает таймеры высокого разрешения в системе.

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

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

1 Ответ

34 голосов
/ 19 марта 2012

Сначала давайте разберемся, что такое 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 работает довольно хорошо.

По словам Инго Молнара

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

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

Я не могу понять, как таймеры высокого разрешения могут влиять на do_timer?

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

Даже если оборудование высокого разрешения находится в спящем режиме, постоянные часы более чем способны выполнить do_timerкаждые 10 мс

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

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

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

Почему do_timer пропускает свои сроки?

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

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

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

.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...