Центр Диагностики & База Системных Ошибок

Решения для Windows Server, Active Directory, 1С, СУБД, Linux, Cisco, MikroTik и IP-телефонии.

⚠️ Важная информация Все материалы, инструкции, команды и скрипты предоставлены исключительно в ознакомительных целях. Их применение может повлиять на работу операционной системы, баз данных и сетевого оборудования. Перед выполнением действий обязательно создайте резервную копию. При отсутствии необходимой квалификации обратитесь к ИТ-специалистам.
numa: Node memory allocation exhausted (local node out of memory) Linux / DevOps

NUMA Node memory allocation exhausted — Решение локального OOM в Linux

Обновлено: 18.08.2026  ·  Официальная база знаний

Архитектура ошибки и симптомы сбоя

Сообщение «numa: Node memory allocation exhausted (local node out of memory)» (или срабатывание локального «NUMA node out of memory: kill process») генерируется подсистемой управления памятью ядра NUMA (Non-Uniform Memory Access). Ошибка означает, что процесс, привязанный к конкретному процессорному сокету (NUMA Node X), исчерпал доступный объем локальной оперативной памяти. Если в ядре включена жесткая изоляция зон памяти (zone_reclaim_mode = 1), ядро не выделяет память из соседних свободных NUMA-узлов, а принудительно вызывает OOM Killer или погружает систему в жесткий троттлинг.

Диагностическая таблица параметров сбоя

ПараметрЗначениеИнженерный смысл сбоя
NUMA Node 0/1Socket Memory DomainФизический банк памяти, напрямую подключенный к контроллеру памяти конкретного CPU.
zone_reclaim_modeIsolation PolicyПолитика реклейма: 0 — аллокация с чужих узлов, 1 — агрессивный локальный реклейм.
numactl / numadPolicy & DaemonУтилиты привязки процессов к ядрам (Affinity) и чередования страниц (Interleaving).

Пошаговое дерево решений и сценарии траблшутинга

Сценарий 1: Проверка балансировки памяти по NUMA-узлам

# Просмотр распределения и дефицита памяти по узлам:
numactl --hardware

# Просмотр статистики NUMA-попаданий и промахов (numa_miss / numa_foreign):
numastat -c

Если счетчик numa_miss и other_node велик, процессы не помещаются в локальные узлы.

Сценарий 2: Отключение жесткой изоляции зон (zone_reclaim_mode)

Разрешите ядру беспрепятственно брать оперативную память с соседних NUMA-узлов:

# Отключение zone_reclaim_mode на лету:
echo 0 | sudo tee /proc/sys/vm/zone_reclaim_mode

# Закрепление в /etc/sysctl.d/99-numa.conf:
echo "vm.zone_reclaim_mode = 0" | sudo tee -a /etc/sysctl.d/99-numa.conf
sudo sysctl -p /etc/sysctl.d/99-numa.conf

Сценарий 3: Запуск тяжелых сервисов с чередованием памяти (Interleave Policy)

Для баз данных (PostgreSQL, MySQL, Oracle, Redis), размер которых превышает память одного сокета:

# Запуск службы с чередованием страниц по всем узлам NUMA:
numactl --interleave=all /usr/bin/mongod --config /etc/mongod.conf

# В unit-файле systemd (systemctl edit service_name):
[Service]
NUMAPolicy=interleave
NUMAMask=all

Сценарий 4: Включение динамического демона балансировки numad

# Установка и запуск автоматического менеджера ресурсов NUMA:
sudo apt-get install numad || sudo dnf install numad
sudo systemctl enable --now numad
Базы данных 1С, PostgreSQL или Redis спонтанно зависают на многосокетных серверах?
ITSTM настроит оптимальный NUMA-binding, тюнинг задержек шины QPI/UPI и исключит локальные OOM-падения.
Практический опыт инженера: На двухсокетных серверах с СУБД MongoDB или Redis всегда устанавливайте vm.zone_reclaim_mode=0 и запускайте службу с NUMAPolicy=interleave в systemd во избежание просадок RPS в 5–10 раз из-за локального исчерпания RAM сокета 0.

Частые вопросы (FAQ)

Почему zone_reclaim_mode=1 опасен для серверов баз данных?

В режиме zone_reclaim_mode=1 ядро при нехватке локальной памяти сокета тратит 100% ресурсов CPU на синхронный сброс дисковых кэшей и вытеснение страниц, вместо того чтобы просто выделить свободную оперативную память со второго сокета задержкой всего в ~30-40 нс.

Что такое NUMA Interleave?

Это стратегия распределения страниц оперативной памяти по принципу Round-Robin между всеми физическими сокетами сервера, предотвращающая переполнение отдельного узла крупными приложениями.

Как привязать процесс к конкретному NUMA-узлу?

Используйте утилиту numactl: numactl --cpunodebind=0 --membind=0 command. Процесс будет исполняться строго на ядрах сокета 0 и использовать память сокета 0.

Что означает статус numa_foreign в numastat?

Счетчик показывает количество страниц памяти, которые изначально предназначались для другого сокета, но были выделены на текущем узле из-за нехватки места на целевом.