numa - обзор
архитектуры
с
неравномерной
памятью (Non-Uniform Memory
Architecture)
Неравномерный
доступ к
памяти (NUMA)
приписывают
микропроцессорным
системам, у
которых
память
разделяется
на узлы.
Время
доступа к
узлу
памяти
зависит от
относительного
расположения
обращающегося
ЦП к узлу (в
этом
отличие от
симметричных
мультипроцессорных
систем, в
которых
время
доступа ко
всей
памяти
одинаково
для всех ЦП).
Обычно,
каждый ЦП в
системе NUMA
имеет свой
локальный
узел
памяти, чьё
содержимое
можно
получить
быстрее,
чем из
памяти
локального
узла
другого ЦП
или из
памяти
шины,
которая
доступна
для всех ЦП.
В ядре Linux
реализованы
следующие
системные
вызовы,
относящиеся
к NUMA:
get_mempolicy(2),
mbind(2),
migrate_pages(2),
move_pages(2) и
set_mempolicy(2). Однако,
приложения,
обычно,
должны
использовать
интерфейс,
предоставляемый
библиотекой
libnuma;
смотрите
«Поддержка
в
библиотеках»
далее.
В этом
файле
содержится
информация
о политике
и
выделении
памяти NUMA для
процесса.
Each line contains information about a memory range used by the process,
displaying—among other information—the effective memory policy
for that memory range and on which nodes the pages have been allocated.
Файл
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
доступен
по адресу
ftp://oss.sgi.com/www/projects/libnuma/download/
Пакет
также
включён в
некоторые
дистрибутивы
Linux.
Некоторые
дистрибутивы
помещают
библиотеку
для
разработки
и
заголовочные
файлы в
пакет
numactl-devel.
get_mempolicy(2),
mbind(2),
move_pages(2),
set_mempolicy(2),
numa(3),
cpuset(7),
numactl(8)
Русский
перевод
этой
страницы
руководства
был сделан Alex
Nik <
[email protected]>, Azamat Hackimov
<
[email protected]>, Dmitry Bolkhovskikh
<
[email protected]>, Yuri Kozlov <
[email protected]> и
Иван
Павлов <
[email protected]>
Этот
перевод
является
бесплатной
документацией;
прочитайте
Стандартную
общественную
лицензию GNU
версии 3
или более
позднюю,
чтобы
узнать об
условиях
авторского
права. Мы не
несем
НИКАКОЙ
ОТВЕТСТВЕННОСТИ.
Если вы
обнаружите
ошибки в
переводе
этой
страницы
руководства,
пожалуйста,
отправьте
электронное
письмо на
[email protected]