Man page - set_mempolicy(2)

Packages contains this manual

Available languages:

en fr ja ru ro

Manual

SET_MEMPOLICY

名 前
書 式
説 明
返 り 値
エ ラ ー
バ ー ジ ョ ン
準 拠
注 意
関 連 項 目
こ の 文 書 に つ い て

名 前

set_mempolicy - ス レ ッ ド と そ の 子 ス レ ッ ド の NUMA メ モ リ ー の デ フ ォ ル ト ポ リ シ ー を 設 定 す る

書 式

#include <numaif.h>

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

-lnuma で リ ン ク す る 。

説 明

set_mempolicy () は 、 呼 び 出 し 元 ス レ ッ ド の NUMA ポ リ シ ー を policy に 設 定 す る 。 NUMA ポ リ シ ー は ポ リ シ ー モ ー ド と 0 個 以 上 の ノ ー ド か ら 構 成 さ れ 、 設 定 内 容 は 引 数 mode , nodemask , maxnode に よ り 指 定 さ れ る 。

NUMA (非 対 称 メ モ リ ー ア ク セ ス ) マ シ ン で は 、 CPU に よ り メ モ リ ー コ ン ト ロ ー ラ ー が 異 な り 、 距 離 も 異 な っ て い る 。 メ モ リ ー ポ リ シ ー は 、 ど の ノ ー ド か ら メ モ リ ー を そ の ス レ ッ ド に 割 り 当 て る か を 定 め る も の で あ る 。

set_mempolicy () は 、 ス レ ッ ド の デ フ ォ ル ト ポ リ シ ー を 定 め る 。 ス レ ッ ド の ポ リ シ ー は 、 mbind (2) で 設 定 さ れ る 特 定 の ポ リ シ ー に よ り 制 御 さ れ る メ モ リ ー 領 域 以 外 の ス レ ッ ド の ア ド レ ス 空 間 に お け る ペ ー ジ の 割 り 当 て に 適 用 さ れ る 。 ス レ ッ ド の デ フ ォ ル ト ポ リ シ ー は 、 MAP_PRIVATE フ ラ グ を 指 定 し た mmap (2) を 使 っ て マ ッ プ さ れ た メ モ リ ー マ ッ プ フ ァ イ ル に 対 す る 読 み 出 し 専 用 (ロ ー ド さ れ る だ け ) の ペ ー ジ の 割 り 当 て に も 適 用 さ れ る 。 ま た 、 MAP_SHARED フ ラ グ を 指 定 し た mmap (2) を 使 っ て マ ッ プ さ れ た メ モ リ ー マ ッ プ フ ァ イ ル に 対 す る ペ ー ジ の 割 り 当 て に も 適 用 さ れ る (こ の 場 合 は ペ ー ジ の ア ク セ ス 種 別 に 関 わ ら ず 適 用 さ れ る ) 。 設 定 し た ポ リ シ ー は 、 ス レ ッ ド に 新 規 の ペ ー ジ が 割 り 当 て ら れ る と き に の み 適 用 さ れ る 。 無 名 メ モ リ ー (anonymous memory) の 場 合 、 新 規 ペ ー ジ の 割 り 当 て は ア プ リ ケ ー シ ョ ン が 初 め て ペ ー ジ に ア ク セ ス し た 際 に 行 わ れ る 。

mode 引 数 に は 、 MPOL_DEFAULT , MPOL_BIND , MPOL_INTERLEAVE , MPOL_PREFERRED , MPOL_LOCAL (詳 細 は 下 記 参 照 ) の い ず れ か 一 つ を 指 定 し な け れ ば な ら な い 。 MPOL_DEFAULT 以 外 の ポ リ シ ー モ ー ド の 場 合 、 呼 び 出 し 元 は nodemask 引 数 で そ の ポ リ シ ー モ ー ド を 適 用 す る ノ ー ド を 指 定 す る 必 要 が あ る 。

