第27章 cgroupfs を使用して cgroup を手動で管理する
cgroupfs 仮想ファイルシステムにディレクトリーを作成することにより、システム上の cgroup 階層を管理できます。ファイルシステムはデフォルトで /sys/fs/cgroup/ ディレクトリーにマウントされ、専用の制御ファイルで必要な設定を指定できます。
一般に、Red Hat では、システムリソースの使用を制御するために systemd を使用することを推奨します。特別な場合にのみ、cgroups 仮想ファイルシステムを手動で設定する必要があります。たとえば、cgroup-v2 階層に同等のものがない cgroup-v1 コントローラーを使用する必要がある場合です。
27.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/
# mkdir /sys/fs/cgroup/Example/Copy to Clipboard Copied! Toggle word wrap Toggle overflow /sys/fs/cgroup/Example/ディレクトリーはサブグループを定義します。/sys/fs/cgroup/Example/ディレクトリーを作成すると、一部のcgroups-v2インターフェイスファイルがディレクトリーに自動的に作成されます。/sys/fs/cgroup/Example/ディレクトリーには、memoryおよびpidsコントローラー用のコントローラー固有のファイルも含まれます。オプション: 新しく作成された子コントロールグループを確認します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 出力例は、
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
# cat /sys/fs/cgroup/cgroup.controllers cpuset cpu io memory hugetlb pids rdmaCopy to Clipboard Copied! Toggle word wrap Toggle overflow 目的のコントローラーを有効にします。この例では、
cpuおよびcpusetコントローラーです。echo "+cpu" >> /sys/fs/cgroup/cgroup.subtree_control echo "+cpuset" >> /sys/fs/cgroup/cgroup.subtree_control
# echo "+cpu" >> /sys/fs/cgroup/cgroup.subtree_control # echo "+cpuset" >> /sys/fs/cgroup/cgroup.subtree_controlCopy to Clipboard Copied! Toggle word wrap Toggle overflow これらのコマンドにより、
/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
# echo "+cpu +cpuset" >> /sys/fs/cgroup/Example/cgroup.subtree_controlCopy to Clipboard Copied! Toggle word wrap Toggle overflow このコマンドにより、直下のサブコントロールグループに、(
memoryまたはpidsコントローラーではなく) CPU 時間の配分の調整に関係するコントローラー だけ が設定されるようになります。/sys/fs/cgroup/Example/tasks/ディレクトリーを作成します。mkdir /sys/fs/cgroup/Example/tasks/
# mkdir /sys/fs/cgroup/Example/tasks/Copy to Clipboard Copied! Toggle word wrap Toggle overflow /sys/fs/cgroup/Example/tasks/ディレクトリーは、cpuおよびcpusetコントローラーにのみ関連するファイルを持つサブグループを定義します。これで、このコントロールグループにプロセスを割り当て、プロセスにcpuおよびcpusetコントローラーオプションを利用できます。オプション: 子コントロールグループを確認します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
cpu コントローラーは、該当のサブコントロールグループに、同じ CPU の CPU 時間を取り合うプロセスが 2 つ以上ある場合にのみ、有効になります。
検証
オプション: 目的のコントローラーのみがアクティブな状態で新しい
cgroupを作成したことを確認します。cat /sys/fs/cgroup/Example/tasks/cgroup.controllers cpuset cpu
# cat /sys/fs/cgroup/Example/tasks/cgroup.controllers cpuset cpuCopy to Clipboard Copied! Toggle word wrap Toggle overflow