Создать именованную общую память на определенном узле NUMA?
Как и в этом посте, я хотел бы создать именованный сегмент общей памяти (созданный с помощью shm_open()
+ mmap()
в CentOS 7) на конкретном узле NUMA (не обязательно локальном). Пост предложил, чтобы это было достигнуто с помощью numa_move_pages()
,
У меня есть еще несколько вопросов:
если позже запускается другой процесс (работающий на ядре, локальном для другого NUMA), и
mmap()
Будет ли ОС перемещать именованный сегмент совместно используемой памяти в NUMA, локальный для этого процесса? Если да, как я могу предотвратить это?Есть ли какая-либо другая ситуация, когда именованный сегмент совместно используемой памяти будет перемещен в другую NUMA после того, как я укажу через
numa_move_pages()
?Учитывая именованный сегмент общей памяти в
/shm/dev
Как я могу проверить, к какому узлу NUMA он принадлежит?
Я смотрел в numactl
, И его --membind
опция закрыта для того, что я хочу, но я не уверен, что эффект, если два разных процесса используют --membind
до 2 разных узлов. Кто выигрывает? Я думаю, что я могу проверить это, если № 3 получен ответ.
Спасибо!
1 ответ
Я хочу только ответить на пункт 1 и 3.
Точка 1:
Насколько я помню от своих учителей и что эта ссылка говорит: страница на машине NUMA может быть перемещена ближе всего к наиболее вызывающему ЦП. Другими словами: если ваша страница размещена в банке 0, но центральный процессор, который напрямую связан с банком 1, использует его гораздо чаще, то ваша страница перемещается в банк 1.
Пункт 3:
Учитывая именованную общую память, я не знаю, как вы получаете вызывающий узел numa, но учитывая указатель, который находится в этой общей памяти, вы можете получить его политику памяти, вызвав: get_mempolicy()
если flags указывает MPOL_F_ADDR, то возвращается информация о политике, управляющей адресом памяти, указанной в addr. Эта политика может отличаться от политики процесса по умолчанию, если mbind(2) или одна из вспомогательных функций, описанных в numa(3), использовались для установки политики для диапазона памяти, содержащего addr.
со страницы руководства get_mempolicy()
Вот