Память сервера потребляет энергию даже в простое: контроллер обновляет ячейки, интерфейс держит тактирование, чипы DIMM греются. На системе с 512 ГиБ фоновое потребление DRAM достигает десятков ватт. Linux умеет снижать эту цену через C-states для процессора, управление частотой, самопобновление DIMM, и через сокращение активной памяти за счёт компактного размещения страниц. Ниже разобраны механизмы на уровне ядра, BIOS, sysctl и подсистемы cpufreq, с командами и примерами.

Потребление DRAM складывается из трёх частей: фоновое энергопотребление ячеек на обновление, динамическое от чтения и записи, и потребление интерфейса при тактировании. Фоновая часть зависит от объёма и температуры и не отключается. Динамическая растёт с трафиком. Интерфейсная зависит от числа активных каналов и частоты.

Средства экономии: перевод ядер в глубокие C-states снижает тактирование и трафик к памяти; при простое всех ядер контроллер памяти может перейти в самопобновление, Self Refresh, где DRAM тактируется минимально; частоту памяти снижают в BIOS или через встроенные профили; объём активных страниц сокращают через компактное размещение и отключение простаивающих NUMA-узлов.

Проверка текущего потребления на Intel через pcm-power.x показывает Watts по сокетам и распределение между ядрами, памятью и некоренными модулями:

pcm-power.x 1

Колонка DRAM показывает ватты на память, что сразу видно, стоит ли экономить или трафик критичен.

C-states процессора, governor и источники потребления памяти

Ядро процессора уходит в C-states от C1 до C10, и чем глубже состояние, тем ниже частота системного агента и меньше трафика к памяти. Параметр intel_idle.max_cstate ограничивает глубину:

cat /sys/devices/system/cpu/cpu0/cpuidle/state*/name

Отключение глубоких состояний повышает латентность пробуждения, но держит частоту агента выше, что ускоряет доступ к памяти. Для латентностных нагрузок ставят intel_idle.max_cstate=1 процессор_idle, для энергосберегающих серверов оставляют дефолт.

Настройка через governor cpufreq: режим performance держит ядра на максимальной частоте, режим powersave опускает до минимума:

cpupower frequency-set -g powersave
cpupower idle-info

Governor powersave вместе с глубокими C-states даёт наибольшую экономию памяти, но удлиняет пробуждение до десятков микросекунд.

При простое всех ядер и отсутствии трафика контроллер памяти переводит DIMM в Self Refresh: чипы тактируются внутренним генератором, интерфейс засыпает. Возврат из Self Refresh занимает десятки наносекунд и повышает латентность первого доступа.

В BIOS управляют раскладкой каналов и режимами: отключение неиспользуемых каналов экономит энергию интерфейса, но режет полосу. Режим DDR5 power-down включает режимы PD, Power Down, для простаивающих ранков. Настройки обычно ищут в меню Chipset, Memory Configuration, Power Down Enable.

Для включения Self Refresh в ядре Linux нужен параметр ядра intel_idle.max_cstate достаточно глубокий, чтобы ядра реально засыпали. Проверить засыпание можно через powertop:

powertop --time=10

В разделе C-states видны проценты времени в каждом состоянии: если C6 и выше занимают более 80 процентов простоя, Self Refresh будет включаться регулярно.

Компактное размещение страниц экономит энергию DRAM за счёт отключения целых ранков: если страницы сосредоточены в первых ранках, остальные ранки простаивают и уходят в Power Down. Утилита migratepages и интерфейс /proc/<pid>/numa_maps показывают раскладку:

migratepages <pid> 0 0

Системные вызовы для compact памяти: madvise с MADV_HUGEPAGE объединяет страницы в огромные, снижая число активных строк. Утилита khugepaged автоматически объединяет страницы, параметр transparent_hugepage=always включает по умолчанию.

Для NUMA-серверов отключение неиспользуемого узла через BIOS или через udev-правила с offlining памяти экономит десятки ватт:

echo 0 > /sys/devices/system/node/node1/online

Эта операция необратима до перезагрузки, и требует миграции всех страниц с узла. Перед offlining проверяют отсутствие привязанных процессов через numactl --show.

