- Home »

Почему про NUMA стоит знать каждому, кто крутит сервера
Если ты хоть раз сталкивался с настройкой современного сервера, особенно если речь про жирные железки с кучей ядер и оперативки, ты наверняка слышал загадочное слово NUMA. На первый взгляд — какая-то магия для дата-центров и энтерпрайза, но на деле — штука, которая может как ускорить твой проект, так и устроить тебе тихий саботаж производительности. Особенно если ты владелец сайта, SEO-шник с личным сервером, вебмастер или дорвейщик, который хочет выжать максимум из своего железа, — NUMA может стать как твоим другом, так и врагом. Давай разберёмся, что это, зачем оно тебе, и как правильно настроить, чтобы потом не было мучительно больно.
Что такое NUMA простыми словами
NUMA — это Non-Uniform Memory Access, или по-русски: неравномерный доступ к памяти. В двух словах: если у тебя сервер с несколькими процессорами или современный многоядерный CPU, то не вся оперативка равнозначно быстрая для всех ядер. Каждая “группа” ядер (node) ближе к своей части памяти, и если ядро лезет в “чужую” память — будет медленнее. Это как если бы в офисе у каждого отдела был свой шкаф с документами — свои брать быстро, а вот чужие — надо идти через весь офис.
В однопроцессорных системах раньше всё было просто: процессор — память — всё рядом. Но сейчас, когда серверы — это по сути несколько процессоров (или чиплетов), приходится учитывать топологию. Именно тут и появляется NUMA.
Как это выглядит в железе
- У тебя есть два (или больше) процессора — каждый со своей памятью.
- Или один процессор, но внутри — несколько групп ядер с отдельными контроллерами памяти.
- Оперативка физически подключена к определённому процессору/контроллеру.
Итого: время доступа к памяти зависит от того, где физически находится память и какое ядро её запрашивает.
Зачем это знать и кому это важно?
- Если ты держишь крупный сайт, форум, магазин, или даже дорвей — производительность критична.
- Виртуализация (KVM, VMware, Docker, etc.) — NUMA влияет на изоляцию и производительность контейнеров/виртуалок.
- Оптимизация баз данных (MySQL, PostgreSQL) — NUMA-aware конфиги реально ускоряют работу.
- Вебмастерам — если сервер начинает тормозить без причины, возможно, дело в неправильной настройке NUMA.
NUMA в действии: примеры и схемы
Допустим, у тебя сервер на двухпроцессорной платформе (например, два Xeon). Каждый процессор видит свою память напрямую (локально), а к памяти второго процессора обращается через внутреннюю шину (медленнее).
Если операционная система и приложения не знают о NUMA, они могут “размазать” процессы и память по всем нодам. В итоге процесс на одном CPU будет часто лазить в память второго — и ты теряешь производительность.
Плюсы и минусы NUMA
- Плюсы:
- Позволяет строить масштабируемые серверы на десятки и сотни ядер.
- При правильной настройке — максимальная производительность.
- Гибкая архитектура для виртуализации.
- Минусы:
- Без грамотной настройки — просадки в скорости, лаги, “зависания” под нагрузкой.
- Сложнее диагностировать проблемы — не всегда очевидно, что тормоза из-за NUMA.
- Не все приложения умеют корректно работать с NUMA (особенно старые или “коробочные”).
Как узнать, есть ли у тебя NUMA и как посмотреть топологию
На Linux всё просто — есть команда lscpu
и numactl
:
lscpu | grep NUMA
numactl --hardware
Пример вывода:
NUMA node(s): 2 NUMA node0 CPU(s): 0-7 NUMA node1 CPU(s): 8-15
Это значит, что у тебя 2 NUMA-ноды, каждая с 8 ядрами. Можно посмотреть, сколько памяти у каждой:
numactl --hardware
Практика: как правильно настроить NUMA
1. Проверь настройки BIOS/UEFI
- В большинстве серверных BIOS есть пункт “NUMA” или “Node Interleaving”.
- Node Interleaving = Disabled — это правильный NUMA (каждый процессор видит только свою память напрямую).
- Node Interleaving = Enabled — память “размазывается” по всем процессорам, NUMA-эффект пропадает, но и преимущества тоже.
Обычно лучше оставить Node Interleaving Disabled, чтобы ОС могла грамотно работать с NUMA.
2. Следи за тем, как ОС распределяет процессы
- Современные Linux и Windows Server поддерживают NUMA “из коробки”.
- Проверь, как ядра и память распределяются между нодами:
numactl --hardware cat /sys/devices/system/node/node*/meminfo
3. Оптимизация приложений под NUMA
- Для баз данных (MySQL, PostgreSQL, Redis) — ищи опции “numa-aware” в документации.
- Для веб-серверов (Nginx, Apache, PHP-FPM) — можно запускать процессы с привязкой к определённой NUMA-ноде.
- Для виртуализации — при создании VM/KVM/QEMU указывай количество NUMA-нод и сколько памяти/ядер на каждую.
Пример для запуска приложения на определённой ноде:
numactl --cpunodebind=0 --membind=0 ./your_app
Это запустит your_app
только на ядрах и памяти 0-й NUMA-ноды.
4. Мониторинг и диагностика
- Используй
numastat
для отслеживания межнодовых обращений:numastat -c
Чем меньше межнодовых обращений — тем лучше.
- Следи за балансом нагрузки между нодами (нагрузка на CPU и память должна быть примерно одинаковой).
Кейсы из жизни: когда NUMA помогает, а когда мешает
Позитивный кейс
У меня был сервер на двух Xeon Gold, 256 Гб RAM. После того как я перевёл MySQL с “размазанной” памяти (Node Interleaving) на “чистый” NUMA и настроил mysqld запускаться на одной NUMA-ноде (с помощью numactl
), производительность выросла на 30%. Запросы стали выполняться быстрее, лаги ушли, CPU перестал “скакать” между ядрами.
Негативный кейс
Другой пример — человек поставил Docker-контейнеры на сервер с 2 NUMA-ноды, но не ограничил привязку по ядрам и памяти. В итоге контейнеры прыгали между нодами, память фрагментировалась, а под нагрузкой начинались “фризы”. Решилось только после настройки --cpuset-cpus
и --cpuset-mems
для каждого контейнера.
Плюсы и минусы подходов
- Игнорировать NUMA: Просто, но теряешь производительность на больших серверах.
- Вручную настраивать numactl: Гибко, но требует времени и понимания топологии.
- Довериться ОС: Современные Linux/Windows умеют сами, но не всегда идеально.
Команды для быстрой диагностики и настройки
# Узнать топологию NUMA
lscpu | grep NUMA
numactl --hardware
# Посмотреть межнодовые обращения
numastat
# Запустить приложение на определённой ноде
numactl --cpunodebind=0 --membind=0 ./app
# Для Docker (ограничить контейнер по NUMA)
docker run --cpuset-cpus="0-7" --cpuset-mems="0" ...
Бонус: ошибки новичков, советы и мифы
- Ошибка №1: Включить Node Interleaving в BIOS (“чтобы было проще”) — и потерять 20-40% производительности на больших нагрузках.
- Ошибка №2: Не следить за тем, как процессы распределяются между нодами — в итоге “размазанные” процессы жрут чужую память.
- Ошибка №3: Думать, что NUMA — это только для “энтерпрайза”. На самом деле, даже на обычных двухпроцессорных серверах это важно!
- Миф: “NUMA — это сложно, не для меня”. На деле, достаточно пару раз посмотреть вывод
numactl
и понять, где твои ядра и память. - Совет: Если сомневаешься — сначала попробуй “по дефолту”, но обязательно мониторь производительность и межнодовые обращения.
- Похожее решение: Для совсем простых задач можно просто ограничить процессы по CPU affinity (через
taskset
), но это не всегда заменяет грамотную NUMA-настройку.
Заключение: стоит ли заморачиваться с NUMA?
Если у тебя сервер с одной “бюджетной” платформой — можешь не париться. Но если ты держишь что-то серьёзное (форумы, магазины, крупные дорвеи, базы данных, виртуализацию) — NUMA — твой друг и помощник. Грамотная настройка позволит выжать из железа максимум, избежать неожиданных лагов и “мистических” просадок производительности.
Всё, что нужно — проверить топологию (numactl --hardware
), не включать Node Interleaving, и, по возможности, распределять процессы и память по NUMA-нодам. Если не уверен — мониторь numastat
, читай вывод lscpu
и не стесняйся экспериментировать.
Почитать подробнее можно на оф. сайте Linux NUMA: https://www.kernel.org/doc/html/latest/vm/numa.html
И помни: если сервер тормозит без причины — возможно, причина в NUMA!
В этой статье собрана информация и материалы из различных интернет-источников. Мы признаем и ценим работу всех оригинальных авторов, издателей и веб-сайтов. Несмотря на то, что были приложены все усилия для надлежащего указания исходного материала, любая непреднамеренная оплошность или упущение не являются нарушением авторских прав. Все упомянутые товарные знаки, логотипы и изображения являются собственностью соответствующих владельцев. Если вы считаете, что какой-либо контент, использованный в этой статье, нарушает ваши авторские права, немедленно свяжитесь с нами для рассмотрения и принятия оперативных мер.
Данная статья предназначена исключительно для ознакомительных и образовательных целей и не ущемляет права правообладателей. Если какой-либо материал, защищенный авторским правом, был использован без должного упоминания или с нарушением законов об авторском праве, это непреднамеренно, и мы исправим это незамедлительно после уведомления. Обратите внимание, что переиздание, распространение или воспроизведение части или всего содержимого в любой форме запрещено без письменного разрешения автора и владельца веб-сайта. Для получения разрешений или дополнительных запросов, пожалуйста, свяжитесь с нами.