Разбираем NUMA, CPU pinning и типичные ошибки настройки виртуализации, которые стоят бизнесу производительности и денег.
Зачем администратору вообще знать про NUMA
Современные серверы давно перестали быть «одной большой коробкой с общей памятью». Под капотом большинства производительных систем – архитектура NUMA (Non-Uniform Memory Access), где каждый процессор или группа процессоров имеет «свою» часть оперативной памяти. Доступ к этой локальной памяти быстрый, к «чужой» – заметно медленнее.
Пока на сервере работает один монолитный сервис, эта особенность может быть почти незаметна. Но как только поверх такого железа запускается виртуальная инфраструктура, правильно учитывать NUMA становится критически важно. Виртуальная машина, чьи vCPU и память «размазаны» по разным NUMA-нодам, легко проигрывает по производительности более скромной конфигурации, но корректно уложенной в одну ноду.
Как NUMA ломает производительность виртуальных машин
Виртуальная машина ничего не знает о физической топологии сервера: для неё есть просто набор vCPU и некоторый объем оперативной памяти. Этой «картинкой» управляет гипервизор, и именно он решает, к каким физическим ядрам и к каким участкам памяти будут привязаны ресурсы ВМ.
Проблема начинается, когда размер виртуальной машины превышает возможности одной NUMA-ноды – по ядрам или памяти. Гипервизору приходится «распиливать» ВМ: часть её vCPU и часть памяти оказываются на одной ноде, остальное – на другой. Каждый запрос виртуального процессора к «чужой» памяти превращается в удаленный доступ (remote memory access) с дополнительными задержками.
В результате:
– ВМ с формально мощной конфигурацией работает как будто на старом сервере с общей шиной.
– Рост задержек не всегда видно по загрузке CPU: процессор простаивает, а приложение «дергается» из-за медленного доступа к памяти.
– При росте числа таких ВМ проблема усиливается: межнодовое взаимодействие превращается в постоянный штраф к производительности.
Вывод простой: без учёта NUMA даже дорогой сервер можно заставить работать как бюджетную платформу.
CPU pinning: точный инструмент или источник новых проблем
CPU pinning (CPU affinity) – любимый инструмент администраторов, которые хотят полного контроля. Его суть в том, что vCPU виртуальной машины жестко привязываются к конкретным физическим ядрам, а гипервизор теряет право перемещать эти vCPU между ядрами по своему усмотрению.
У этого подхода есть очевидные плюсы:
– гарантированный доступ к ресурсам: нет конкуренции с другими ВМ за те же ядра;
– предсказуемость задержек – важный фактор для баз данных и real-time-систем;
– упрощенная диагностика: если производительность «просела», понятно, где искать причины.
Но есть и издержки, о которых часто забывают:
– снижается гибкость планировщика гипервизора – он не может перераспределить нагрузку, даже если часть ядер простаивает;
– растёт риск фрагментации ресурсов: свободные ядра есть, но они распределены так, что новой ВМ просто некуда «аккуратно» встать;
– конфигурация становится хрупкой: любое изменение профиля нагрузок требует ручного пересмотра схемы привязки.
На практике CPU pinning оправдан для узкого класса задач – критичные системы с жесткими SLA, чувствительные к задержкам, или сценарии, где нужна строгая изоляция. Для массовых корпоративных нагрузок чаще выгоднее использовать возможности встроенного планировщика гипервизора и только мягко ограничивать его, исходя из понимания NUMA-топологии.
Типичные ошибки при настройке NUMA и pinning
Экспертный опыт показывает несколько повторяющихся сценариев, которые регулярно «убивают» производительность виртуальной инфраструктуры:
1. «Супер-ВМ» больше одной NUMA-ноды.
Создается крупная ВМ, которая физически не помещается в одну ноду. Гипервизор вынужден распределить ее между нодами, и большинство обращений к памяти становятся удаленными.
2. Привязка vCPU к логическим, а не физическим ядрам.
При наличии Hyper-Threading администратор связывает vCPU с ядрами, которые на самом деле являются парой одного физического ядра. В итоге два виртуальных процессора конкурируют за один исполнительный блок.
3. Конфликт ручных настроек и логики гипервизора.
Одновременно включены политики «широкого» распределения нагрузки и жесткий pinning. Планировщик оказывается связан по рукам и ногам.
4. Отсутствие резервирования памяти.
Даже идеально выровненная по NUMA и CPU ВМ начинает активно использовать swap из-за нехватки физической памяти на хосте.
Все эти ошибки не являются редкостью – это реальные кейсы, которые приводят к заметным потерям производительности.
Как диагностировать проблемы NUMA
NUMA-проблемы можно не только почувствовать, но и измерить. Для этого стоит использовать инструменты как внутри гостевой ОС, так и на стороне гипервизора.
На уровне ВМ полезны:
numastat – показывает долю обращений к локальной и удаленной памяти;
lstopo / hwloc – визуализирует топологию и помогает понять, «разорвана» ли ВМ между нодами;
perf – позволяет оценить влияние удалённого доступа к памяти на конкретное приложение.
На уровне гипервизора:
в VMware ESXi режим esxtop по памяти и CPU помогает увидеть объем удаленной памяти, время ожидания ресурсов и аномальные задержки;
в KVM можно анализировать статистику numastat на хосте и привязку процессов qemu-kvm к нодам.
Если диагностика показывает, что ВМ активно использует удалённую память, первые шаги очевидны: уменьшить ее размер до границ одной ноды, включить vNUMA, при необходимости аккуратно применить CPU pinning и настроить гарантии по памяти для критичных машин.
Практические рекомендации
Подводя итог, можно сформулировать несколько практических правил, которые помогут избежать типичных проблем:
– планируя крупные ВМ, всегда соотносите их параметры с конфигурацией одной NUMA-ноды;
– используйте CPU pinning только там, где это действительно нужно, и с учетом физической топологии процессора;
– не воспринимайте все логические ядра как равнозначные – учитывайте Hyper-Threading;
– не мешайте планировщику гипервизора без веской причины, а если вводите ручные ограничения – отключайте конфликтующие политики;
– для критичных сервисов задавайте резервирование памяти и, при необходимости, процессорных ресурсов.
Правильный учёт NUMA и взвешенное использование CPU pinning позволяют получить от существующего «железа» заметно больше, чем кажется по спецификациям. В условиях 2026 года, когда модернизация инфраструктуры ограничена доступностью и стоимостью оборудования, это один из самых эффективных способов повысить производительность без масштабных капитальных вложений.
Теги: виртуализация, NUMA, CPU pinning, память, Байт, ИТ, сервер.

