...

Ядро без галочек и энергоэффективность: как оптимизировать работу сервера

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

Центральные пункты

Ниже описаны наиболее важные шаги и взаимосвязи.

  • Без галочки Таймер: прерывания, управляемые по требованию, вместо периодических тиков
  • Энергия сохранить: Удерживайте глубокие C-состояния дольше, уменьшите количество пробуждений
  • NO_HZ Варианты: Используйте CONFIG_NO_HZ_IDLE и CONFIG_NO_HZ_FULL
  • планировщик Тонкая настройка: загрузка пакета, настройка сродства прерывания
  • Мониторинг Первое: измерение "до/после" для получения четкого эффекта

Краткое описание режима без галочки

Классический LinuxЯдро пробуждение каждого процессора через фиксированные промежутки времени, часто от 100 до 1000 раз в секунду. Это стоит ощутимо Энергия, даже если ни одна задача не находится на рассмотрении. Режим Tickless заменяет эту периодичность прерываниями по таймеру, управляемыми по требованию. В результате процессор дольше находится в состоянии глубокого сна, пока не произойдет событие. Согласно [1], именно такое поведение повышает эффективность, поскольку устраняются ненужные пробуждения и снижается тепловая нагрузка. Я использую Tickless в системах с сильно колеблющейся нагрузкой и необходимостью четкого переключения между активностью и покоем.

Почему Tickless повышает энергоэффективность

Если процессор простаивает, жесткие тики, используемые для предотвращения низкого уровня C-состояния и постоянно пробуждал ядра. Это генерировало больше Отработанное тепло и заставляет вентиляторы работать на более высоких оборотах. Tickless устраняет этот постоянный будильник и продлевает фазы простоя. Я наблюдал более низкое энергопотребление в режиме простоя и более плавные температурные кривые для веб-узлов и узлов API с переменчивой рабочей нагрузкой. В больших серверных фермах небольшая экономия на каждом узле выливается в заметные суммы в евро на счетах за электричество. Платформа работает тише, а пики нагрузки смягчаются более надежно.

Режимы и опции ядра с первого взгляда

Я различаю два основных подхода: Tickless Idle и Tickless Full. Tickless Idle приостанавливает работу до тех пор, пока нет задач, и воспроизводит свой Прочность особенно в фазах простоя. Функция Tickless Full (NO_HZ_FULL) снижает тики для выбранных ядер даже во время работы, что позволяет уменьшить задержки и контекстные переключения. В современных дистрибутивах NO_HZ_IDLE часто активируется по умолчанию, в то время как NO_HZ_FULL требует специальной настройки. Обратите внимание, что расширенные режимы требуют тонкой настройки сродства и изоляции прерываний, чтобы гарантировать, что Преимущества а не срываться из-за случайных пробуждений.

Режим/опция Эффект Подходит для Примечания
CONFIG_NO_HZ_IDLE Приостановка тиков в режиме ожидания Общая нагрузка на сервер с фазами простоя По умолчанию активен, низкий уровень Риски
CONFIG_NO_HZ_FULL Минимизация количества тиков на ядро во время работы Низкая задержка, HPC, отдельные ядра Чистая изоляция ядра и сродство к IRQ План
isolcpus, rcu_nocbs Ядра с низким уровнем шума, меньшее количество пробуждений RCU Рабочие нагрузки в режиме реального времени Только несколько жил изолируют, остальные несут нагрузка системы
Ядро ≥ текущий LTS Новые энергосберегающие дорожки, исправления Все производительные системы Исправления и повышение эффективности в соответствии с [1] использовать

Шаг за шагом: установка параметров ядра и загрузки

Начну с описания возможностей ядра. О том, поддерживает ли ядро tickless, можно узнать по флагам конфигурации:

grep NO_HZ /boot/config-$(uname -r)
grep HIGH_RES_TIMERS /boot/config-$(uname -r)
grep -E 'CPU_IDLE|INTEL_IDLE' /boot/config-$(uname -r)

