2013-02-17 2 views
14

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

Вот 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.

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

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

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

ответ

15

Не волнуйтесь! Ваше замешательство - не что иное, как ожидаемое. Прерывания таймера 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

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

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

+1

Если я делаю 'cat/proc/interrupts' 2 раза, я вижу, что« прерывания локального таймера »увеличиваются между первым и вторым вызовом. Но тот, который помечен как таймер «IO-APIC-edge», остается неизменным между двумя вызовами. Итак, на каждом процессоре работают «прерывания локального таймера», которые увеличивают глобальную таймерную переменную 'jiffies', которая в основном записывает количество тиков с момента загрузки? Также 'IRQ 0' соответствует прерыванию таймера в 1-й строке' cat/proc/interrupts' ... поэтому я думаю, что у меня есть «система без ключа». Кстати очень четкое объяснение ... спасибо – Deepthought

+0

Не беспокойтесь APIC ввода-вывода, прерывания локального таймера фактически исходят от Local APIC, что совсем другое. То, что вы видите как IRQ 0, является таймером APIC ввода-вывода, который, вероятно, не используется (за исключением, может быть, во время загрузки). Вы правильно говорите, что локальный таймер прерывает приращение jiffies. – jleahy

+0

Эй, я читаю abt timer из этой книги, называемой профессиональной архитектурой ядра Linux, и немного понимаю ядро ​​Linux, но я, очевидно, не понимаю процесс ... Я должен попробовать и изменить код, который обновляет jiffies эффективным образом ... Можете ли вы порекомендовать хороший источник, где я могу понять не только теорию, но и код в ядре, который выполняет эту работу .... Спасибо – Deepthought

Смежные вопросы