mode 引 数 に は 、 追 加 で モ ー ド フ ラ グ を 含 め る こ と も で き る 。 サ ポ ー ト さ れ て い る モ ー ド フ ラ グ は 以 下 の 通 り で あ る 。
MPOL_F_STATIC_NODES
(Linux 2.6.26 以 降 )

空 で な い nodemask は 、 物 理 ノ ー ド ID で あ る 。 Linux で は 、 そ の プ ロ セ ス が 異 な る CPU 集 合 コ ン テ キ ス ト (cpuset context) に 移 動 し た 場 合 で も 、 そ の プ ロ セ ス の 現 在 の CPU 集 合 コ ン テ キ ス ト で 許 可 さ れ て い る ノ ー ド 集 合 が 変 化 し た 場 合 で も 、 nodemask を マ ッ ピ ン グ し 直 す こ と は な い 。

MPOL_F_RELATIVE_NODES (Linux 2.6.26 以 降 )

空 で な い nodemask は 、 そ の プ ロ セ ス の 現 在 の CPU 集 合 で 許 可 さ れ て い る ノ ー ド ID 集 合 に お け る 相 対 的 な ノ ー ド ID で あ る 。

nodemask は 、 最 大 で maxnode ビ ッ ト か ら 構 成 さ れ る ノ ー ド ID の ビ ッ ト マ ス ク を 指 す 。 ビ ッ ト マ ス ク の 大 き さ は 、 直 近 の sizeof(unsigned long) の 倍 数 に 切 り 上 げ ら れ る が 、 カ ー ネ ル が 使 用 す る の は maxnode 個 ま で の ビ ッ ト だ け で あ る 。 NULL 値 の nodemask も し く は 値 が 0 の maxnode は ノ ー ド の 空 集 合 を 表 す 。 maxnode の 値 が 0 の 場 合 、 nodemask 引 数 は 無 視 さ れ る 。

nodemask が 必 須 の 場 面 で は 、 nodemask に 、 オ ン ラ イ ン で 、 そ の プ ロ セ ス の 現 在 の CPU 集 合 コ ン テ キ ス ト で 許 可 さ れ て お り ( MPOL_F_STATIC_NODES モ ー ド フ ラ グ が 指 定 さ れ て い な い 場 合 )、 メ モ リ ー が あ る ノ ー ド が 少 な く と も 一 つ 入 っ て い な け れ ば な ら な い 。 mode MPOL_F_STATIC_NODES が セ ッ ト さ れ 、 nodemask が 必 須 の 場 面 で 、 nodemask に 、 そ の プ ロ セ ス の 現 在 の CPU 集 合 コ ン テ キ ス ト で 許 可 さ れ た ノ ー ド が 一 つ も 含 ま れ て い な い 場 合 に は 、 メ モ リ ー の ポ リ シ ー と し て デ フ ォ ル ト の 「 ロ ー カ ル か ら 割 り 当 て (local allocation)」 が 適 用 さ れ る 。 そ の プ ロ セ ス の CPU 集 合 コ ン テ キ ス ト が nodemask で 指 定 さ れ た ノ ー ド を 少 な く と も 一 つ 含 む よ う に な る ま で は 、 結 果 的 に 指 定 さ れ た 動 作 が 上 書 き さ れ る こ と に な る 。

mode 引 数 に は 、 以 下 の 値 の い ず れ か ひ と つ を 含 め な け れ ば な ら な い 。
MPOL_DEFAULT

