第26章 cgroupfs を使用して cgroup を手動で管理する
cgroupfs
仮想ファイルシステムにディレクトリーを作成することにより、システム上の cgroup
階層を管理できます。ファイルシステムはデフォルトで /sys/fs/cgroup/
ディレクトリーにマウントされ、専用の制御ファイルで必要な設定を指定できます。
一般に、Red Hat では、システムリソースの使用を制御するために systemd
を使用することを推奨します。特別な場合にのみ、cgroups
仮想ファイルシステムを手動で設定する必要があります。たとえば、cgroup-v2
階層に同等のものがない cgroup-v1
コントローラーを使用する必要がある場合です。
26.1. cgroups-v2 ファイルシステムでの cgroup の作成とコントローラーの有効化
ディレクトリーを作成または削除したり、cgroups
仮想ファイルシステム内のファイルに書き込んだりすることで、control groups (cgroups
) を管理できます。ファイルシステムは、デフォルトで /sys/fs/cgroup/
ディレクトリーにマウントされます。cgroups
コントローラーの設定を使用するには、子 cgroups
に対して目的のコントローラーを有効にする必要もあります。ルート cgroup
は、デフォルトで、その子 cgroups
の memory
および pids
コントローラーを有効にしました。したがって、Red Hat は、/sys/fs/cgroup/
ルート cgroup
内に少なくとも 2 つのレベルの子 cgroups
を作成することを推奨します。このようにして、オプションで子 cgroups
から memory
と pids
コントローラーを削除し、cgroup
ファイルの組織の明確さを維持します。
前提条件
- 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
などのファイルは、memory
およびpids
コントローラーに関連し、ルートコントロールグループ (/sys/fs/cgroup/
) にあり、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
関連情報
- Linux カーネルリソースコントローラーとは
- cgroups-v1 のマウント
-
cgroups(7)
、sysfs(5)
の man ページ