На сервере с двумя процессорами обращение к памяти, подключённой к другому процессору, идёт медленнее.
Почему Потоки и их память оказываются на разных процессорных сокетах → Следствие Обращения к памяти замедляются (в 1,5–2 раза в зависимости от оборудования) → На экране На одинаковом железе процессы работают с разной скоростью
Основной ответственный Команда инфраструктуры · Серверная инфраструктура
Команда инфраструктуры: задачи
Привязать процесс и его память к одному сокету (numactl), а на двухсокетном сервере распределить процессы игрового сервера по сокетам.
На графике
Высоко только у некоторых · время тика по процессам, память по узлам NUMA
Где смотреть
Смотреть через numastat -p PID, на каком узле NUMA лежит память процесса игрового сервера, растут ли numa_miss и other_node в numastat, и сравнивать с узлом CPU, на котором работает процесс
Подтверждает
Только у медленных процессов большая часть памяти лежит на другом узле, чем их CPU, а после перезапуска с привязкой CPU и памяти к одному узлу через numactl разница исчезает
Опровергает
Если размещение по узлам такое же, как у быстрых процессов, а процесс всё равно медленный, причина другая: шумный сосед, троттлинг CPU, нагрузка на сам процесс
Чем проверить
Инструменты инфраструктуры (игровой код не нужен)
Источники
What is NUMA?Linux kernel Память своей ячейки быстрее и имеет большую пропускную способность, обращение к памяти другой (удалённой) ячейки медленнее
numactl(8) — Linux manual pagenumactl --cpunodebind и --membind привязывают CPU и память процесса к определённому узлу NUMA
numastat(8) — Linux manual pagenumactl Счётчики numa_miss (память выделена не на том узле, где её запрашивали) и other_node (на этом узле выделил память процесс, работающий на другом узле), с -p показывает память процесса по узлам