numa(7) обзор архитектуры с неравномерной памятью (Non-Uniform Memory

ОПИСАНИЕ

Неравномерный доступ к памяти (NUMA) приписывают микропроцессорным системам, у которых память разделяется на узлы. Время доступа к узлу памяти зависит от относительного расположения обращающегося ЦП к узлу (в этом отличие от симметричных мультипроцессорных систем, в которых время доступа ко всей памяти одинаково для всех ЦП). Обычно, каждый ЦП в системе NUMA имеет свой локальный узел памяти, чьё содержимое можно получить быстрее, чем из памяти локального узла другого ЦП или из памяти шины, которая доступна для всех ЦП.

Системные вызовы NUMA

В ядре Linux реализованы следующие системные вызовы, относящиеся к NUMA: get_mempolicy(2), mbind(2), migrate_pages(2), move_pages(2) и set_mempolicy(2). Однако, приложения, обычно, должны использовать интерфейс, предоставляемый библиотекой libnuma; смотрите «Поддержка в библиотеках» далее.

/proc/[число]/numa_maps (начиная с Linux 2.6.14)

В этом файле содержится информация о политике и выделении памяти NUMA для процесса.

В каждой строке содержится информация области памяти, используемом процессом, отражающей, помимо прочего, применяемую политику памяти для этой области и какие страничные узлы были выделены.

Файл numa_maps доступен только на чтение. При чтении /proc/<pid>/numa_maps ядро сканирует виртуальное адресное пространство процесса и выдаёт как используется память. Одна строка соответствует уникальной области памяти процесса.

В первом поле каждой строки содержится начальный адрес области памяти. Это поле позволяет провести параллель с файлом /proc/<pid>/maps, в котором содержится конечный адрес области и другая информация, такая как права доступа и данные о совместном использовании.

Во втором поле показана политика памяти, которая применена к области в настоящее время. Заметим, что применённая политика необязательно является политикой, установленной процессом для этой области памяти. В частности, если для этой области процесс установил политику «default» (по умолчанию), то применяемая политика для этой области будет политикой процесса, которая может совпадать, а может и не совпадать с «default».

В оставшейся части строки содержится информация о страницах, выделенных в области памяти:

N<узел>=<кол-во_страниц>
Количество страниц, выделенных на <узле>. В <кол-во_страниц> учитываются только страницы, отображённые процессом в настоящий момент. Перемещение (migration) страниц и возвращение памяти может приводить к временному неотображению страниц, связанных с этой областью памяти. Такие страницы могут появиться снова только после того, как процесс попытается обратиться к ним. Если область памяти считается общей или является отображением файла, то для других процессов в это же время могут быть показаны дополнительные страницы, отображённые в соответствующее адресное пространство.
file=<имя_файла>
Файл, отображаемый в область памяти. Если файл отображён как закрытый (private), попытка записи может сгенерировать страницы COW (копирование при записи) в этой области памяти. Эти страницы показываются как анонимные.
heap
Область памяти, используемая под кучу.
stack
Область памяти, используемая под стек.
huge
Область огромной памяти. Показывает количество огромных страниц, а не страниц обычного размера.
anon=<страниц>
Количество анонимных страниц в области.
dirty=<страниц>
Количество грязных (dirty) страниц.
mapped=<страниц>
Общее количество отображённых страниц, если оно отличается от количества страниц dirty и anon.
mapmax=<количество>
Максимальный mapcount (количество процессов, отображающих одну страницу) обнаруженный при сканировании. Может использоваться как индикатор степени совместного использования заданной области памяти.
swapcache=<количество>
Количество страниц, связанных с участками на устройстве подкачки.
active=<страниц>
Количество страниц в активном списке. Это поле показывается только, если его значение отличается от количества страниц в этой области. Это означает, что в области памяти существует несколько неактивных страниц, которые могут быть скоро удалены swapper.
writeback=<страниц>
Количество страниц, которые в настоящий момент записываются на диск.

СООТВЕТСТВИЕ СТАНДАРТАМ

Интерфейсы NUMA не описаны в стандартах.

ЗАМЕЧАНИЯ

Системные вызовы Linux NUMA и интерфейс /proc доступны только, если ядро было собрано в включённым параметром CONFIG_NUMA.

Поддержка в библиотеках

Выполняйте компоновку с -lnuma. Библиотека libnuma и требуемый заголовочный файл <numaif.h> доступны в пакете numactl.

Однако, приложения не должны использовать эти системные вызовы напрямую. Вместо этого, рекомендуется использовать интерфейс высокого уровня, предоставляемый функциями numa(3) из пакета numactl. Пакет numactl доступен по адресу Пакет также включён в некоторые дистрибутивы Linux. Некоторые дистрибутивы помещают библиотеку для разработки и заголовочные файлы в пакет numactl-devel.