On 01/26/2016 06:04 PM, Max Dmitrichenko wrote:
Всем привет! Такой вот вопрос. Есть NUMA-сервер. Обычный сервак с
двумя процами. По скольку нынче memory controler переехал и северного
моста прямо в CPU, то у каждого проца у нас получается теперь своя
память. А обращение в память соседнего проца получается более дорогим
удовольствием. В связи с этим есть куча утилит и механизмов по
прибиванию процессов, потоков и аллоцируемой памяти к конкретным
процам, нодам или ядрам. Но один вопрос меня смущает - это shared
objects. Ведь они могут быть в памяти в любой ноде и когда происходит
выборка инструкциий с другой ноды приложение испытывает некоторый
пенальти. Есть ли какие-то механизмы, которые контролируют ноду, на
которой размещаются shared object'ы? Или быть может есть какой-то
механизм, который дублирует код shared object'ов на всех нодах?
Из практического: перестать играть в NUMA и включить назад SMP.
Эвристики линукса чаще всего (под нагрузкой) приводят к таким
выкрутасам, что хоть стой, хоть падай.
Выключается в приличных серверах в биосе с помощью опции Interleave для
memory mode. Если нет в биосе - numa=off в опциях ядра.
Пенальти есть, но не очень большое. В сравнении с тем, что выделывает
ядро - просто мелочи. Примеры того, что выделывает ядро: засунуть
горячие страницы в своп, когда пол-памяти свободно; запустить OOM killer
при особо неудачной комбинации больших кусков памяти в каждой из
половинок (между половинками место есть - но объект положить нельзя,
значит, OOM), танцы с всплесками latency на рескедулинге задач между
узлами numa, etc.