こ の モ ー ド は 、 デ フ ォ ル ト で は な い ス レ ッ ド の メ モ リ ー ポ リ シ ー を 削 除 す る こ と を 指 定 す る も の で あ る 。 こ れ に よ り 、 メ モ リ ー ポ リ シ ー は シ ス テ ム の デ フ ォ ル ト ポ リ シ ー に 「 戻 る 」 こ と に な る 。 シ ス テ ム の デ フ ォ ル ト ポ リ シ ー は 「 ロ ー カ ル か ら の 割 り 当 て (local allocation)」 、 つ ま り メ モ リ ー 割 り 当 て の き っ か け と な っ た CPU の ノ ー ド の メ モ リ ー が 割 り 当 て ら れ る 。 nodemask に は NULL を 指 定 し な け れ ば な ら な い 。 「 自 ノ ー ド (local node)」 に 空 き メ モ リ ー が 全 く な い 場 合 、 シ ス テ ム は 「 近 く の (near by) ノ ー ド 」 か ら メ モ リ ー を 割 り 当 て よ う と 試 み る 。

MPOL_BIND

こ の モ ー ド は 厳 密 な ポ リ シ ー で 、 メ モ リ ー 割 り 当 て は nodemask に 指 定 さ れ た ノ ー ド に 限 定 さ れ る 。 nodemask に 2 個 以 上 の ノ ー ド が 指 定 さ れ た 場 合 、 ペ ー ジ の 割 り 当 て は ノ ー ド ID が 数 字 と し て 最 小 の ノ ー ド か ら 開 始 さ れ 、 そ の ノ ー ド に 空 き メ モ リ ー が な く な る ま で そ の ノ ー ド か ら ペ ー ジ 割 り 当 て が 行 わ れ る 。 そ の ノ ー ド に 空 き メ モ リ ー が な く な っ た ら 、 次 に 小 さ な ノ ー ド ID を 持 つ ノ ー ド か ら ペ ー ジ 割 り 当 て が 行 わ れ る 。 こ れ を 、 nodemask で 指 定 さ れ た 全 て の ノ ー ド で 空 き メ モ リ ー が な く な る ま で 繰 り 返 す 。 nodemask で 指 定 さ れ た 以 外 の ノ ー ド か ら は ペ ー ジ の 割 り 当 て は 行 わ れ な い 。

MPOL_INTERLEAVE

こ の モ ー ド で は 、 ペ ー ジ 割 り 当 て を nodemask に 指 定 さ れ た ノ ー ド の 間 で ノ ー ド ID の 数 字 順 で 交 互 に 行 う 。 こ の ポ リ シ ー で は 、 複 数 の ノ ー ド に ペ ー ジ を 広 げ て 配 置 し 、 こ れ ら の ペ ー ジ へ の メ モ リ ー ア ク セ ス を 分 散 す る こ と で 、 遅 延 で は な く 、 帯 域 を 最 適 化 す る 。 た だ し 、 一 つ の ペ ー ジ へ の ア ク セ ス に 関 し て は 依 然 と し て 一 つ の ノ ー ド の メ モ リ ー 帯 域 が 上 限 と な る 。

MPOL_PREFERRED

こ の モ ー ド は 、 割 り 当 て 時 に 優 先 さ れ る ノ ー ド (preferred node) を 設 定 す る 。 カ ー ネ ル は ま ず 優 先 ノ ー ド か ら ペ ー ジ 割 り 当 て を 行 お う と し 、 優 先 ノ ー ド に 空 き メ モ リ ー が 少 な い 場 合 に 「 近 く の (near by)」 ノ ー ド か ら 割 り 当 て を 行 う 。 nodemask に 複 数 の ノ ー ド ID が 指 定 さ れ た 場 合 は 、 nodemask 内 の 最 初 の ノ ー ド が 優 先 ノ ー ド と し て 選 択 さ れ る 。 引 数 nodemask , maxnode で 空 集 合 が 指 定 さ れ た 場 合 は 、 ポ リ シ ー は (上 述 の シ ス テ ム の デ フ ォ ル ト ポ リ シ ー と 同 様 に ) 「 ロ ー カ ル か ら の 割 り 当 て 」 と な る 。

MPOL_LOCAL (Linux 3.8 以 降 )

