第10章 cgroupfs を使用して cgroup を手動で管理する
cgroupfs 仮想ファイルシステムにディレクトリーを作成することにより、システム上の cgroup 階層を管理できます。ファイルシステムはデフォルトで /sys/fs/cgroup/ ディレクトリーにマウントされ、専用の制御ファイルで必要な設定を指定できます。
一般に、Red Hat では、システムリソースの使用を制御するために systemd を使用することを推奨します。cgroups 仮想ファイルシステムを手動で設定する必要があるのは、特別な場合のみです。たとえば、cgroup-v2 階層に同等のコントローラーが存在しない cgroup-v1 コントローラーを使用する必要がある場合などです。
10.1. cgroups-v2 ファイルシステムでの cgroup の作成とコントローラーの有効化 リンクのコピーリンクがクリップボードにコピーされました!
コントロールグループ (cgroups) を管理するには、cgroups 仮想ファイルシステム (通常は /sys/fs/cgroup/) にディレクトリーを作成または削除します。コントローラーの設定を使用するには、子 cgroups に対してその設定を有効にします。ファイルを整理し、コントローラーの使用を最適化するために、少なくとも 2 階層の子 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/ディレクトリーには、メモリーコントローラーとプロセス IDコントローラー用のコントローラー固有のファイルも含まれています。オプション: 新しく作成された子コントロールグループを確認します。
# 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/) にあるmemoryおよびpidsコントローラーに関連しており、systemd によってデフォルトで有効になります。デフォルトでは、新しく作成された子グループは、親の cgroup からすべての設定を継承します。この場合、ルート cgroup からの制限はありません。
必要なコントローラーが
/sys/fs/cgroup/cgroup.controllersファイルで使用可能であることを確認します。# cat /sys/fs/cgroup/cgroup.controllerscpuset 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.controllerscpuset cpu