Для NO_HZ_IDLE обычно достаточно ядра дистрибутива. Для NO_HZ_FULL я специально определяю CPU-домохозяйки, которые берут на себя системные задачи, IRQ и обратные вызовы RCU. Обычно я оставляю CPU 0-1 в качестве домашних и перевожу остальные ядра в режим DyTick:

# Пример GRUB-CMDLINE (адаптация к аппаратному обеспечению):
GRUB_CMDLINE_LINUX="nohz_full=2-15 isolcpus=2-15 rcu_nocbs=2-15 irqaffinity=0-1 nmi_watchdog=0"

Важно: хотя бы одно ядро должно оставаться домашним, иначе есть риск застоя RCU. После обновления конфигурации GRUB и перезагрузки я проверяю активные настройки:

cat /sys/devices/system/cpu/nohz_full # перечисляет процессоры NO_HZ_FULL
cat /sys/devices/system/cpu/isolated # выводит список изолированных процессоров
cat /proc/cmdline # проверяет параметры загрузки

Я также активирую таймеры высокого разрешения и драйверы, специфичные для работы в режиме ожидания (например, intel_idle). И то, и другое улучшает тонкость таймеров и глубину спящих состояний. Если вы используете irqbalance, настройте заблокированные ядра так, чтобы сродство не переходило обратно на изолированные процессоры:

# Пример: IRQBALANCE_BANNED_CPUS в файле /etc/irqbalance/irqbalance.env
IRQBALANCE_BANNED_CPUS=0x0003 # Процессоры 0-1 разрешены, остальные заблокированы (формат маски зависит от системы)

Затем я проверяю, что тики действительно отсутствуют, просматривая следующие пробуждения каждого процессора:

sudo cat /proc/timer_list | grep -A2 'next event' | sed -n '1,60p'

В спокойных фазах следующие события должны быть явно в будущем или полностью отсутствовать, если нет таймеров.

Измерительная дисциплина: инструменты и ключевые показатели

Без измерений любая оптимизация остается слепой. Я записываю базовые значения и сравниваю их после каждого изменения. Они доказали свою ценность:

  • powertop: Пробуждение от бездействия/с, верхний инициатор, проживание в C-состоянии
  • турбостатЧастоты, пакет и основные С-состояния, производительность RAPL
  • perf statКонтекстные переключатели, таймерные прерывания, циклы, инструкции
  • /proc/interruptsРаспределение IRQ на процессор
  • pidstat/iostatХарактеристики процессов и ввода/вывода
# Захват 10-минутной базовой линии в режиме простоя
sudo turbostat --Summary --interval 5 --quiet --show PkgWatt,BUS,CPU,CPU,CPU,MHz
sudo powertop --time=600 --html=/tmp/powertop_baseline.html

Тепловая карта прерываний #
watch -n2 'cat /proc/interrupts | sed -n "1,30p"'

# Контекстные переключения и события таймера
perf stat -a --delay 5000 --timeout 60000 -e cs,task-clock,cpu-clock,irq_vectors:local_timer

В каждом случае я документирую: энергопотребление на холостом ходу (PkgWatt), доли C-состояния, количество пробуждений/с и метрики задержки (p95/p99) для соответствующей рабочей нагрузки. Даже небольшие различия становятся заметными через несколько недель.

Виртуализация, контейнеры и tickless в стеке

Гипервизор и гости вместе генерируют множество Таймер и пробуждения, например, через cron, логирование и агентов. Я сокращаю эту цепочку, активируя Tickless в гипервизоре и в гостевых системах. Это устраняет двойные пробуждения, и виртуальные процессоры дольше остаются в тишине. В средах Kubernetes или микросервисах уровень фонового шума ощутимо снижается. Я также синхронизирую время выполнения подкастов и пакетов, чтобы создать более длинные окна простоя и Сбережения подниматься.

