3.2. cpu

cpu サブシステムは cgroup への CPU アクセスをスケジュールします。CPU リソースへのアクセスは、次の 2 つのスケジューラーを使用してスケジュールすることができます。
  • Completely Fair Scheduler (CFS) — タスクの優先度/ウェイトや cgroup に割り当てられている割合に応じて、タスクグループ (cgroup) 間で CPU 時間 (CPU 帯域幅) を比例配分するプロポーショナルシェアスケジューラー。CFS を使用したリソース制限についての詳しい情報は 「CFS の調整可能なパラメーター」 を参照してください。
  • リアルタイムスケジューラー (RT) — リアルタイムのタスクが使用できる CPU 時間を指定する方法を提供するタスクスケジューラー。リアルタイムのタスクのリソース制限についての詳しい情報は、「RT の調整可能なパラメーター」 を参照してください。

3.2.1. CFS の調整可能なパラメーター

スケジューラーには作業を節約する性質があるため、CFS では、十分なアイドル CPU サイクルが利用可能な場合に、cgroup は割り当てられている配分以上に CPU を使用することができます。これは通常、相対的配分に基づいて CPU 時間を消費する cgroup の場合に該当します。cgroup が利用できる CPU の量に対するハードリミットが必要な場合には、上限の適用を使用することができます (タスクが一定の CPU 時間以上を使用できないようにします)。
以下のオプションは、CPU の上限の適用または相対的配分を設定するのに使用することができます。

上限の適用の調整可能なパラメーター

cpu.cfs_period_us
cgroup による CPU リソースへのアクセスを再割り当てする一定間隔をマイクロ秒単位 (µs、ただしここでは "us" と表示) で指定します。cgroup 内のタスクが 1 秒あたり 0.2 秒間、単一の CPU にアクセスできる必要がある場合には、cpu.cfs_quota_us200000に、cpu.cfs_period_us1000000 に設定してください。cpu.cfs_quota_us パラメーターの上限は 1 秒、下限は 1000 マイクロ秒です。
cpu.cfs_quota_us
cgroup 内の全タスクが (cpu.cfs_period_us で定義された) 一定の期間に実行される合計時間をマイクロ秒単位 (µs、ただしここでは "us" と表示) で指定します。クォータによって指定された時間を cgroup 内のタスクがすべて使い切ってしまうと、その期間により指定されている残りの時間はタスクがスロットリングされ、次の期間まで実行を許可されなくなります。cgroup 内のタスクが 1 秒あたり 0.2 秒間、単一の CPU にアクセスできる必要がある場合には cpu.cfs_quota_us200000 に、cpu.cfs_period_us1000000 に設定します。クォータおよび期間のパラメーターは CPU ベースで動作する点に注意してください。プロセスが 2 つの CPU を完全に使用できるようにするには、たとえば、cpu.cfs_quota_us200000 に、 cpu.cfs_period_us100000 に設定します。
cpu.cfs_quota_us の値を -1 に設定すると、cgroup が CPU 時間制限を順守しないことを示します。これは、全 cgroup のデフォルト値でもあります (root cgroup は除く)。
cpu.stat
以下の値を使用して、CPU 時間の統計をレポートします。
  • nr_periods — 経過済みの期間間隔の数 (cpu.cfs_period_us で指定されている)
  • nr_throttled — cgroup 内のタスクがスロットリングされた回数 (クォータによって指定された利用可能な時間をすべて使い果たしたため、実行することができない)
  • throttled_time — cgroup 内のタスクがスロットリングされた合計時間 (ナノ秒単位)

相対的配分の調整可能なパラメーター

cpu.shares
cgroup 内のタスクで使用できる CPU 時間の相対的配分を指定する整数値を含みます。たとえば、cpu.shares100 に設定された 2 つの cgroup のタスクには同等の CPU 時間が提供されますが、cpu.shares200 に設定された cgroup のタスクには、cpu.shares100 に設定された cgroup のタスクの 2 倍の CPU 時間が提供されます。cpu.shares ファイルで指定する値は、2 以上とする必要があります。
CPU 時間の配分は、マルチコアシステム上の全 CPU コアを対象に分配されることに注意してください。マルチコアシステムで cgroup の上限が CPU の 100% に設定されている場合、各 CPU コアの 100% を使用できるということになります。次の例を検討してください: cgroup A が CPU の 25%、cgroup B が CPU の 75% を使用するように設定されている場合、4 コアのシステムで CPU を集中的に使用するプロセスを起動すると (A で 1 プロセス、B で 3 プロセス)、CPU 配分は以下のように分配されます。

表3.1 CPU 配分の分配

PID cgroup CPU CPU 配分
100 A 0 CPU0 の 100%
101 B 1 CPU1 の 100%
102 B 2 CPU2 の 100%
103 B 3 CPU3 の 100%

相対的配分を使用して CPU アクセスを指定する場合に考慮する必要のあるリソース管理への影響は以下の 2 点です。
  • CFS は同等の CPU 使用率を要求しないので、cgroup が消費できる CPU 時間を予測するのは困難です。1 つの cgroup 内のタスクがアイドル状態で CPU 時間を全く消費していない場合、その残り時間は未使用 CPU サイクルのグローバルプールに収集されます。他の cgroup は、このプールから CPU サイクルを借りることができます。
  • cgroup が使用できる実際の CPU 時間は、システムに存在する cgroup の数によって異なります。cgroup の相対的配分が 1000 に設定され、かつ他の 2 つの cgroup の相対的配分が 500 に設定されている場合、全 cgroup 内のプロセスが CPU の 100% の使用を試みると、最初の cgroup に全 CPU 時間の 50% が割り当てられます。しかし、1000 の相対的配分が設定された別のグループが追加されると、 最初の cgroup は CPU の 33% しか使用できなくなります (残りの cgroup は、CPU の 16.5%、16.5%、33% となります)。