3.4. cpuset

cpuset サブシステムは、個別の CPU とメモリーノードを cgroup に割り当てます。各 cpuset は、以下のパラメーターにしたがって、それぞれを cgroup 仮想ファイルシステム内の別々の 疑似ファイル 内で指定することができます。

重要

一部のサブシステムには、それらのいずれかを使用する cgroup にタスクを移動する前に設定しておく必要がある必須パラメーターがあります。たとえば、cpuset を使用する cgroup にタスクを cgroup に移動する前に、その cgroup に対して cpuset.cpuscpuset.mems のパラメーターを定義しておく必要があります。
cpuset.cpus (必須)
cgroup 内のタスクがアクセスを許可される CPU を指定します。これは ASCII 形式のコンマ区切りの一覧で、ダッシュ ("-") はその範囲を示します。以下はその例です。
0-2,16
これは、CPU 0、1、2、および 16 を示します。
cpuset.mems (必須)
この cgroup 内のタスクがアクセスを許可されるメモリーを指定します。これは ASCII 形式のコンマ区切りの一覧で、ダッシュ ("-") は範囲を示します。以下はその例です。
0-2,16
これは、メモリーノード 0、1、2、および 16 を示します。
cpuset.memory_migrate
cpuset.mems 内の値が変更された場合に、メモリー内のページが新規ノードに移行すべきかどうかを指定するフラグ (0 または 1) が含まれます。デフォルトでは、メモリー移行は無効 (0) になっており、元のノードが cpuset.mems に指定されているノードの1つでなくなっても、ページは最初に割り当てられたノードに残ります。有効 (1) にすると場合、システムは cpuset.mems により指定された新規のパラメーター内のメモリーノードにページを移行します。また、可能な場合には、それらの相対的配置を維持します。たとえば、最初に cpuset.mems で指定されていた一覧の第 2 のノードにあるページは、この場所が使用可能な場合には、cpuset.mems で今回指定された一覧の第 2 のノードに割り当てられます。
cpuset.cpu_exclusive
他の cpuset がこの cpuset 用に指定された CPU を共有できるかどうかを指定するフラグ (0 または 1) が含まれます。デフォルト (0) では、CPU は 1つの cpuset 専用には割り当てられません。
cpuset.mem_exclusive
この cpuset 用に指定されたメモリーノードを他の cpuset が共有できるかどうかを指定するフラグ (0 または 1) が含まれます。デフォルト (0) では、メモリーノードは1つの cpuset 専用には割り当てられません。cpuset 専用にメモリーノードを確保 (1) することは、cpuset.mem_hardwall パラメーターを使用してメモリーのハードウォールを有効にすることと機能的に同じです。
cpuset.mem_hardwall
メモリーページとバッファーデータのカーネル割り当てが、この cpuset 用に指定されたメモリーノードに制限されるべきかどうかを指定するフラグ (0 または 1) が含まれます。デフォルト (0) では、ページと バッファーデータは複数ユーザーに属するプロセス全体にわたって共有されます。ハードウォールが有効 (1) になっていると 各タスクのユーザー割り当ては別々に維持できます。
cpuset.memory_pressure
この cpuset 内のプロセスによって発生した メモリー負荷 の累積平均を含む読み取り専用のファイルです。cpuset.memory_pressure_enabled が有効化されている場合、この疑似ファイル内の値は自動的に更新されます。そうでない場合、疑似ファイルには、値 0 が含まれます。
cpuset.memory_pressure_enabled
この cgroup 内のプロセスによって発生した メモリー負荷 をシステムが計算すべきかどうかを指定するフラグ (0 または 1) が含まれます。計算された値は cpuset.memory_pressure に出力されて、プロセスが使用中のメモリーの解放を試みるレートを示します。これは、1 秒あたりのメモリー再生試行回数に 1000 を乗じた整数値としてレポートされます。
cpuset.memory_spread_page
この cpuset に割り当てられたメモリーノード全体にわたってファイルシステムバッファーを均等に分散すべきかどうかを指定するフラグ (0 または 1) が含まれます。デフォルト (0) では、これらの バッファー用にメモリーページを均等に分散しようとする試みはなく、バッファーはそれを作成したプロセスを実行しているのと同じノードに配置されます。
cpuset.memory_spread_slab
ファイルの入力/出力演算用のカーネルスラブキャッシュが cpuset 全体に均等に分散されるべきかどうかを指定するフラグ (0 または 1) が含まれます。デフォルト (0) では、カーネルスラブキャッシュを均等に分散しようとする試みはなく、スラブキャッシュはそれを作成したプロセスを実行しているのと同じノード上に配置されます。
cpuset.sched_load_balance
カーネルがこの cpuset 内の CPU 全体にわたって負荷を分散するかどうかを指定するフラグ (0 または 1) が含まれます。デフォルト (1) では、カーネルは過負荷状態の CPU から、使用頻度のより低い CPU へ プロセスを移動して負荷を分散します。
ただし、いずれかの親 cgroup でロードバランシングが有効化されている場合には、ロードバランシングがより高いレベルで既に実行されていることになるため、cgroup 内におけるこのフラグの設定は、無効となる点に注意してください。したがって、cgroup 内でロードバランシングを無効にするには、その階層内の各親 cgroup でもロードバランシングを無効にしてください。この場合には、対象となる cgroup の兄弟のロードバランシングも無効にすべきかどうかも検討すべきです。
cpuset.sched_relax_domain_level
-1 から小さい正の値までの間の整数が含まれます。これはカーネルが負荷を分散するために試行すべき CPU の範囲の幅を示します。cpuset.sched_load_balance が無効になっている場合には、この値は意味がありません。
この値の正確な効果はシステムアーキテクチャーに応じて変化しますが、以下の値が標準的です:
cpuset.sched_relax_domain_level の値
効果
-1ロードバランシングにシステムデフォルト値を使用
0ロードバランシングを即実行せず、定期的に負荷を分散
1同じコア上のスレッド全体にわたって、ロードバランシングを即実行
2同じパッケージ内のコア全体にわたって、ロードバランシングを即実行
3同じノードまたはブレード上の CPU 全体にわたって、ロードバランシングを即実行
4NUMA (非均等メモリーアクセス) を使用するアーキテクチャー上のいくつかの CPU にわたって、ロードバランシングを即実行
5NUMA を使用するアーキテクチャー上の全 CPU にわたって、ロードバランシングを即実行