Именованная разделяемая память для Linux с поддержкой NUMA
Windows API предлагает функцию CreateFileMappingNuma ( http://msdn.microsoft.com/en-us/library/windows/desktop/aa366539(v=vs.85).aspx) для создания именованного пространства общей памяти в конкретной NUMA узел.
Пока что я не нашел эквивалентной функции для Linux.
Мой текущий подход выглядит так:
- Выделить именованную разделяемую память (используя shm_open(...))
- Определить текущий узел NUMA (используя numa_move_pages(...))
- Переместить страницы на целевой узел (снова используя numa_move_pages(...))
Кто-нибудь знает лучший подход?
РЕДАКТИРОВАТЬ: Для записи: моя предлагаемая реализация работает как ожидалось!
1 ответ
Это звучит правильно. Обратите внимание, что в той точке, где вы вызываете shm_open()/fruncate(), нет страниц, выделенных (не забудьте ftruncate (), чтобы установить размер!). Ядро просто создает vma и ожидает будущих обращений к коду, чтобы сбить страницы в физической памяти. Поэтому вызов numa_move_pages() в этом состоянии, вероятно, будет иметь эффект создания и заполнения новых страниц в соответствующих узлах NUMA.