В средах KVM я планирую vCPU pinning и IRQ affinity вместе: я привязываю громкие vNIC или vBlock IRQ к домашним процессорам, а тихие рабочие нагрузки - к изолированным ядрам. На стороне гостя я деактивирую лишние источники таймеров, уменьшаю частоту cron и использую таймеры systemd с высокой точностью (AccuracySec), чтобы события связывались более естественно. Это делает фазы простоя более продолжительными - гипервизор получает двойную выгоду, поскольку происходит меньше выходов и входов ВМ.

Практическая настройка: Профили питания, губернатор, прерывания

Обычно я использую губернатора для быстрой реакции schedutil потому что он динамически перехватывает скачки нагрузки. Я оставляю активными C-состояния, если только приоритет не имеют чрезвычайно короткие задержки. Я привязываю шумные IRQ к выбранным ядрам и держу другие ядра свободными, чтобы они могли глубоко спать. Я планирую пакетные задания, резервное копирование и обновления блоками, чтобы связать спокойные фазы. Если вы хотите узнать больше об этом, вы можете найти справочную информацию на Масштабирование частоты процессора, который я тесно координирую с Tickless, чтобы экономно использовать подсказки.

Кроме того, я настраиваю предпочтение энергии (EPP/EPB) современных процессоров таким образом, чтобы ускорение происходило только при необходимости, а уровень бездействия оставался высоким. Сервисы с терпимой задержкой получают большие значения таймера (systemd: TimerSlackNSec=), я управляю периодическими заданиями через таймеры systemd с AccuracySec и RandomisedDelaySec. Это снижает нагрузку на края и создает более длинные, непрерывные окна простоя.

# Пример: Назначить IRQ конкретно (Внимание: проверьте номер IRQ)
echo 0-1 | sudo tee /proc/irq/XX/smp_affinity_list # привязать IRQ к домашнему хозяйству

# установить таймер systemd кооперативно (извлечение блока .timer)
ТочностьСек=5мин
RandomisedDelaySec=30min
Persistent=true

Разумно используйте NUMA и объединение нагрузки

В многоядерных и NUMA-хостах я увеличиваю Эффективность, намеренно концентрируя нагрузку на нескольких ядрах. В результате свободные ядра все глубже и дольше погружаются в C-состояние. Я слежу за тем, чтобы обращения к памяти были NUMA-локальными, чтобы избежать ненужных скачков. Планировщик Linux помогает, но ручная фиксация горячих потоков часто является последним штрихом. В случае с Tickless этот пиннинг более эффективен, поскольку изолированные ядра не пробуждаются периодикой, и поэтому реальные Отдых имеют.

На практике я предпочитаю назначать тяжелые для ввода-вывода потоки на один узел NUMA и изолировать требовательные к процессору сервисы на несколько ядер этого узла. Cgroups (cpuset, cpu) помогают провести четкие границы. Я проверяю Transparent Huge Pages и AutoNUMA в зависимости от рабочей нагрузки: они могут помочь, но противодействуют джиттеру задержки. Важно, чтобы хотя бы один узел сохранял достаточную производительность, чтобы системные задачи не нагружали критические ядра.

Балансировка и измерение требований к задержкам

Некоторые рабочие нагрузки, выполняемые в режиме реального времени или торговли, требуют максимально короткого времени. Время реагирования. Поэтому я провожу тесты на образцах, близких к производственным, и сравниваю перцентили латентности до и после изменений без галочки. NO_HZ_FULL может уменьшить переключение контекста и шум таймера, но глубокие C-состояния иногда удлиняют пути пробуждения. Благодаря телеметрии по C-состояниям, частоте, задержкам пакетов и джиттеру я принимаю обоснованные решения. Если вы также занимаетесь поддержкой ядра, вы получаете несколько преимуществ - как показывает практика, настройка производительности и исправление проблем безопасности идут рука об руку; моя ссылка на Оптимизация ядра, которые я последовательно интегрирую в окна обслуживания.

