move_pages -
перемещает
отдельные
страницы
процесса
на другой
узел
NUMA (Non-Uniform Memory Access) policy library (
libnuma,
-lnuma)
#include <numaif.h>
long move_pages(int pid, unsigned long count, void *pages[.count],
const int nodes[.count], int status[.count], int flags);
Вызов
move_pages()
перемещает
указанные
в
pages
страницы
процесса с
pid в память
узлов,
заданных в
nodes.
Результат
перемещения
отражается
в
status. В
flags
задаются
ограничения
на
перемещаемые
страницы.
Значение
pid
представляет
собой
идентификатор
процесса, в
котором
перемещаются
страницы.
Если
pid
равен 0, то
move_pages()
перемещается
страницы
вызывающего
процесса.
Для
перемещения
страниц в
другом
процессе
требуются
следующие
права:
- •
- Up to and including Linux 4.12: the caller must be
privileged ( CAP_SYS_NICE) or the real or effective user ID of the
calling process must match the real or saved-set user ID of the target
process.
- •
- Старые
правила
позволяли
вызывающему
обнаруживать
различные
виртуальные
адреса,
выбранные
ядром, что
лишает
смысла
случайность
расположения
раскладки
адресного
пространства
процесса,
принадлежащему
тому же UID
что и
вызывающий;
правила
были
изменены в
Linux 4.13. Начиная
с Linux 4.13, права
регулируются
проверкой
режима
доступа ptrace
PTRACE_MODE_READ_REALCREDS
целевого
процесса;
смотрите
ptrace(2).
В
аргументе
count задаётся
количество
перемещаемых
страниц. Он
определяет
размер
трёх
массивов:
pages,
nodes и
status.
Аргумент
pages
представляет
собой
массив
указателей
на
страницы,
которые
должны
быть
перемещены.
Данные
указатели
должны
быть
выровнены
на границу
страницы.
Адреса
указываются
в том же
виде, в
каком
доступны
процессу с
заданным
pid.
Аргумент
nodes
представляет
собой
массив
целых,
которыми
задаются
желаемые
местоположения
каждой
страницы.
Каждый
элемент
массива
представляет
собой
номер узла.
Также,
значением
nodes может
быть NULL; в
этом
случае
move_pages()
не
перемещает
страницы, а
записывает
в массив
status
номер узла,
на котором
расположена
каждая
страница в
данный
момент.
Получение
состояния
каждой
страницы
может
потребоваться
для
определения
страниц,
которые
нужно
переместить.
status is an array of integers that return the status of each page. The
array contains valid values only if
move_pages() did not return an
error. Preinitialization of the array to a value which cannot represent a real
numa node or valid error of status array could help to identify pages that
have been migrated.
В
аргументе
flags
указываются
типы
перемещаемых
страниц.
Флаг
MPOL_MF_MOVE
означает,
что будут
перемещены
только
страницы,
которые
монопольно
используются
процессом.
Флаг
MPOL_MF_MOVE_ALL
означает,
что также
будут
перемещены
страницы,
которые
используются
совместно
с другими
процессами.
Для
использования
флага
MPOL_MF_MOVE_ALL
процесс
должен
быть
привилегированным
(
CAP_SYS_NICE).
В каждом
элементе
массива
status
могут
возвращаться
следующие
значения:
- 0..MAX_NUMNODES
- Номер
узла, в
котором
расположена
страница.
- -EACCES
- Страница
отображается
несколькими
процессами
и может
быть
перемещена
только,
если
указан
флаг MPOL_MF_MOVE_ALL.
- -EBUSY
- Страница
в данный
момент
занята и не
может быть
перемещена.
Попробуйте
позднее.
Такое
случается,
если со
страницей
выполняется
операция
ввода-вывода
или другая
подсистема
ядра
удерживается
ссылку на
эту
страницу.
- -EFAULT
- Это
нулевая
страница
или
область
памяти не
отображена
процессом.
- -EIO
- Не
удалось
выполнить
обратную
запись на
страницу.
Для
перемещения
требуется
выполнить
обратную
запись, так
как данные
страницы
неактуальны
(dirty), но
файловая
система не
предоставляет
функцию
переноса
(migration), которая
позволила
бы
переместить
неактуальные
страницы.
- -EINVAL
- Нельзя
переместить
неактуальные
страницы.
Файловая
система не
предоставляет
функцию
переноса
(migration), поэтому
нет
возможности
выполнить
обратную
запись на
страницы.
- -ENOENT
- Страница
отсутствует.
- -ENOMEM
- Не
удалось
выделить
память на
узле
назначения.
On success
move_pages() returns zero. On error, it returns -1, and sets
errno to indicate the error. If positive value is returned, it is the
number of nonmigrated pages.
- Positive value
- The number of nonmigrated pages if they were the result of
nonfatal reasons (since Linux 4.17).
- E2BIG
- Слишком
много
перемещаемых
страниц.
Начиная с Linux
2.6.29, ядро не
генерирует
эту
ошибку.
- EACCES
- Один из
узлов
назначения
не
разрешён
для
текущего
набора ЦП.
- EFAULT
- Недоступен
массив
параметров.
- EINVAL
- Указаны
флаги,
отличные
от MPOL_MF_MOVE и MPOL_MF_MOVE_ALL,
или
предпринята
попытка
переместить
(migrate) страницы
нити ядра.
- ENODEV
- Один из
узлов
назначения
недоступен
(not online).
- EPERM
- Вызывающий
указал
флаг MPOL_MF_MOVE_ALL, но
у него не
хватает
привилегий
( CAP_SYS_NICE). Или
вызывающий
попытался
переместить
страницы
процесса,
принадлежащие
другому
пользователю,
но не имеет
привилегий
для этого (
CAP_SYS_NICE).
- ESRCH
- Процесс
не
существует.
move_pages() first appeared in Linux 2.6.18.
Данный
вызов есть
только в Linux.
Информация
о
библиотеке
доступна в
numa(7).
Используйте
get_mempolicy(2) с
флагом
MPOL_F_MEMS_ALLOWED
для
получения
набора
узлов,
которые
доступны в
текущем
наборе ЦП.
Заметим,
что эта
информация
может
измениться
в любое
время
вручную
или при
автоматической
перенастройке
набора ЦП.
Использование
этого
вызова
может
привести к
тому, что
расположение
страниц (на
узле)
нарушит
политику
памяти,
установленную
для
заданных
адресов (см.
mbind(2)) и/или
заданного
процесса
(см.
set_mempolicy(2)). То
есть
политика
памяти не
ограничивает
узлы
назначения,
используемые
move_pages().
Заголовочный
файл
<numaif.h> не
включён в glibc,
его можно
найти в
пакете с
именем
libnuma-devel
или
подобным
названием.
get_mempolicy(2),
mbind(2),
set_mempolicy(2),
numa(3),
numa_maps(5),
cpuset(7),
numa(7),
migratepages(8),
numastat(8)
Русский
перевод
этой
страницы
руководства
был сделан
aereiae <
[email protected]>, Alexey <
[email protected]>, Azamat
Hackimov <
[email protected]>, Dmitriy S. Seregin
<
[email protected]>, Dmitry Bolkhovskikh <
[email protected]>,
ITriskTI <
[email protected]>, Max Is <
[email protected]>, Yuri
Kozlov <
[email protected]>, Иван
Павлов <
[email protected]>
и Малянов
Евгений
Викторович
<
[email protected]>
Этот
перевод
является
бесплатной
документацией;
прочитайте
Стандартную
общественную
лицензию GNU
версии 3
или более
позднюю,
чтобы
узнать об
условиях
авторского
права. Мы не
несем
НИКАКОЙ
ОТВЕТСТВЕННОСТИ.
Если вы
обнаружите
ошибки в
переводе
этой
страницы
руководства,
пожалуйста,
отправьте
электронное
письмо на
[email protected]