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.


Ответить