Типичные ошибки и диагностика энергопотребления

  1. включение aggressive C-states на латентностном сервисе, задержка пробуждения растёт до десятков микросекунд, решение в intel_idle.max_cstate=1;
  2. powersave governor на нагруженном сервере, ядра работают на минимуме, трафик к памяти вырастает из-за конкуренции, решение в performance governor;
  3. отключение каналов DIMM в BIOS без пересчёта полосы, пропускная способность падает кратно, решение в замере STREAM до и после;
  4. offlining NUMA-узла с активными процессами, ядро возвращает ошибку или теряет страницы, решение в миграции процессов через numactl;
  5. забытый monitoring DRAM-трафика, экономия энергии не видна, решение в pcm-power.x или perf с событиями uncore.

Диагностика: pcm-power.x показывает ватты по сокетам, powertop показывает проценты C-states, cpupower frequency-info показывает текущую частоту, perf stat -a -e UNC_M_CAS_COUNT даёт трафик к памяти. Порог для действий: если DRAM потребляет меньше 5 ватт, экономия не стоит усилий, если больше 20 ватт, стоит настроить Self Refresh и компактное размещение.

Порядок внедрения и итоговые рекомендации

Для латентностных сервисов: intel_idle.max_cstate=1, performance governor, отключение Self Refresh через BIOS. Память греется, но предсказуема.

Для энергосберегающих серверов и кластеров: дефолтные C-states, powersave governor на простаивающих узлах, включение PD режимов DIMM, компактное размещение через transparent_hugepage=always.

Для гибридных нагрузок: adaptive governor, ручное включение Self Refresh через скрипты простоя, offlining неиспользуемых NUMA-узлов через systemd-юнит при старте.

Ключевое правило: экономия энергии памяти полезна на простаивающих или слабонагруженных узлах, и вредна на нагруженных. Порог для действий устанавливают по pcm-power.x: DRAM выше 10-15 ватт в простое, значит есть что экономить. Один вечер настройки энергопотребления памяти экономит сотни ватт на кластере из десятков серверов.
## DDR5 и DDR4 режимы энергосбережения, Self Refresh и BIOS

DDR5 и DDR4 поддерживают несколько состояний энергосбережения интерфейса. PD, Power Down, переводит ранки в режим с сохранением содержимого при пониженном тактировании, вход и выход занимают единицы микросекунд. Deep Power Down на DDR4 и DDR5 сохраняет содержимое при почти нулевом потреблении, но выход дольше и опасен потерей данных при сбое питания. Self Refresh сохраняет содержимое при минимальном тактировании внутренним генератором, и контроллер поддерживает состояние автоматически.

В Linux драйверы контроллеров памяти управляют этими режимами через ACPI и через BIOS. Настройка Power Down Enable в BIOS включает режимы для простаивающих ранков. Типичные режимы: PD Hot, PD Cool, PD Max. Настройка зависит от поколения процессора и BIOS, и обычно ищется в Chipset, Memory Configuration, Power Down Enable или Memory Power Savings.

Для DDR5 появился механизм RCD, Registered Clock Driver, с энергосбережением на уровне модуля: при простое ранка RCD снижает тактирование интерфейса модуля. Включается через BIOS или через команду SPD чтения через i2c-tools:

i2cdetect -l
i2cdump -y 0 0x50

Счётчики SPD показывают конфигурацию модуля, включая настройки энергосбережения и температурные лимиты. Мониторинг температуры DIMM через lm-sensors или ipmi-sensors показывает, что экономия реально работает и модули не греются.

Влияние энергосбережения на латентность, полосу и мониторинг DIMM

Каждый уровень энергосбережения повышает латентность первого доступа. Self Refresh даёт дополнительную задержку 20-50 наносекунд на пробуждение контроллера. PD даёт 5-15 наносекунд. Deep Power Down от 50 наносекунд и выше. Для латентностных нагрузок на торговых системах или в базах данных с SLA по микросекундам эти значения критичны.

Полоса памяти при включённых режимах энергосбережения почти не меняется на нагруженном трафике: контроллер сразу выходит из PD или Self Refresh при поступлении запроса. Разница заметна только на пиковых нагрузках, когда контроллер не успевает выйти из энергосберегающего режима до поступления следующего запроса. Замер STREAM с выключенным и включённым PD показывает разницу в 3-5 процентах полосы.

Для серверов с турбулентной нагрузкой всплесками и паузами включённые режимы энергосбережения дают ложные задержки на каждом всплеске. Решение: disable PD и Self Refresh для сервисов с пиковым профилем, enable для равномерного трафика или простаивающих узлов.

Температура DIMM читается через lm-sensors:

sensors

