Когда я запускаю свою виртуальную машину с 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
.
Я очень смущен тем, что является правильным подходом.
Все, что я хочу, - это сократить прерывание таймера до минимума.
Могу ли я знать правильный способ сделать это?
Если я делаю 'cat/proc/interrupts' 2 раза, я вижу, что« прерывания локального таймера »увеличиваются между первым и вторым вызовом. Но тот, который помечен как таймер «IO-APIC-edge», остается неизменным между двумя вызовами. Итак, на каждом процессоре работают «прерывания локального таймера», которые увеличивают глобальную таймерную переменную 'jiffies', которая в основном записывает количество тиков с момента загрузки? Также 'IRQ 0' соответствует прерыванию таймера в 1-й строке' cat/proc/interrupts' ... поэтому я думаю, что у меня есть «система без ключа». Кстати очень четкое объяснение ... спасибо – Deepthought
Не беспокойтесь APIC ввода-вывода, прерывания локального таймера фактически исходят от Local APIC, что совсем другое. То, что вы видите как IRQ 0, является таймером APIC ввода-вывода, который, вероятно, не используется (за исключением, может быть, во время загрузки). Вы правильно говорите, что локальный таймер прерывает приращение jiffies. – jleahy
Эй, я читаю abt timer из этой книги, называемой профессиональной архитектурой ядра Linux, и немного понимаю ядро Linux, но я, очевидно, не понимаю процесс ... Я должен попробовать и изменить код, который обновляет jiffies эффективным образом ... Можете ли вы порекомендовать хороший источник, где я могу понять не только теорию, но и код в ядре, который выполняет эту работу .... Спасибо – Deepthought