Provided by: manpages-ru-dev_4.26.0-1_all bug

НАИМЕНОВАНИЕ

       set_mempolicy - настраивает политику работы с памятью NUMA для потока и его потомков

БИБЛИОТЕКА

       Библиотека политик NUMA (неоднородный доступ к памяти) (libnuma, -lnuma)

ОБЗОР

       #include <numaif.h>

       long set_mempolicy(int mode, const unsigned long *nodemask,
                          unsigned long maxnode);

ОПИСАНИЕ

       Вызов  set_mempolicy()  устанавливает  политику  работы  с  памятью  NUMA  для  вызывающей  нити, которая
       определяется режимом политики и нулём или более узлами (задаются в аргументах mode, nodemask и maxnode).

       Машина с NUMA имеет различные контроллеры памяти с различными расстояниями до определённых ЦП.  Политикой
       памяти задаётся узел, на котором выделяется память для нити.

       Этот  системный  вызов  устанавливает  в  нити  политику по умолчанию. Политика нити управляет выделением
       страниц в адресном пространстве процесса  из  областей  памяти,  которые  не  контролируются  специальной
       политикой,  заданной с помощью mbind(2). Политикой нити по умолчанию также контролируется выделение любых
       страниц для отображаемых в память файлов с помощью вызова mmap(2) с флагом MAP_PRIVATE (которые  читаются
       (загружаются)  только  этой  нитью)  и для отображаемых в память файлов с помощью вызова mmap(2) с флагом
       MAP_SHARED (независимо от типа доступа). Эта политика применяется только когда нить запрашивает выделение
       новой страницы. Для анонимной памяти это применяется, когда страница впервые затрагивается приложением.

       The mode argument must specify one of MPOL_DEFAULT, MPOL_BIND, MPOL_INTERLEAVE, MPOL_WEIGHTED_INTERLEAVE,
       MPOL_PREFERRED, or MPOL_LOCAL (which are described in  detail  below).   All  modes  except  MPOL_DEFAULT
       require the caller to specify the node or nodes to which the mode applies, via the nodemask argument.

       Аргумент mode также может содержать необязательный флаг режима. Поддерживаемые флаги режима:

       MPOL_F_NUMA_BALANCING (начиная с Linux 5.12)
              When  mode  is  MPOL_BIND, enable the kernel NUMA balancing for the task if it is supported by the
              kernel.  If the flag isn't supported by the kernel, or is used with mode other than MPOL_BIND,  -1
              is returned and errno is set to EINVAL.

       MPOL_F_RELATIVE_NODES (начиная с Linux 2.6.26)
              В аргументе nodemask указываются идентификаторы узлов из набора идентификаторов узлов, разрешённых
              процессу текущим контекстом набора процессоров.

       MPOL_F_STATIC_NODES (начиная с Linux 2.6.26)
              В  аргументе nodemask указываются идентификаторы физических узлов. Linux не будет перераспределять
              nodemask, если процесс перемещается в другой контекст  набора  процессоров  или  когда  изменяется
              набор узлов, который доступен процессу согласно текущему контексту набора процессоров.

       В  nodemask  указывается  битовая  маска  идентификаторов  узлов, которая может содержать до maxnode бит.
       Размер битовой маски округляется до следующего значение кратного sizeof(unsigned  long),  но  ядро  будет
       использовать  биты  только  до  maxnode.  Значение  NULL в nodemask или maxnode указывает на пустой набор
       узлов. Если значение maxnode равно нулю, то аргумент nodemask игнорируется.

       Если требуется аргумент nodemask, то его значение должно содержать  не  менее  одного  работающего  узла,
       разрешённого   процессу   из   текущего   контекста  набора  процессоров  (если  не  указан  флаг  режима
       MPOL_F_STATIC_NODES) и имеющего память. Если в  mode  установлен  флаг  MPOL_F_STATIC_NODES  и  требуемое
       значение  nodemask  не  содержит узлов, разрешённых процессу из текущего контекста набора процессоров, то
       политика памяти возвращается обратно к локальному выделению. Это эффективно заменяет  указанную  политику
       до  тех  пор,  пока  в  текущий  контекст  набора процессоров процесса не добавится один или более узлов,
       указанных nodemask.

       Аргумент mode должен включать одно из следующих значений:

       MPOL_DEFAULT
              This mode specifies that any nondefault thread memory policy be removed, so that the memory policy
              "falls back" to the system default policy.  The system default policy is  "local  allocation"—that
              is,  allocate  memory  on  the  node  of  the CPU that triggered the allocation.  nodemask must be
              specified as NULL.  If the "local node" contains no  free  memory,  the  system  will  attempt  to
              allocate memory from a "near by" node.

       MPOL_BIND
              Данный  режим  устанавливает  жёсткую политику, при которой выделение памяти выполняется только на
              узлах, заданных в nodemask. Если в nodemask  указано  более  одного  узла,  то  выделение  страниц
              начнётся  с  узла  с меньшим номером идентификатора и будет выполняться до тех пор, пока на нём не
              кончится свободная память. Затем выделение  продолжится  на  узле  со  следующим  большим  номером
              идентификатора,  указанного  в  nodemask,  и  т.д.  до  тех  пор,  пока на всех указанных узлах не
              закончится свободная память. Страницы не будут выделяться на узлах, не указанных в nodemask.

       MPOL_INTERLEAVE
              В этом режиме выделение страниц чередуется между узлами, указанными в nodemask,  согласно  порядку
              номеров  идентификаторов узлов. При этом происходит оптимизация полосы пропускания, а не задержки,
              так как происходит рассеивание страниц и доступ к этим страницам памяти, разносится по  нескольким
              узлам.  Однако  доступ  к  отдельной  странице  по  прежнему ограничен шириной канала с памятью на
              отдельном узле.

       MPOL_WEIGHTED_INTERLEAVE (начиная с Linux 6.9)
              This mode interleaves page allocations across the nodes specified in  nodemask  according  to  the
              weights in /sys/kernel/mm/mempolicy/weighted_interleave.  For example, if bits 0, 2, and 5 are set
              in    nodemask,    and   the   contents   of   /sys/kernel/mm/mempolicy/weighted_interleave/node0,
              /sys/.../node2, and /sys/.../node5 are 4, 7, and 9, respectively, then pages in this  region  will
              be allocated on nodes 0, 2, and 5 in a 4:7:9 ratio.

       MPOL_PREFERRED
              В  этом  режиме  задаётся  предпочтительный узел для выделения памяти. Ядро будет пытаться сначала
              выделить страницы на этом узле и только после того как на предпочтительном узле не хватит  памяти,
              попробует использовать «ближайшие» узлы. Если в nodemask указано более одного идентификатора узла,
              то в качестве предпочтительного будет использован первый узел из маски. Если в аргументах nodemask
              и  maxnode указан пустой набор, то политике предписывается использовать «локальное выделение» (как
              при системной политике по умолчанию, описанной ранее).

       MPOL_LOCAL (начиная с Linux 3.8)
              Этот режим задаёт «локальное  выделение»  (local  allocation);  память,  выделяется  на  узле  ЦП,
              попавшем в выделение («локальный узел»). В аргументах nodemask и maxnode должен быть указан пустой
              набор.  Если на «локальном узле»  мало свободной памяти, то ядро будет пытаться выделить память на
              других узлах. Ядро будет выделять память на «локальном  узле»  сразу,  как  только  на  этом  узле
              освободится  память.  Если «локальный узел» не разрешён в текущем контексте набора ЦП процесса, то
              ядро будет пытаться выделить памяти на других узлах. Ядро начнёт  выделять  память  на  «локальном
              узле» сразу, как только это будет разрешено в текущем контексте набора ЦП процесса.

       Политика  памяти  нити  сохраняется  при  вызове  execve(2)  и наследуется дочерними нитями, созданными с
       помощью fork(2) или clone(2).

ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ

       При успешном выполнении set_mempolicy() возвращается 0; при ошибке возвращается -1, а в errno  содержится
       код ошибки.