This mode specifies "local allocation"; the memory is allocated on the node of the CPU that triggered the allocation (the "local node"). The nodemask and maxnode arguments must specify the empty set. If the "local node" is low on free memory, the kernel will try to allocate memory from other nodes. The kernel will allocate memory from the "local node" whenever memory for this node is available. If the "local node" is not allowed by the process’s current cpuset context, the kernel will try to allocate memory from other nodes. The kernel will allocate memory from the "local node" whenever it becomes allowed by the process’s current cpuset context.

ス レ ッ ド の メ モ リ ー ポ リ シ ー は execve (2) の 前 後 で 保 持 さ れ 、 fork (2) や clone (2) を 使 っ て 作 成 さ れ た 子 ス レ ッ ド に 継 承 さ れ る 。

返 り 値

成 功 す る と 、 set_mempolicy () は 0 を 返 す 。 エ ラ ー の 場 合 、 -1 を 返 し 、 errno に エ ラ ー を 示 す 値 を 設 定 す る 。

エ ラ ー

EFAULT

nodemask maxnode で 指 定 さ れ た メ モ リ ー 領 域 の 一 部 ま た は 全 部 が 、 呼 び 出 し 元 が ア ク セ ス 可 能 な ア ド レ ス 空 間 外 を 指 し て い る 。

EINVAL

mode が 不 正 で あ る 。 mode MPOL_DEFAULT で 、 nodemask が 空 で は な い 。 mode MPOL_BIND MPOL_INTERLEAVE で 、 nodemask が 空 で あ る 。 maxnode で 実 際 に 意 味 が あ る ビ ッ ト 数 よ り 多 く の ビ ッ ト 数 が 指 定 さ れ た 。 nodemask に 、 サ ポ ー ト さ れ て い る 最 大 ノ ー ド ID よ り 大 き い ノ ー ド が 指 定 さ れ た 。 nodemask に 、 オ ン ラ イ ン で 、 か つ そ の プ ロ セ ス の 現 在 の CPU 集 合 コ ン テ キ ス ト で 許 可 さ れ て い る ノ ー ド が 一 つ も 含 ま れ て い な い か 、 メ モ リ ー を 含 む ノ ー ド が 一 つ も 指 定 さ れ て い な い 。 mode 引 数 に MPOL_F_STATIC_NODES MPOL_F_RELATIVE_NODES の 両 方 が 指 定 さ れ た 。

ENOMEM

利 用 可 能 な カ ー ネ ル メ モ リ ー が 十 分 で な か っ た 。

バ ー ジ ョ ン

set_mempolicy () シ ス テ ム コ ー ル は バ ー ジ ョ ン 2.6.7 で Linux カ ー ネ ル に 追 加 さ れ た 。

準 拠

こ の シ ス テ ム コ ー ル は Linux 固 有 で あ る 。

注 意

ペ ー ジ が ス ワ ッ プ ア ウ ト さ れ る 場 合 に は 、 メ モ リ ポ リ シ ー の 設 定 は 推 奨 さ れ な い 。 ス ワ ッ プ ア ウ ト さ れ た ペ ー ジ が ペ ー ジ イ ン す る 際 に も 、 ペ ー ジ 割 り 当 て 時 に 適 用 さ れ る ス レ ッ ド の ポ リ シ ー や メ モ リ ー 領 域 ポ リ シ ー が 使 用 さ れ る 。

ラ イ ブ ラ リ に よ る サ ポ ー ト に つ い て は numa (7) を 参 照 。

関 連 項 目

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

こ の 文 書 に つ い て

こ の man ペ ー ジ は Linux man-pages プ ロ ジ ェ ク ト の リ リ ー ス 5.10 の 一 部 で あ る 。 プ ロ ジ ェ ク ト の 説 明 と バ グ 報 告 に 関 す る 情 報 は https://www.kernel.org/doc/man-pages/ に 書 か れ て い る 。