Вывод показывает temp1, temp2 для каждого DIMM с датчиками на модуле. Для DDR5 есть дополнительный датчик на RCD, Registered Clock Driver. Мониторинг температуры важен для энергосбережения: горячие модули потребляют больше, и их нужно охлаждать или переводить в режимы с пониженной частотой.

Потребление DIMM читается через ipmi-sensors:

ipmi-sensors --sdr-type=Energy

Или через BMC-интерфейс сервера. На серверах Dell iDRAC, HPE iLO, Lenovo XCC показывают суммарное потребление по сокетам и по памяти. Связка с pcm-power.x на уровне ядра даёт полную картину.

Для кластеров мониторинг энергии обычно выносят в централизованный сбор через IPMI, SNMP или Redfish API. Экспорт в Prometheus через node_exporter или через IPMI-экспортер позволяет строить графики потребления и выставлять алерты на аномалии.

Пример 1: кластер из 20 серверов с 512 ГиБ каждый, DRAM потребляет 15 ватт в простое на сервер. После включения PD Hot и Self Refresh через BIOS потребление падает до 6 ватт на сервер. Суммарная экономия 180 ватт на кластер, около 1576 киловатт-часов в год. Латентность выросла с 90 до 110 наносекунд, что не критично для этого кластера.

Пример 2: сервер баз данных с пиковым профилем нагрузки, DRAM потребляет 30 ватт. Включение PD Hot снизило до 18 ватт, но latency p99 вырос с 500 до 850 микросекунд из-за пробуждений. Включение только в ночные часы через cron-скрипт с sysctl позволило сэкономить 12 ватт ночью и сохранить латентность днём.

Пример 3: сервер реального времени с SLA по микросекундам. Все режимы энергосбережения отключены, performance governor, intel_idle.max_cstate=1. Потребление памяти 22 ватта, но латентность стабильна 95 наносекунд p999. Экономия энергии здесь неуместна.

Практические примеры на кластере и скрипты автоматизации

Для серверов с расписанием нагрузки полезен systemd-юнит или cron-скрипт, который включает режимы энергосбережения в часы простоя и выключает перед пиком:

[Unit]
Description=Memory power save mode
After=multi-user.target

[Service]
Type=oneshot
ExecStart=/usr/local/bin/memory-power-on.sh
ExecStop=/usr/local/bin/memory-power-off.sh
RemainAfterExit=yes

Скрипт memory-power-on.sh включает governor powersave, пишет настройки PD через sysfs если доступны, может офлайнить NUMA-узлы. Скрипт memory-power-off.sh возвращает performance governor, онлайнит узлы обратно. Юнит включают через таймер на время простоя.

Пример скрипта memory-power-on.sh:

cpupower frequency-set -g powersave
echo 1 > /sys/devices/system/cpu/cpu0/cpuidle/state3/disable

Скрипт memory-power-off.sh:

cpupower frequency-set -g performance
echo 0 > /sys/devices/system/cpu/cpu0/cpuidle/state3/disable

Для кластеров управление энергосбережением выносят в централизованный инструмент: Ansible с плейбуком на все узлы, или через SaltStack, или через системный демо-менеджер типа Prometheus с алертами и авто-действиями.

Другие повторяющиеся промахи: offlining NUMA-узла без миграции процессов, ядро возвращает Device or resource busy, сначала migratepages для каждого процесса; transparent_hugepage=always на латентностном сервисе, огромные страницы фрагментируются и дают джиттер, решение в madvise режиме; powertop tuning для сервера ломает сервисы, автоматический tuning применяют по одному пункту с тестом; cpufreq governor переключение без перезапуска сервисов, часть приложений кеширует частоту; мониторинг энергии без учёта вентиляторов, включение энергосбережения снижает память, но повышает температуру из-за скорости вентиляторов, баланс считают через ipmi-sensors.

Диагностика полного цикла: ipmi-sensors для суммарного потребления, pcm-power.x для распределения по подсистемам, sensors для температуры DIMM, powertop для C-states, cpupower frequency-info для governor, perf stat -a -e UNC_M_CAS_COUNT для трафика. Баланс: экономия памяти без ущерба латентности и полосе, проверенная замерами STREAM и приложением.

Энергопотребление памяти это не главная статья расходов сервера, но на больших кластерах и в датацентрах с тысячами узлов она становится существенной. Правильная настройка даёт 30-60 процентов снижения DRAM-энергии на простаивающих узлах при сохранении полосы и латентности для нагруженных. Один вечер настройки плюс автоматизация через systemd экономят сотни киловатт-часов в год на десятках серверов.