第28章 cgroupfs を使用して cgroup を手動で管理する
cgroupfs 仮想ファイルシステムにディレクトリーを作成することにより、システム上の cgroup 階層を管理できます。ファイルシステムはデフォルトで /sys/fs/cgroup/ ディレクトリーにマウントされ、専用の制御ファイルで必要な設定を指定できます。
システムリソースの制御には systemd を使用します。cgroups 仮想ファイルシステムを手動で設定するのは、特別な場合のみにしてください。たとえば、cgroup-v2 に相当するコントローラーが存在しない cgroup -v1 コントローラーが必要な場合は、手動での設定が必要になります。
28.1. cgroups-v2 ファイルシステムでの cgroup の作成とコントローラーの有効化 リンクのコピーリンクがクリップボードにコピーされました!
デフォルトでは /sys/fs/cgroup/ にマウントされている cgroups 仮想ファイルシステム内のディレクトリーを作成または削除したり、ファイルに書き込んだりすることで、コントロールグループ (cgroups) を管理します。
子ノード cgroups が設定を使用できるように、必要なコントローラーを有効にします。ルート cgroup は、子プロセス cgroups に対して、メモリーコントローラー と PID コントローラーをデフォルトで有効にしています。少なくとも 2 階層の子 cgroups を作成し、必要に応じてこれらのコントローラーを子 cgroups から削除して、より明確な組織構造を維持できるようにします。
前提条件
- root 権限がある。
手順
/sys/fs/cgroup/Example/ディレクトリーを作成します。# mkdir /sys/fs/cgroup/Example//sys/fs/cgroup/Example/ディレクトリーはサブグループを定義します。/sys/fs/cgroup/Example/ディレクトリーを作成すると、一部のcgroups-v2インターフェイスファイルがディレクトリーに自動的に作成されます。/sys/fs/cgroup/Example/ディレクトリーには、memoryおよびpidsコントローラー用のコントローラー固有のファイルも含まれます。オプション: 新しく作成された子コントロールグループを確認します。
# ll /sys/fs/cgroup/Example/ -r—r—r--. 1 root root 0 Jun 1 10:33 cgroup.controllers -r—r—r--. 1 root root 0 Jun 1 10:33 cgroup.events -rw-r—r--. 1 root root 0 Jun 1 10:33 cgroup.freeze -rw-r--r--. 1 root root 0 Jun 1 10:33 cgroup.procs … -rw-r—r--. 1 root root 0 Jun 1 10:33 cgroup.subtree_control -r—r—r--. 1 root root 0 Jun 1 10:33 memory.events.local -rw-r—r--. 1 root root 0 Jun 1 10:33 memory.high -rw-r—r--. 1 root root 0 Jun 1 10:33 memory.low … -r—r—r--. 1 root root 0 Jun 1 10:33 pids.current -r—r—r--. 1 root root 0 Jun 1 10:33 pids.events -rw-r—r--. 1 root root 0 Jun 1 10:33 pids.max出力例は、
cgroup.procsやcgroup.controllersなどの一般的なcgroup制御インターフェイスファイルを示しています。これらのファイルは、有効なコントローラーに関係なく、すべてのコントロールグループに共通です。memory.highやpids.maxなどのファイルは、ルートコントロールグループ (/sys/fs/cgroup/) にあるメモリーおよびPIDコントローラーに関連しており、systemd によってデフォルトで有効になっています。デフォルトでは、新しく作成された子グループは、親
cgroupからすべての設定を継承します。この場合、ルートcgroupから制限は継承されません。目的のコントローラーが
/sys/fs/cgroup/cgroup.controllersファイルで使用可能であることを確認します。# cat /sys/fs/cgroup/cgroup.controllers cpuset cpu io memory hugetlb pids rdma目的のコントローラーを有効にします。この例では、
cpuおよびcpusetコントローラーです。# echo "+cpu" >> /sys/fs/cgroup/cgroup.subtree_control # echo "+cpuset" >> /sys/fs/cgroup/cgroup.subtree_controlこれらのコマンドにより、
/sys/fs/cgroup/ルートコントロールグループ直下のサブグループに対してcpuおよびcpusetコントローラーが有効になります。新しく作成されたExampleコントロールグループを含みます。サブグループ で指定した各プロセスに対して、基準に基づいてコントロールチェックを適用できます。ユーザーは任意のレベルの
cgroup.subtree_controlファイルの内容を読み取り、直下のサブグループで有効にするコントローラーを把握することができます。注記デフォルトでは、ルートコントロールグループの
/sys/fs/cgroup/cgroup.subtree_controlファイルにはmemoryとpidsコントローラーが含まれます。Exampleコントロールグループの子cgroupsに必要なコントローラーを有効にします。# echo "+cpu +cpuset" >> /sys/fs/cgroup/Example/cgroup.subtree_controlこのコマンドにより、直下のサブコントロールグループに、(
memoryまたはpidsコントローラーではなく) CPU 時間の配分の調整に関係するコントローラー だけ が設定されるようになります。/sys/fs/cgroup/Example/tasks/ディレクトリーを作成します。# mkdir /sys/fs/cgroup/Example/tasks//sys/fs/cgroup/Example/tasks/ディレクトリーは、cpuおよびcpusetコントローラーにのみ関連するファイルを持つサブグループを定義します。これで、このコントロールグループにプロセスを割り当て、プロセスに対してcpuおよびcpusetコントローラーオプションを使用できるようになります。オプション: 子コントロールグループを確認します。
# ll /sys/fs/cgroup/Example/tasks -r—r—r--. 1 root root 0 Jun 1 11:45 cgroup.controllers -r—r—r--. 1 root root 0 Jun 1 11:45 cgroup.events -rw-r—r--. 1 root root 0 Jun 1 11:45 cgroup.freeze -rw-r—r--. 1 root root 0 Jun 1 11:45 cgroup.max.depth -rw-r—r--. 1 root root 0 Jun 1 11:45 cgroup.max.descendants -rw-r—r--. 1 root root 0 Jun 1 11:45 cgroup.procs -r—r—r--. 1 root root 0 Jun 1 11:45 cgroup.stat -rw-r—r--. 1 root root 0 Jun 1 11:45 cgroup.subtree_control -rw-r—r--. 1 root root 0 Jun 1 11:45 cgroup.threads -rw-r—r--. 1 root root 0 Jun 1 11:45 cgroup.type -rw-r—r--. 1 root root 0 Jun 1 11:45 cpu.max -rw-r—r--. 1 root root 0 Jun 1 11:45 cpu.pressure -rw-r—r--. 1 root root 0 Jun 1 11:45 cpuset.cpus -r—r—r--. 1 root root 0 Jun 1 11:45 cpuset.cpus.effective -rw-r—r--. 1 root root 0 Jun 1 11:45 cpuset.cpus.partition -rw-r—r--. 1 root root 0 Jun 1 11:45 cpuset.mems -r—r—r--. 1 root root 0 Jun 1 11:45 cpuset.mems.effective -r—r—r--. 1 root root 0 Jun 1 11:45 cpu.stat -rw-r—r--. 1 root root 0 Jun 1 11:45 cpu.weight -rw-r—r--. 1 root root 0 Jun 1 11:45 cpu.weight.nice -rw-r—r--. 1 root root 0 Jun 1 11:45 io.pressure -rw-r—r--. 1 root root 0 Jun 1 11:45 memory.pressure
cpu コントローラーは、該当のサブコントロールグループに、同じ CPU の CPU 時間を取り合うプロセスが 2 つ以上ある場合にのみ、有効になります。
検証
オプション: 目的のコントローラーのみがアクティブな状態で新しい
cgroupを作成したことを確認します。# cat /sys/fs/cgroup/Example/tasks/cgroup.controllers cpuset cpu