ОШИБКИ

       EFAULT Часть  всего  диапазона  памяти,  заданная  в  nodemask и maxnode, указывает за пределы доступного
              адресного пространства.

       EINVAL mode is invalid.  Or, mode is MPOL_DEFAULT and nodemask is  nonempty,  or  mode  is  MPOL_BIND  or
              MPOL_INTERLEAVE and nodemask is empty.  Or, maxnode specifies more than a page worth of bits.  Or,
              nodemask  specifies one or more node IDs that are greater than the maximum supported node ID.  Or,
              none of the node IDs specified by nodemask are on-line and allowed by the process's current cpuset
              context, or none of the specified nodes contain memory.  Or,  the  mode  argument  specified  both
              MPOL_F_STATIC_NODES  and  MPOL_F_RELATIVE_NODES.  Or, the MPOL_F_NUMA_BALANCING isn't supported by
              the kernel, or is used with mode other than MPOL_BIND.

       ENOMEM Недостаточное количество памяти ядра.

СТАНДАРТЫ

       Linux.

ИСТОРИЯ

       Linux 2.6.7.

ПРИМЕЧАНИЯ

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

       Информация о библиотеке доступна в numa(7).

СМОТРИТЕ ТАКЖЕ

       get_mempolicy(2), getcpu(2), mbind(2), mmap(2), numa(3), cpuset(7), numa(7), numactl(8)

ПЕРЕВОД

       Русский перевод этой страницы руководства разработал(и)  Alexander  Golubev  <fatzer2@gmail.com>,  Azamat
       Hackimov   <azamat.hackimov@gmail.com>,   Hotellook,   Nikita   <zxcvbnm3230@mail.ru>,  Spiros  Georgaras
       <sng@hellug.gr>, Vladislav <ivladislavefimov@gmail.com>, Yuri Kozlov  <yuray@komyakino.ru>,  Иван  Павлов
       <pavia00@gmail.com> и Kirill Rekhov <krekhov.dev@gmail.com>

       Этот  перевод является свободной программной документацией; он распространяется на условиях общедоступной
       лицензии GNU (GNU General Public License - GPL, https://www.gnu.org/licenses/gpl-3.0.html  версии  3  или
       более поздней) в отношении авторского права, но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ.

       Если  вы  обнаружите какие-либо ошибки в переводе этой страницы руководства, пожалуйста, сообщите об этом
       разработчику(ам)  по  его(их)  адресу(ам)  электронной  почты  или  по   адресу   списка рассылки русских
       переводчиков.

Справочные страницы Linux 6.9.1                   2 мая 2024 г.                                 set_mempolicy(2)