はじめに
この実験では、Linux システム上で cgroups が構成されているかどうかを確認する方法を学びます。cgroups は、プロセスのリソース使用量を管理および制御するための強力なカーネル機能です。
cat /proc/cgroups を使用して利用可能な cgroup サブシステムをリストアップし、/sys/fs/cgroup 内の cgroup マウントポイントを調べ、cgroup 構成ファイル /etc/cgconfig.conf を検証することでこれを達成します。これらの手順により、システムの cgroup 設定の包括的な概要が得られます。
cat /proc/cgroups で cgroup をリストする
このステップでは、Linux システム上で利用可能な cgroup サブシステムをリストアップする方法を学びます。cgroups (コントロールグループ) は、プロセスを階層的なグループに組織し、それらのリソース使用量 (CPU、メモリ、ディスク I/O、ネットワークなど) を制御できる Linux カーネルの機能です。
cgroups を、特定のアプリケーションやユーザーに対してリソースの制限を設定したり割り当てたりする方法と考えてください。これは、特にコンテナやクラウドコンピューティングなどの環境で、システムリソースを効果的に管理するために重要です。
/proc ファイルシステムは、プロセスに関する情報やその他のシステム情報を提供する仮想ファイルシステムです。/proc/cgroups ファイルには、カーネルがサポートする cgroup サブシステムの詳細が含まれています。
利用可能な cgroup サブシステムを表示するには、cat コマンドを使用します。cat コマンドは、ファイルの内容を表示するために使用される基本的な Linux ユーティリティです。
ターミナルが開いていない場合は、開きます。デスクトップの左側にある Xfce Terminal アイコンをクリックすることで行えます。
次に、以下のコマンドをターミナルに入力し、Enter キーを押します。
cat /proc/cgroups
以下のような出力が表示されるはずです。
#subsys_name hierarchy num_cgroups enabled
cpuset 0 1 1
cpu 0 1 1
cpuacct 0 1 1
blkio 0 1 1
memory 0 1 1
devices 0 1 1
freezer 0 1 1
net_cls 0 1 1
perf_event 0 1 1
net_prio 0 1 1
hugetlb 0 1 1
pids 0 1 1
rdma 0 1 1
出力を分解して説明しましょう。
#subsys_name: cgroup サブシステムの名前 (例:cpu,memory,blkio)。各サブシステムは特定のタイプのリソースを制御します。hierarchy: サブシステムが接続されている階層の ID。この出力では、すべてのサブシステムが階層 0 に接続されており、これは新しい Linux ディストリビューションでのデフォルトの統合階層です。num_cgroups: このサブシステムの階層内で現在作成されている cgroup の数。enabled: サブシステムがカーネルで有効 (1) または無効 (0) かを示します。
この出力は、システムで利用可能でアクティブなリソース制御機能を示しています。これらのサブシステムを理解することは、cgroups でリソースを管理する方法を学ぶ最初のステップです。
Continue をクリックして次のステップに進みます。
/sys/fs/cgroup 内の cgroup マウントを確認する
前のステップで、利用可能な cgroup サブシステムを見ました。次に、これらの cgroup がファイルシステム上のどこにマウントされているかを調べましょう。Linux では、cgroup は通常、仮想ファイルシステムを通じて公開され、一般的に /sys/fs/cgroup の下にマウントされます。
/sys ファイルシステムは、カーネルのデータ構造に対するインターフェースを提供する別の仮想ファイルシステムです。これは、ハードウェアやカーネル機能の設定や監視によく使用されます。/sys/fs/cgroup ディレクトリは、cgroup ファイルシステムの標準的なマウントポイントです。
このディレクトリの内容を表示し、cgroup 階層がどのように組織されているかを理解するために、ls コマンドを使用します。ls コマンドは、ディレクトリの内容をリストアップします。
ターミナルが開いていない場合は、開きます。
次のコマンドをターミナルに入力し、Enter キーを押します。
ls /sys/fs/cgroup
以下のような出力が表示されるはずです。
cgroup.controllers cgroup.max.depth cgroup.max.descendants cgroup.stat cgroup.subtree_control cgroup.threads cpu cpu.stat cpu.pressure cpuset cpuset.cpus cpuset.mems cpuset.stat io io.stat io.pressure memory memory.stat memory.pressure memory.swap.max memory.high memory.low memory.min memory.swap.current memory.current memory.events memory.events.local pids pids.current pids.max systemd user.slice
この出力は、/sys/fs/cgroup ディレクトリ内のディレクトリとファイルを示しています。統一 cgroup 階層 (cgroup v2) を使用するシステムでは、cgroup.controllers、cgroup.stat などのファイルと、マウントされたコントローラーに対応するディレクトリ (例:cpu、memory、io、pids) が表示されます。
これらのディレクトリ (例:cpu、memory など) はそれぞれ、cgroup コントローラーを表しています。これらのディレクトリの中には、その cgroup 内のプロセスのリソース制限を設定および監視するためのファイルがあります。
たとえば、cpu ディレクトリに移動すると、CPU リソース制御に関連するファイルが見つかります。
ls を使用して cpu ディレクトリの中を簡単に見てみましょう。
ls /sys/fs/cgroup/cpu
以下のような出力が表示されるかもしれません。
cgroup.controllers cgroup.events cgroup.freeze cgroup.max.depth cgroup.max.descendants cgroup.stat cgroup.subtree_control cgroup.threads cpu.max cpu.stat cpu.weight cpu.pressure
これらのファイル (例:cpu.max、cpu.weight) は、cgroup の CPU 制限と優先度を設定するために使用されます。
/sys/fs/cgroup の構造を理解することは、cgroup を操作する上で重要です。ここで直接 cgroup とやり取りを行います。
Continue をクリックして次のステップに進みます。
cat /etc/cgconfig.conf で cgroup 設定を確認する
前のステップで、利用可能な cgroup サブシステムと、それらがファイルシステム上のどこにマウントされているかを学びました。次に、cgroup の一般的な設定ファイル /etc/cgconfig.conf を見てみましょう。
cgroup は /sys/fs/cgroup ファイルシステムを通じて直接管理することもできますが、/etc/cgconfig.conf のような設定ファイルは、システム起動時に cgroup 階層と初期設定を定義するためによく使用されます。このファイルは cgroup-tools パッケージの一部で、cgroup を管理するためのユーティリティを提供します。
/etc/cgconfig.conf ファイルは、cgconfig サービス (インストールされて有効になっている場合) によって読み取られ、起動時に cgroup 階層を設定し、コントローラーをアタッチします。このファイルを調べることで、システム上の cgroup がどのように設定されているかを理解することができます。
この設定ファイルの内容を表示するために、再び cat コマンドを使用します。
ターミナルが開いていない場合は、開きます。
次のコマンドをターミナルに入力し、Enter キーを押します。
cat /etc/cgconfig.conf
以下のような出力が表示されるはずです (正確な内容はシステムの設定によって異なります)。
#
## A sample configuration file for cgconfig.
#
## The file contains two sections:
## mount: defines the hierarchy and where to mount it.
## group: defines the cgroup and its parameters.
#
## Example:
#
#mount {
## cpuset = /cgroup/cpuset;
## cpu = /cgroup/cpu;
## cpuacct = /cgroup/cpuacct;
## memory = /cgroup/memory;
## devices = /cgroup/devices;
## freezer = /cgroup/freezer;
## net_cls = /cgroup/net_cls;
## blkio = /cgroup/blkio;
#}
#
#group staff {
## perm {
## task {
## uid = staff;
## gid = staff;
## }
## admin {
## uid = staff;
## gid = staff;
## }
## }
## cpu {
## cpu.shares = 1000;
## }
## memory {
## memory.limit_in_bytes = 256M;
## }
#}
#
#group / {
## cpu {
## cpu.shares = 1024;
## }
#}
このサンプル出力では、コメントアウトされたセクション (#) があり、異なるコントローラーのマウントポイントを定義し、特定のリソース制限 (例:cpu.shares, memory.limit_in_bytes) を持つ cgroup グループ (例:staff) を作成する方法が示されています。
ファイルが空であるか、コメントのみが含まれている場合、この特定のファイルを通じて cgroup 階層と初期グループが設定されていないことを意味します。最新のシステムでは、systemd が /sys/fs/cgroup にマウントされた統一階層を使用して cgroup 管理を行うことが多いです。
このファイルがシステム上で設定に積極的に使用されていなくても、その存在と目的を知ることは、cgroup を管理する方法を理解するために重要です。
これで、利用可能な cgroup サブシステム、それらのファイルシステム上のマウントポイント、および一般的な設定ファイルを調べました。これにより、Linux システム上の cgroup がどのように構成され、潜在的に設定されるかについての基本的な理解が得られます。
Continue をクリックしてこの実験を完了します。
まとめ
この実験では、Linux システム上で cgroup が設定されているかどうかを確認する方法を学びました。まず、cat /proc/cgroups コマンドを使用して、カーネルがサポートする利用可能な cgroup サブシステムをリストアップし、subsys_name、hierarchy、num_cgroups、enabled などの出力列を理解しました。このステップにより、どのリソース制御メカニズムがアクティブであるかを把握することができました。
次に、cgroup 階層がマウントされる標準的な場所である /sys/fs/cgroup ディレクトリを調べることで、cgroup のマウントポイントを確認しました。最後に、/etc/cgconfig.conf ファイルを確認して、永続的な cgroup 設定が定義されているかどうかを確認しました。ただし、このファイルはすべてのシステムに存在するとは限らず、特に cgroup 管理に systemd を使用しているシステムでは使用されないことがあります。これらのステップをまとめると、Linux システム上の cgroup の存在と基本的な設定を判断する方法がわかります。