Я специально тестирую сценарии всплесков (короткие, интенсивные фазы) и соотношу пики задержки с частотой и C-состояниями. Здесь полезны измерения с фиксированным EPP, а также короткий тест с ограниченным количеством C-состояний для визуализации доли задержек при пробуждении. Если используются ядра NO_HZ_FULL, я слежу за тем, чтобы не допустить недостатка питания на центральных процессорах - в противном случае есть риск появления предупреждений RCU или спорадического джиттера.

Безопасность: текущие ядра платят дважды

Я держу системы текущий, потому что новые ядра не только совершенствуют пути энергосбережения, но и устраняют пробелы. Сообщения об уязвимостях ядра показывают, что злоумышленникам иногда удается расширить права без особых усилий. С помощью обновлений я снижаю этот риск и в то же время обеспечиваю повышение эффективности современных механизмов [2]. В итоге безопасность работы повышается, а незапланированные простои не бьют по нервам и бюджету. Именно такое сочетание безопасности и Эффективность делает регулярные обновления простым решением.

Эффект центра обработки данных: коэффициент полезного действия, вентиляторы, блоки питания

Меньшее количество пробуждений уменьшает Загрузить можно оценить влияние на охлаждение и распределение энергии. Пиковые нагрузки на процессор становятся более плавными, вентиляторы реже работают на пределе своих возможностей, а блоки питания работают более эффективно. Этот эффект домино напрямую влияет на PUE сайта. Если вы хотите узнать больше, ознакомьтесь с темой экологичный центр обработки данных и использует Tickless как строительный блок в целостной системе управления энергопотреблением. Я всегда планирую меры вместе, потому что аппаратное обеспечение, ОС и рабочая нагрузка вместе вносят свой вклад в Сбережения с.

Практическое освоение WordPress, PHP и баз данных

На стопках CMS с большим количеством коротких Запросы Мне очень помогают слои кэша и чистая настройка PHP-FPM. Я держу opcache теплым, запечатываю плагины Chatty и минимизирую шум cron, складывая окна задач. Базы данных имеют четкие периоды обслуживания, чтобы не увеличивать пики ввода-вывода в ежедневной нагрузке. Вместе с Tickless фоновый шум уменьшается, и сервер быстрее переходит в режим простоя. Таким образом, платформа сочетает в себе производительность на ватт без ощутимого влияния пользователей. Потери см.

В частности, я уменьшаю количество триггеров WordPress cron, переношу повторяющуюся работу на таймеры systemd с коалесценцией и поддерживаю размер рабочих PHP FPM таким образом, чтобы обслуживать короткие волны нагрузки, не поддерживая высокую постоянную базу открытых рабочих. Базы данных выигрывают от четких окон автовакуумирования (дросселирование/перемещение при необходимости) и последовательных "блоков обслуживания". Я предпочитаю связывать каждую регулярную, но не критичную по времени задачу в крупнозернистый пакет, а не запускать ее в считанные секунды.

BIOS/UEFI и аппаратные пути

Я уже задал основу в BIOS/UEFI: активировать глубокие пакетные C-состояния, использовать подложки ASPM/PCIe L1 и не отключать энергосберегающие функции по всему периметру. Я ограничиваю глубину C-состояний только на тестовой основе, если этого требуют особые цели по задержкам. Сетевые карты и контроллеры NVMe выигрывают от энергосберегающих режимов; тем не менее я проверяю, не приводит ли агрессивное управление питанием к пикам латентности. При этом стоит тщательно балансировать: на одну передачу меньше при максимальном энергосбережении может дать большой эффект в диапазоне задержек 99 с.

Сеть и хранилище: продолжайте нажимать на пробуждение

Сетевой стек часто задействует множество IRQ. Я осторожно увеличиваю параметры коалесценции, чтобы сгладить шторм прерываний без излишнего ухудшения задержки:

Пример # (настраивайте значения в зависимости от рабочей нагрузки!)
sudo ethtool -C eth0 rx-usecs 16 rx-frames 16 tx-usecs 16 tx-frames 16

