Home » Почему про NUMA стоит знать каждому, кто крутит сервера
Почему про NUMA стоит знать каждому, кто крутит сервера

Почему про 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 схема

Если операционная система и приложения не знают о 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!


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

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

Leave a reply

Your email address will not be published. Required fields are marked