Я масштабирую GRO/LRO и RSS в соответствии с топологией процессора, чтобы на несколько ядер приходилась большая часть шума от прерываний. На стороне хранилища я проверяю, оптимизированы ли свойства устройств (например, NVMe-APST) и не перерастают ли пики нагрузки в дневные пики из-за фоновых заданий (чистки, перестройки). Цель состоит в том, чтобы вместить планируемые всплески ввода-вывода в определенные окна.

Типы неисправностей и устранение неполадок

Бескозырки редко выходят из строя из-за базовой механики, чаще - из-за тонкой настройки:

  • RCU задерживаетсяЕсли это происходит после NO_HZ_FULL, причиной обычно является слишком малое количество CPU, выполняющих уборку, или слишком большая нагрузка IRQ на изолированные ядра. Запланируйте большее количество процессоров для уборки.
  • Неожиданные пробужденияPowertop показывает виновников. Частыми источниками являются агенты телеметрии, короткие интервалы таймера или журналы чата.
  • Неравномерное распределение IRQПроверьте /proc/interrupts и перенастройте аффинити; правильно настройте irqbalance.
  • Джиттер задержкиГлубина C-состояния, EPP и коалесценция изменяются постепенно и с соблюдением p99; часто достаточно небольших корректировок.

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

Конкретные шаги для вашего старта

Я начну с текущего Ядро и проверьте, активен ли NO_HZ_IDLE. Затем я измеряю базовые показатели: энергопотребление в режиме простоя, температуру, C-состояния, частоту IRQ и задержки. Затем я активирую опции tickless и повторяю измерения. Если я нахожу экономию, я сохраняю конфигурацию в репозиториях кода и документации. При необходимости я тестирую NO_HZ_FULL для выбранных ядер и изолирую их с помощью тщательного распределения IRQ так, чтобы Эффект остается видимым.

Моя прагматичная процедура:

  1. Соберите исходные данные (10-15 минут простоя + короткий нагрузочный тест, сохраните метрики)
  2. Проверьте NO_HZ_IDLE, проверьте таймер высокого разрешения и неработающий драйвер
  3. Настройте сродство IRQ и irqbalance, громкие IRQ на домашнем обслуживании
  4. Увеличьте коалесценцию таймеров (таймер systemd, TimerSlack, интервалы cron).
  5. Дополнительно: NO_HZ_FULL на выбранных ядрах + rcu_nocbs, оставляя свободными хотя бы 1-2 домашних CPU
  6. Настройка NUMA и CPU, ограничений Cgroup и пакетных окон
  7. Сравнивайте "до" и "после", документируйте решения

Мое краткое резюме

Без галочки приносит измеримые Энергия- и тепловые преимущества, особенно для гибких рабочих нагрузок с длительными фазами простоя. Я начинаю с NO_HZ_IDLE и сочетаю его с разумными профилями питания. Затем я работаю над распределением IRQ, распределением нагрузки и дисциплиной измерений. Для особо критичных к задержкам сценариев я дозированно использую NO_HZ_FULL и оцениваю компромисс с помощью реалистичных тестов [1]. Если вы объедините технологию, дизайн рабочей нагрузки и мониторинг, то сможете использовать Потенциал этой функции ядра постоянно.

Текущие статьи

Энергоэффективный Linux-сервер с бесщеточным ядром в центре обработки данных
облачные вычисления

Ядро без галочек и энергоэффективность: как оптимизировать работу сервера

Узнайте, как хостинг Tickless Kernel повышает энергоэффективность вашего сервера и как целенаправленная настройка linux снижает затраты на электроэнергию и выбросы CO₂ в центре обработки данных.

Сервер с журналами транзакций базы данных в центре обработки данных
Базы данных

Журналы транзакций баз данных и процессы восстановления четко объясняются

Узнайте, как работает журнал транзакций базы данных, почему он имеет решающее значение для долговечности sql и как процессы восстановления после сбоев, такие как восстановление после сбоев mysql, надежно защищают ваши данные.