リソース管理ガイド
Red Hat Enterprise Linux 7 でシステムリソースを管理する
概要
第1章 コントロールグループについて (cgroup)
1.1. コントロールグループとは
systemctl コマンドを使用するか、または systemd ユニットファイルを変更することにより実行できます。詳細は、2章コントロールグループの使用 を参照してください。
cgconfig コマンドを使用してカスタム cgroup 階層を作成しました。しかし、このパッケージを使用するとデフォルトの cgroup 階層との競合が容易に生じるため、現在は非推奨になっています。ただし、libcgroup はとくに net-prio サブシステムを使用する場合など systemd がまだ適用されない特定のケースに対応するために依然として使用することができます。3章libcgroup ツールの使用 を参照してください。
1.2. デフォルトの cgroup 階層
systemctl コマンドを使用すると、「コントロールグループの作成」 で説明されているように、カスタムスライスを作成してこの構造をさらに変更することができます。また、systemd は重要なカーネルリソースコントローラー (Red Hat Enterprise Linux 7 で利用可能なコントローラー を参照) の階層を /sys/fs/cgroup/ ディレクトリーに自動マウントします。
警告
net-prio コントローラー) の階層をマウントし、これを処理するには、libcgroup パッケージの非推奨の cgconfig ツールを使用することができます。systemd でマウントされているデフォルト階層を変更するために libcgropup ツールを使用すると、予期しない動作が発生する可能性があるので、その場合はこのツールは使用しないでください。libcgroup ライブラリーは Red Hat Enterprise Linux の今後のバージョンでは削除されます。cgconfig の使用方法の詳細については、3章libcgroup ツールの使用 を参照してください。
systemd ユニットタイプ
systemd のユニットタイプの詳細一覧については、『Red Hat Enterprise Linux 7 システム管理者のガイド』の「systemd によるサービス管理 」の章を参照してください)。
- サービス: ユニット設定ファイルに基づいて
systemdが起動したプロセスまたはプロセスのグループです。サービスは指定されたプロセスをカプセル化し、これらのプロセスが 1 つのセットとして起動したり、停止したりできるようにします。サービスの名前は以下のように指定されます。name.
serviceここで、name はサービスの名前を表します。 - スコープ: 外部で作成されたプロセスのグループです。スコープは
fork()機能により任意のプロセスで起動し、停止された後に、ランタイム時に systemd によって登録されたプロセスをカプセル化します。たとえば、ユーザーセッション、コンテナーおよび仮想マシンはスコープとして処理されます。スコープの名前は以下のように指定されます。name.
scopeここで、name はスコープの名前を表します。 - スライス: 階層的に編成されたユニットのグループです。スライスにはプロセスが含まれず、スコープやサービスが置かれる階層を編成します。実際のプロセスはスコープやサービスに含まれます。この階層ツリーでは、スライスユニットのすべての名前は階層内の場所へのパスに対応します。ダッシュ ("
-") 文字はパスコンポーネントの区切り文字として機能します。たとえばスライスの名前は以下のようになります。parent-name.
sliceこれは、parent-name.sliceというスライスは parent.sliceのサブスライスであることを意味します。このスライスには parent-name-name2.sliceなどの独自のサブスライスを持たせることができます。以下のように表示される 1 つの root スライスがあります。-.slice
test.slice/test-waldo.slice/ex.service/ にマップされます。
- -.slice: root スライス
- system.slice: すべてのシステムサービスのデフォルトの場所
- user.slice: すべてのユーザーセッションのデフォルトの場所
- machine.slice: すべての仮想マシンおよび Linux コンテナーのデフォルトの場所
systemd-cgls コマンドで生成されています。
├─1 /usr/lib/systemd/systemd --switched-root --system --deserialize 20 ├─user.slice │ └─user-1000.slice │ └─session-1.scope │ ├─11459 gdm-session-worker [pam/gdm-password] │ ├─11471 gnome-session --session gnome-classic │ ├─11479 dbus-launch --sh-syntax --exit-with-session │ ├─11480 /bin/dbus-daemon --fork --print-pid 4 --print-address 6 --session │ ... │ └─system.slice ├─systemd-journald.service │ └─422 /usr/lib/systemd/systemd-journald ├─bluetooth.service │ └─11691 /usr/sbin/bluetoothd -n ├─systemd-localed.service │ └─5328 /usr/lib/systemd/systemd-localed ├─colord.service │ └─5001 /usr/libexec/colord ├─sshd.service │ └─1191 /usr/sbin/sshd -D │ ...
1.3. Linux カーネルにおけるリソースコントローラー
/proc/cgroups で確認するか、または lssubsys モニタリングツールを使用して確認できます。Red Hat Enterprise Linux 7 では、systemd はデフォルトで以下のコントローラーをマウントします。
Red Hat Enterprise Linux 7 で利用可能なコントローラー
blkio: ブロックデバイスへの入力アクセスまたはブロックデバイスからの出力アクセスの制限を設定します。cpu: cgroup タスクに CPU へのアクセスを提供するために CPU スケジューラーを使用します。これは同一のマウント時にcpuacctコントローラーと共にマウントされます。cpuacct: cgroup 内のタスクで使用される CPU リソースについての自動レポートを作成します。これは同一のマウント時にcpuコントローラーと共にマウントされます。cpuset: 個別の CPU (マルチコアシステム上) およびメモリーノードを cgroup 内のタスクに割り当てます。devices: cgroup 内のタスクについてデバイスへのアクセスを許可または拒否します。freezer: cgroup 内のタスクを一時停止または再開します。memory: cgroup 内のタスクによって使用されるメモリーに対する制限を設定し、それらのタスクによって使用されるメモリーリソースについての自動レポートを生成します。net_cls: Linux トラフィックコントローラー (tcコマンド) が特定の cgroup タスクから発信されるパケットを識別することを可能にするクラス識別子 (classid) を使用して、ネットワークパケットにタグを付けます。net_clsのサブシステムnet_filter(iptables) もこのタグを使用してパケットなどに対してアクションを実行できます。net_filterは、Linux ファイアウォール (iptablesコマンド) が特定の cgroup タスクから発信されるパケット (skb->sk) を識別することを可能にするファイアウォール識別子 (fwid) を使用して、ネットワークソケットにタグを付けます。perf_event: perf ツールを使用した cgroup のモニタリングを可能にします。hugetlb: サイズの大きい仮想メモリーページの使用を許可し、これらのページへのリソース制限を施行します。
1.4. その他のリソース
インストールされているドキュメント
cgroup 関連の Systemd ドキュメント
systemd.resource-control(5): システムユニットによって共有されるリソース制御についての各種設定オプションについて説明しています。systemd.unit(5): すべてのユニット設定ファイルの共通オプションについて説明しています。systemd.slice(5): .slice ユニットについての一般的な情報を提供します。systemd.scope(5): .scope ユニットについての一般的な情報を提供します。systemd.service(5): .service ユニットについての一般的な情報を提供します。
コントローラー固有のカーネルについてのドキュメント
root として以下を入力します。
yuminstallkernel-doc
/usr/share/doc/kernel-doc-<kernel_version>/Documentation/cgroups/ ディレクトリーの下に表示されます。
blkioサブシステム:blkio-controller.txtcpuacctサブシステム:cpuacct.txtcpusetサブシステム:cpusets.txtdevicesサブシステム:devices.txtfreezerサブシステム:freezer-subsystem.txtmemoryサブシステム:memory.txtnet_clsサブシステム:net_cls.txt
cpu サブシステムについての詳しい情報は、以下のファイルを参照してください。
- リアルタイムスケジューリング —
/usr/share/doc/kernel-doc-<kernel_version>/Documentation/scheduler/sched-rt-group.txt - CFS スケジューリング —
/usr/share/doc/kernel-doc-<kernel_version>/Documentation/scheduler/sched-bwc.txt
オンラインのドキュメント
- Red Hat Enterprise Linux 7 システム管理者のガイド: システム管理者のガイド は Red Hat Enterprise Linux 7 の導入、設定および管理に関する情報を記載しています。このガイドには、systemd の概念と systemd を使用したシステムの管理方法についての詳細が記載されています。
- The D-Bus API of systemd: systemd と対話するために使用される D-Bus API コマンドについての参考資料です。
第2章 コントロールグループの使用
2.1. コントロールグループの作成
systemd-run コマンドで起動します。これにより、ランタイム時にサービスによって消費されるリソースに制限を設定することができます。各種のアプリケーションは、systemd への API 呼び出しを使用して一時的な cgroup を動的に作成できます。API の参考情報については 「オンラインのドキュメント」 を参照してください。一時的なユニットは、サービスが停止するとすぐに自動的に削除されます。
2.1.1. systemd-run を使用した一時的な cgroup の作成
systemd-run コマンドは、一時的な サービス または スコープ ユニットを作成および起動し、このユニットでカスタムコマンドを実行するために使用されます。サービスユニットで実行されるコマンドはバックグランドで非同期に開始し、それらのコマンドは systemd プロセスから起動します。スコープユニットで実行されるコマンドは systemd-run プロセスから直接開始されるため、呼び出し側の実行環境を継承します。この場合は同期的に実行されます。
root として以下を実行します。
systemd-run--unit=name--scope--slice=slice_name command
- name は、このユニットを認識するのに使用する名前を表します。
--unitが指定されていない場合、ユニット名は自動的に生成されます。この名前はsystemctl出力のユニットを表すため、ユニットを説明するような名前を選択することをお勧めします。この名前はユニットのランタイム時に固有のものである必要があります。 - オプションの
--scopeパラメーターを使用して、デフォルトで作成される サービス ユニットの代わりに一時的な スコープ ユニットを作成します。 --sliceオプションを使用すると、新たに作成した サービス または スコープ ユニットを指定したスライスのメンバーにすることができます。slice_name を既存スライスの名前 (systemctl -t sliceの出力に表示) に置き換えるか、または固有の名前を渡すことによって新規のスライスを作成します。デフォルトではサービスおよびスコープは system.slice のメンバーとして作成されます。- command をサービスユニットで実行するコマンドに置き換えます。このコマンドは
systemd-run構文の末尾に置き、このコマンドのパラメーターがsystemd-runのパラメーターと混同しないようにします。
systemd-run で利用可能ないくつかのパラメーターがあります。たとえば、--description はユニットの記述を作成し、--remain-after-exit はサービスのプロセスを停止した後のランタイム情報を収集することを許可します。--machine オプションは限定されたコンテナーでコマンドを実行します。さらに詳しくは、systemd-run(1) の man ページを参照してください。
例2.1 systemd-run を使用した新規サービスの起動
test という新規スライスのサービスユニットで top ユーティリティーを実行します。root として以下を実行します。
~]#systemd-run--unit=toptest--slice=testtop-b
Running as unit toptest.service
systemctl コマンドで cgroup をモニタリングまたは変更するために使用できます。
2.1.2. 永続的な cgroup の作成
systemctl enable コマンドを実行します (Red Hat Enterprise Linux 7 システム管理者のガイド の systemd によるサービス管理 の章を参照してください)。このコマンドを実行すると、ユニットファイルが /usr/lib/systemd/system/ ディレクトリーに自動的に作成されます。cgroup に永続的な変更を加えるには、そのユニットファイルの設定パラメーターを追加または変更します。詳細は、「ユニットファイルの変更」 を参照してください。
2.2. コントロールグループの削除
--remain-after-exit オプションを systemd-run に渡すことで、ユニットのプロセスがランタイム情報の収集を終了した後もユニットを実行状態にすることができます。このユニットを正常に停止するには、以下を入力します。
systemctlstopname.service
root として以下を入力します。
systemctlkillname.service--kill-who=PID,...--signal=signal
--kill-who を使用して、終了する cgroup のプロセスを選択します。複数のプロセスを同時に kill するには、PID のコンマ区切りの一覧を渡します。signal を指定プロセスに送信する POSIX シグナルのタイプに置き換えます。デフォルトは SIGTERM です。詳細は、systemd.kill の man ページを参照してください。
systemctldisablename.service
2.3. コントロールグループの変更
systemd によって監視されるそれぞれの永続的なユニットには、/usr/lib/systemd/system/ ディレクトリーにユニット設定ファイルがあります。サービスユニットのパラメーターを変更するには、この設定ファイルを変更します。これは手動で実行することも、systemctl set-property コマンドを使用してコマンドラインインターフェースで実行することもできます。
2.3.1. コマンドラインインターフェースでのパラメーターの設定
systemctl set-property コマンドを実行すると、アプリケーションのランタイム時にリソース制御の設定を永続的に変更することができます。これを実行するには、root として以下の構文を使用します。
systemctlset-propertyname parameter=value
systemctl set-property を実行すると、複数のプロパティーを一度に変更できることに注意してください。この方法は、プロパティーを個別に設定する方法よりも推奨されます。
--runtime オプションを渡すことでこの動作を変更できます。
systemctlset-property--runtimename property=value
例2.2 systemctl set-property の使用
~]#systemctlset-propertyhttpd.serviceCPUShares=600MemoryLimit=500M
--runtime オプションを追加します。
~]#systemctlset-property--runtimehttpd.serviceCPUShares=600MemoryLimit=500M
2.3.2. ユニットファイルの変更
CPU の管理
/etc/systemd/system.conf 設定ファイルの DefaultControllers パラメーターで変更することができます。CPU 割り当てを管理するには、ユニット設定ファイルの [Service] セクションで以下の指示文を使用します。
CPUShares=value- value を CPU 共有の数に置き換えます。デフォルト値は 1024 ですが、この数を増やすことにより、さらに多くの CPU 時間をユニットに割り当てることができます。このパラメーターは、ユニットファイルで
CPUAccountingがオンにされていることを示します。
CPUShares パラメーターは cpu.shares コントロールグループパラメーターを制御します。他の CPU 関連のコントロールパラメーターを確認するには、コントローラー固有のカーネルのついてのドキュメント の cpu コントローラーの説明を参照してください。
例2.3 ユニットの CPU 消費の制限
/usr/lib/systemd/system/httpd.service ユニットファイルで CPUShares 設定を変更します。
[Service] CPUShares=1500
~]#systemctldaemon-reload~]#systemctlrestarthttpd.service
メモリーの管理
MemoryLimit=value- value を cgroup で実行されるプロセスの最大メモリー使用量の制限値に置き換えます。測定単位としてキロバイト、メガバイト、ギガバイト、またはテラバイトを指定するためにサフィックスの K、M、G、または T を使用します。さらに、
MemoryAccountingパラメーターを同じユニットについて有効にしておく必要があります。
MemoryLimit パラメーターは memory.limit_in_bytes コントロールグループパラメーターを制御します。詳細は、コントローラー固有のカーネルのついてのドキュメント にある memory コントローラーの説明を参照してください。
例2.4 ユニットのメモリー消費の制限
/usr/lib/systemd/system/httpd.service ユニットファイルの MemoryLimit 設定を変更します。
[Service] MemoryLimit=1G
~]#systemctldaemon-reload~]#systemctlrestarthttpd.service
ブロック IO の管理
BlockIOAccounting パラメーターが有効にされていることを仮定しています。
BlockIOWeight=value- value を、実行されているプロセスの新たなブロック IO 全体の重み (weight) に置き換えます。10 から 1000 の間の単一の値を選択します。デフォルト設定は 1000 です。
BlockIODeviceWeight=device_name value- value を、device_name で指定されたデバイスのブロック IO の重みに置き換えます。device_name を名前か、またはデバイスへのパスのいずれかに置き換えます。
BlockIOWeightの場合のように、10 から 1000 までの単一の加重値を設定することができます。 BlockIOReadBandwidth=device_name value- この指示文により、ユニットの特定の帯域幅を制限することができます。device_name をデバイスの名前か、またはブロックデバイスノードへのパスに置き換えます。value は帯域幅レートを表します。測定単位を指定するには、サフィックスの K、M、G、または T を使用します。サフィックスのない値は 1 秒あたりのバイト単位で解釈されます。
BlockIOWriteBandwidth=device_name value- 指定されたデバイスの書き込み帯域幅を制限します。
BlockIOReadBandwidthと同じ引数を受け入れます。
blkio コントローラーの説明を参照してください。
注記
blkio リソースコントローラーはバッファリングされた書き込み操作をサポートしません。これは主として直接 I/O を対象としているため、バッファリングされた書き込みを使用するサービスは BlockIOWriteBandwidth で設定された制限を無視します。他方、バッファリングされた読み取り操作はサポートされ、BlockIOReadBandwidth 制限は直接およびバッファリングされた読み取りの両方に正しく適用されます。
例2.5 ユニットのブロック IO の制限
/home/jdoe/ ディレクトリーにアクセスする Apache サービスのブロック IO の重みを下げるには、以下のテキストを /usr/lib/systemd/system/httpd.service ユニットファイルに追加します。
[Service] BlockIODeviceWeight=/home/jdoe 750
/var/log/ ディレクトリーから読み取る Apache の最大帯域幅を 1 秒あたり 5MB に設定するには、以下の構文を使用します。
[Service] BlockIOReadBandwith=/var/log 5M
~]#systemctldaemon-reload~]#systemctlrestarthttpd.service
その他のシステムリソースの管理
DeviceAllow=device_name options- このオプションは特定のデバイスノードへのアクセスを制御します。ここで、device_name は
/proc/devicesで指定されるデバイスノードまたはデバイスグループ名を表しています。optionsをr、w、およびmの組み合わせに置き換え、ユニットからデバイスノードの読み取り、書き込み、または作成を実行できるようにします。 DevicePolicy=value- ここで、value は以下のいずれかになります。strict (
DeviceAllowで明示的に指定されるアクセスのタイプのみを許可します)、closed (/dev/null、/dev/zero、/dev/full、/dev/random、および /dev/urandom を含む標準的な擬似デバイスへのアクセスを許可します) または auto (明示的なDeviceAllowがない場合にすべてのデバイスへのアクセスを許可します。これはデフォルトの動作です)。 Slice=slice_name- slice_name を、ユニットを入れるスライスの名前に置き換えます。デフォルトは system.slice です。スコープユニットはそれらの親スライスに結び付けられているため、スコープユニットをこの方法で編成することができません。
ExecStartPost=command- 現在、
systemdは cgroup 機能のサブセットをサポートします。ただし、サービスの swap 使用を防ぐために、ExecStartPost=オプションを、memory.memsw.limit_in_bytesパラメーターの設定と共に使用することもできます。ExecStartPost=の詳細は、systemd.service(5)man ページを参照してください。
例2.6 cgroup オプションの設定
memory.memsw.limit_in_bytes 設定をユニットの MemoryLimit= と同じ値に設定する必要があるとします。
ExecStartPost=/bin/bash -c "echo 1G > /sys/fs/cgroup/memory/system.slice/example.service/memory.memsw.limit_in_bytes"
systemd の設定を再度読み込み、サービスを再起動することで、変更された設定が反映されるようにします。
~]#systemctldaemon-reload~]#systemctlrestartexample.service
2.4. コントロールグループに関する情報の取得
systemctl コマンドを使用して、システムユニットを一覧表示し、それらのステータスを表示します。さらに、コントロールグループの階層を表示するために systemd-cgls コマンドが提供され、リアルタイムでリソース消費を監視するために systemd-cgtop が提供されています。
2.4.1. ユニットの制限
systemctl list-unitslist-units オプションがデフォルトで実行されます。これは、このオプションを省略し、以下のみを実行する場合と同じ出力が表示されることを意味します。
systemctl
UNIT LOAD ACTIVE SUB DESCRIPTION
abrt-ccpp.service loaded active exited Install ABRT coredump hook
abrt-oops.service loaded active running ABRT kernel log watcher
abrt-vmcore.service loaded active exited Harvest vmcores for ABRT
abrt-xorg.service loaded active running ABRT Xorg log watcher
...
- UNIT: cgroup ツリー内のユニットの位置も反映するユニットの名前です。「systemd ユニットタイプ」 で言及されているように、スライス、スコープ および サービス の 3 つのユニットタイプがリソースコントロールと関連しています。
systemdのユニットタイプの詳細一覧については、Red Hat Enterprise Linux 7 システム管理者のガイド の systemd によるサービス管理 の章を参照してください。 - LOAD: ユニット設定がファイルが適切に読み込まれたかどうかを示します。ユニットファイルが読み込みに失敗した場合、フィールドには loaded ではなく error 状態が含まれます。他のユニットの読み込み状態には、stub、merged、および masked があります。
- ACTIVE: SUB を一般化したユニットの高レベルのアクティブ化の状態です。
- SUB: ユニットの低レベルのアクティブ化の状態です。使用できる値の範囲はユニットタイプによって異なります。
- DESCRIPTION: ユニットのコンテンツおよび機能の説明です。
systemctl はアクティブなユニットのみを一覧表示します (ACTIVE フィールドの高レベルのアクティブ化の状態)。--all オプションを使用して非アクティブなユニットも表示できます。出力一覧の情報量を制限するには、サービス および スライス などのコンマ区切りのユニットタイプの一覧が必要な --type (-t) パラメーター、または loaded および masked などのユニットの読み込み状態を使用します。
例2.7 systemctl list-units の使用
~]$systemctl-tslice
~]$systemctl-tservice,masked
systemctllist-unit-files
2.4.2. コントロールグループ階層の表示
systemctl の出力はユニットの階層を表示しません。これらはいずれも cgroup に従って実行中のプロセスをグループ化する systemd-cgls コマンドを使用して実行できます。システム上に cgroup 階層全体を表示するには、以下を入力します。
systemd-cglssystemd-cgls がパラメーターなしに実行されると、cgroup 階層全体が返されます。cgroup ツリーの最も高いレベルはスライスによって形成され、以下のように表示されます。
├─system │ ├─1 /usr/lib/systemd/systemd --switched-root --system --deserialize 20 │ ... │ ├─user │ ├─user-1000 │ │ └─ ... │ ├─user-2000 │ │ └─ ... │ ... │ └─machine ├─machine-1000 │ └─ ... ...
systemd-cgls の出力を減らし、階層の指定された部分を表示するには、以下を実行します。
systemd-cgls namesystemctl status コマンドを使用してシステムユニットについての詳細情報を表示します。cgroup サブツリーはこのコマンドの出力の一部です。
systemctlstatusname
例2.8 コントロールグループ階層の表示
memory リソースコントローラーの cgroup ツリーを表示するには、以下を実行します。
~]$systemd-cglsmemorymemory: ├─ 1 /usr/lib/systemd/systemd --switched-root --system --deserialize 23 ├─ 475 /usr/lib/systemd/systemd-journald ...
~]#systemctlstatushttpd.servicehttpd.service - The Apache HTTP Server Loaded: loaded (/usr/lib/systemd/system/httpd.service; enabled) Active: active (running) since Sun 2014-03-23 08:01:14 MDT; 33min ago Process: 3385 ExecReload=/usr/sbin/httpd $OPTIONS -k graceful (code=exited, status=0/SUCCESS) Main PID: 1205 (httpd) Status: "Total requests: 0; Current requests/sec: 0; Current traffic: 0 B/sec" CGroup: /system.slice/httpd.service ├─1205 /usr/sbin/httpd -DFOREGROUND ├─3387 /usr/sbin/httpd -DFOREGROUND ├─3388 /usr/sbin/httpd -DFOREGROUND ├─3389 /usr/sbin/httpd -DFOREGROUND ├─3390 /usr/sbin/httpd -DFOREGROUND └─3391 /usr/sbin/httpd -DFOREGROUND ...
machinectl コマンドも提供します。
2.4.3. リソースコントローラーの表示
systemctl コマンドは、より高いレベルのユニット階層のモニタリングを可能にしますが、Linux カーネルのどのリソースコントローラーがどのプロセスで実際に使用されているかは表示しません。この情報は専用のプロセスファイルに保存されます。これを表示するには、root として以下を入力します。
catproc/PID/cgroup
~]#catproc/27/cgroup10:hugetlb:/ 9:perf_event:/ 8:blkio:/ 7:net_cls:/ 6:freezer:/ 5:devices:/ 4:memory:/ 3:cpuacct,cpu:/ 2:cpuset:/ 1:name=systemd:/
2.4.4. リソース消費のモニタリング
systemd-cgls コマンドは cgroup 階層の静的なスナップショットを提供します。リソース使用 (CPU、メモリーおよび IO) 別に順序付けられる現在実行中の cgroup の動的なアカウントを表示するには、以下を使用します。
systemd-cgtopsystemd-cgtop の動作、指定される統計および制御オプションは top ユーティリティーのオプションと同様です。詳細は、systemd-cgtop(1) の man ページを参照してください。
2.5. その他のリソース
インストールされているドキュメント
cgroup 関連の Systemd ツールの Man ページ
systemd-run(1): この man ページは、systemd-runユーティリティーのコマンドラインのすべてのオプションを一覧表示します。systemctl(1): systemctl ユーティリティーのこの man ページは、利用可能なオプションおよびコマンドを一覧表示します。systemd-cgls(1): この man ページは、systemd-cglsユーティリティーのコマンドラインのすべてのオプションを一覧表示します。systemd-cgtop(1): この man ページには、systemd-cgtopユーティリティーのコマンドラインのすべてのオプションの一覧が含まれています。machinectl(1): この man ページは、machinectlユーティリティーのコマンドラインのすべてのオプションを一覧表示します。systemd.kill(5): この man ページは、システムユニットの kill 設定オプションの概要を示します。
コントローラー固有のカーネルのついてのドキュメント
root として以下を入力します。
yuminstallkernel-doc
/usr/share/doc/kernel-doc-<kernel_version>/Documentation/cgroups/ ディレクトリーの下に表示されます。
blkioサブシステム:blkio-controller.txtcpuacctサブシステム:cpuacct.txtcpusetサブシステム:cpusets.txtdevicesサブシステム:devices.txtfreezerサブシステム:freezer-subsystem.txtmemoryサブシステム:memory.txtnet_clssubsystem —net_cls.txt
cpu サブシステムについての詳しい情報は、以下のファイルを参照してください。
- リアルタイムスケジューリング —
/usr/share/doc/kernel-doc-<kernel_version>/Documentation/scheduler/sched-rt-group.txt - CFS スケジューリング —
/usr/share/doc/kernel-doc-<kernel_version>/Documentation/scheduler/sched-bwc.txt
オンラインのドキュメント
- Red Hat Enterprise Linux 7 システム管理者のガイド: システム管理者のガイド は Red Hat Enterprise Linux 7 の導入、設定および管理についての関連情報を記載しています。このガイドは、システムの基本的な知識のあるシステム管理者を対象にしています。
- The D-Bus API of systemd: systemd にアクセスするために使用される D-Bus API コマンドについての参考資料です。
第3章 libcgroup ツールの使用
注記
root として以下を実行します。
~]#yum install libcgroup~]#yum install libcgroup-tools
注記
net_prio コントローラーは、他のコントローラーのようにカーネルにコンパイルされません。これは、マウントを試行する前に読み込まれている必要のあるモジュールです。このモジュールを読み込むには、root として以下を入力します。
modprobenetprio_cgroup
3.1. 階層のマウント
/etc/cgconfig.conf 設定ファイルの mount セクションを編集することにより階層を追加したり、分離させたりします。この方法はコントローラーの接続を永続化します。つまり設定がシステムの起動後も保持されることを意味します。代替方法として、mount コマンドを使用して、現行セッション用にのみ一時的なマウントを作成することもできます。
cgconfig サービスの使用
cgconfig サービスは、追加のリソースコントローラーの階層をマウントする方法を提供します。デフォルトで、このサービスは自動的に起動しません。cgconfig を起動すると、これは /etc/cgconfig.conf 設定ファイルの設定を適用します。したがって、設定はセッションごとに再作成され、永続化します。cgconfig を停止する場合、これがマウントしたすべての階層がアンマウントすることに注意してください。
/etc/cgconfig.conf ファイルにはいずれの設定内容も記載されておらず、systemd が主なリソースコントローラーを自動的にマウントするという情報のみが含まれます。
/etc/cgconfig.conf に作成できます。マウントエントリーは仮想ファイルシステムとして階層を作成し、マウントするために使用され、コントローラーをそれらの階層に割り当てます。Red Hat Enterprise Linux 7 では、デフォルトの階層が /sys/fs/cgroup/ ディレクトリーに自動的にマウントされるため、cgconfig はデフォルト以外のコントローラーを割り当てるためにのみ使用されます。mount エントリーは以下の構文を使用して定義されます。
mount {
controller_name = /sys/fs/cgroup/controller_name;
…
}
例3.1 mount エントリーの作成
net_prio コントローラーをデフォルトの cgroup ツリーに割り当てるには、以下のテキストを /etc/cgconfig.conf 設定ファイルに追加します。
mount {
net_prio = /sys/fs/cgroup/net_prio;
}cgconfig サービスを再起動します。
systemctlrestartcgconfig.service
/etc/cgconfig.conf のグループエントリーは、リソースコントローラーのパラメーターを設定するために使用できます。グループエントリーの詳細は、「cgroup パラメーターの設定」 を参照してください。
/etc/cgconfig.conf のテンプレートエントリーは、すべてのプロセスに適用されるグループ定義を作成するために使用できます。
mount コマンドの使用
mount コマンドを使用して、階層を一時的にマウントします。これを実行するには、まずマウントポイントを /sys/fs/cgroup/ ディレクトリーに作成します。このディレクトリーで systemd は主なリソースコントローラーをマウントします。root として以下を入力します。
mkdir/sys/fs/cgroup/name
mount コマンドを実行し、階層をマウントして、1 つ以上のサブシステムを同時に割り当てます。root として以下を入力します。
mount-tcgroup-ocontroller_namenone/sys/fs/cgroup/controller_name
-t cgroup パラメーターはマウントのタイプを指定します。
例3.2 コントローラーを割り当てる mount コマンドの使用
mount コマンドを使用して net_prio コントローラーの階層をマウントするには、まずマウントポイントを作成します。
~]#mkdir/sys/fs/cgroup/net_prio
net_prio を直前のステップで作成したマウント先にマウントします。
~]#mount-tcgroup-onet_prionone/sys/fs/cgroup/net_prio
lssubsys コマンドを使用し、現在のマウントポイントと共にすべての利用可能な階層を一覧表示することで、階層を正しく割り当てたかどうかを確認できます (「コントローラーの一覧表示」 を参照)。
~]# lssubsys -am
cpuset /sys/fs/cgroup/cpuset
cpu,cpuacct /sys/fs/cgroup/cpu,cpuacct
memory /sys/fs/cgroup/memory
devices /sys/fs/cgroup/devices
freezer /sys/fs/cgroup/freezer
net_cls /sys/fs/cgroup/net_cls
blkio /sys/fs/cgroup/blkio
perf_event /sys/fs/cgroup/perf_event
hugetlb /sys/fs/cgroup/hugetlb
net_prio /sys/fs/cgroup/net_prio3.2. 階層のアンマウント
/etc/cgconfig.conf 設定ファイルを編集して階層をマウントした場合、この設定ファイルのmount セクションから設定の指示文を単純に削除することにより、階層をアンマウントできます。次に、新規の設定を適用するためにサービスを再起動します。
root として以下のコマンドを実行して階層をアンマウントできます。
~]#umount/sys/fs/cgroup/controller_name
警告
umount を使用するようにしてください。デフォルトコントローラー (Red Hat Enterprise Linux 7 で利用可能なコントローラー に一覧を記載) が含まれる階層の割り当てを解除すると、システム再起動が必要な複雑な状況が発生する可能性があります。
3.3. コントロールグループの作成
cgcreate コマンドを使用して、独自に作成した階層に一時的な cgroup を作成します。cgcreate の構文は以下のようになります。
cgcreate-tuid:gid-auid:gid-gcontrollers:path
-t(オプション) は、ユーザー (ユーザー ID、uid) とグループ (グループ ID、gid) を指定して、この cgroup のtasks疑似ファイルを所有するためのオプションです。このユーザーは cgroup にタスクを追加することができます。注記
cgroup からタスクを削除するには、異なる cgroup にプロセスを移動するのが唯一の手段である点に注意してください。プロセスを移動するには、ユーザーは 移動先の cgroup への書き込みアクセスが必要となります。元の cgroup への書き込みアクセスは必要ではありません。-a(オプション): ユーザー (ユーザー ID、uid) とグループ (グループ ID、gid) を指定して、この cgroup のtasks以外の全疑似ファイルを所有するようにします。このユーザーは cgroup 内のタスクについてのシステムリソースへのアクセスを変更できます。-g: cgroup が作成されるべき階層を、それらの階層に関連付けられるコンマ区切りの subsystems 一覧として指定します。コントローラーの一覧の後には、コロンおよび階層に対して相対的な子グループへの path が続きます。このパスには、階層のマウントポイントを入れないでください。
mkdir コマンドを使用します。
~]# mkdir /sys/fs/cgroup/controller/name/child_name~]# mkdir /sys/fs/cgroup/net_prio/lab1/group13.4. コントロールグループの削除
cgcreate の構文に似た構文を持つ cgdelete コマンドに置き換えます。root として以下のコマンドを実行します。
cgdelete controllers:path- controllers はコントローラーのコンマ区切りの一覧です。
- path は、階層の root に対して相対的な cgroup へのパスです。
~]# cgdelete net_prio:/test-subgroupcgdelete では -r オプションが指定されていると、すべてのサブグループを再帰的に解除することもできます。
3.5. cgroup パラメーターの設定
/etc/cgconfig.conf 設定ファイルを編集するか、または cgset コマンドを使用することによりコントロールグループのパラメーターを変更します。/etc/cgconfig.conf に加えられる変更は再起動後も保持され、cgset は現行セッション用にのみ cgroup パラメーターを変更します。
/etc/cgconfig.conf の変更
/etc/cgconfig.conf の Groups セクションでコントローラーパラメーターを設定できます。グループエントリーは以下の構文を使用して定義されます。
group name {
[permissions]
controller {
param_name = param_value;
…
}
…
}
permissions セクションはオプションであることに注意してください。グループエントリーのパーミッションを定義するには、以下の構文を使用します。
perm {
task {
uid = task_user;
gid = task_group;
}
admin {
uid = admin_name;
gid = admin_group;
}
}
注記
/etc/cgconfig.conf の変更を有効にするには、cgconfig サービスを再起動します。このサービスを再起動すると、設定ファイルに指定される階層が再構築されますが、すべてのマウントされた階層には影響はありません。systemctl restart コマンドを実行してサービスを起動することができますが、まず cgconfig サービスを停止することをお勧めします。
~]# systemctl stop cgconfigcgconfig を再び起動できます。
~]# systemctl start cgconfigcgset コマンドの使用
cgset コマンドを実行してコントローラーパラメーターを設定します。このコマンドは手動でマウントしたコントローラーにのみ使用します。
cgset の構文は以下のとおりです。
cgset-rparameter=value path_to_cgroup
- parameter は設定するパラメーターで、特定の cgroup のディレクトリー内のファイルに対応します。
- value はパラメーター用の値です。
- path_to_cgroup は、階層の root に対して相対的な cgroup へのパスです。
cgset で設定できる値は、特定の階層でより高く設定されている値によって左右される可能性があります。たとえば、group1 がシステム上の CPU 0 のみを使用するように制限されている場合、group1/subgroup1 が CPU 0 および 1 を使用するように、または CPU 1 のみを使用するように設定することはできません。
cgset を使用して 1 つの cgroup のパラメーターを別の既存の cgroup にコピーすることもできます。cgset を使用してパラメーターをコピーするための構文は以下のようになります。
cgset--copy-frompath_to_source_cgroup path_to_target_cgroup
- path_to_source_cgroup は、コピーするパラメーターを持つ cgroup の、その階層の root グループに対して相対的なパスです。
- path_to_target_cgroup は、その階層の root グループに対して相対的な、コピー先 cgroup へのパスです。
3.6. コントロールグループへのプロセス移動
cgclassify コマンドを実行して、プロセスを cgroup に移動します。
cgclassify-gcontrollers:path_to_cgroup pidlist
- controllers は、コンマ区切りのリソースコントローラーの一覧、または利用可能なすべてのサブシステムに関連付けられた階層内のプロセスを起動するために
*に置き換えます。同じ名前の cgroup が複数存在する場合には、-gオプションを指定すると、プロセスがそれらのグループのそれぞれに移動することに注意してください。 - path_to_cgroup は、その階層内の cgroup へのパスです
- pidlist は、プロセス識別子 (PID) のスペースで区切られた一覧です。
-g オプションが指定されていない場合、cgclassify は /etc/cgrules.conf を自動的に検索し、最初に適用できる設定ラインを使用します。このラインに基づいて、cgclassify はプロセスの移動先となる階層と cgroup を判別します。正常に移動するには、移動先の階層が存在していなければなりません。/etc/cgrules.conf に指定されるサブシステムは、/etc/cgconfig.conf の対応する階層に適切に設定されている必要があります。
--sticky オプションを追加すると、同じ cgroup 内に任意の子プロセスを維持することもできます。このオプションを設定せず、かつ cgred サービスが稼働中の場合、子プロセスは /etc/cgrules.conf の設定に基づいて cgroup に割り当てられます。そのプロセス自体は、それを起動した cgroup に残ります。
/etc/cgrules.conf ファイルに設定されているパラメーターセットに従ってタスクを cgroup に移動するcgred サービス (cgrulesengd サービスを起動する) を使用することもできます。手動で接続されたコントローラーを管理するには cgred のみを使用します。/etc/cgrules.conf ファイル内のエントリーは、次の 2 つの形式のいずれかを取ります。
- user subsystems control_group;
- user:command subsystems control_group.
maria net_prio /usergroup/staff
maria というユーザーに属するプロセスはいずれも /usergroup/staff cgroup 内に指定されたパラメーターに従って devices サブシステムにアクセスすることを指定します。特定のコマンドを特定の cgroup に関連付けるには、以下のようにして command パラメーターを追加します。
maria:ftp devices /usergroup/staff/ftp
maria という名前のユーザーが ftp コマンドを使用する時には、devices サブシステムが入っている階層の /usergroup/staff/ftp cgroup へプロセスが自動的に移動するように指定されるようになります。 ただし、このデーモンは、該当する条件が満たされている場合にのみ、プロセスを cgroup に移動する点に注意してください。このため、ftp プロセスが、誤ったグループで短時間実行される可能性があります。また、そのプロセスが誤ったグループ内にある間に子プロセスが急速に生成した場合には、それらは移動しない可能性があります。
/etc/cgrules.conf ファイル内のエントリーには、以下のような表記を追加することが可能です。
@: user にプレフィックスを付けた場合には、個別のユーザーではなくグループを示します。 たとえば、@adminsはadminsグループ内のすべてのユーザーです。*: 「すべて」を示します。たとえば、subsystemフィールド内の*はすべてのサブシステムを示します。%: 上の行の項目と同じ項目であることを示します。以下はその例です。@adminstaff net_prio /admingroup @labstaff % %
3.7. コントロールグループ内のプロセスの起動
cgexec コマンドを実行して手動で作成される cgroup でプロセスを起動します。cgexec の構文は以下のとおりです。
cgexec-gcontrollers:path_to_cgroup command arguments
- controllers は、コンマ区切りのリソースコントローラーの一覧、または利用可能なすべてのサブシステムに関連付けられた階層内のプロセスを起動するために
*に置き換えます。「cgroup パラメーターの設定」 で説明されているcgsetコマンドの場合のように、同じ名前の cgroup が存在する場合、-gオプションを指定すると、それらの各グループにプロセスが作成されることに注意してください。 - path_to_cgroup は、階層に対して相対的な cgroup へのパスです。
- command は cgroup で実行されるコマンドです。
- arguments はコマンドの引数です。
-- sticky オプションを追加すると、同じ cgroup の子プロセスを維持することもできます。このオプションを設定しないで cgred サービスが稼働していると、子プロセスは /etc/cgrules.conf の設定に基づいて cgroup に割り当てられます。しかし、プロセス自体はそれを起動した cgroup 内に残ります。
3.8. コントロールグループに関する情報の取得
コントローラーの一覧表示
cat /proc/cgroupslssubsys -m controllerslssubsys -m コマンドでは、各階層ごとの最上位のマウントポイントのみが返される点に注意してください。
コントロールグループの確認
root として以下を実行します。
lscgroupcontroller:path の形式でコントローラーとパスを指定します。以下はその例です。
~]$ lscgroup cpuset:adminuserscpuset コントローラーが接続されている階層内の adminusers cgroup のサブグループのみを一覧表示します。
コントロールグループのパラメーターの表示
~]$ cgget -r parameter list_of_cgroups~]$ cgget -g cpuset /3.9. その他のリソース
インストールされているドキュメント
libcgroup に関連した man ページ
cgclassify(1):cgclassifyコマンドは、実行中のタスクを 1 つまたは複数の cgroup に移動するために使用されます。cgclear(1):cgclearコマンドは、1 つの階層内のすべての cgroup を削除するために使用されます。cgconfig.conf(5): cgroup はcgconfig.confファイル内で定義されます。cgconfigparser(8):cgconfigparserコマンドはcgconfig.confファイルを解析して、階層をマウントします。cgcreate(1):cgcreateコマンドは、階層内に新たな cgroup を作成します。cgdelete(1):cgdeleteコマンドは指定された cgroup を削除します。cgexec(1):cgexecコマンドは指定された cgroup 内のタスクを実行します。cgget(1):cggetコマンドは cgroup パラメーターを表示します。cgsnapshot(1):cgsnapshotコマンドは、既存のサブシステムから設定ファイルを生成します。cgred.conf(5):cgred.confはcgredサービスの設定ファイルです。cgrules.conf(5):cgrules.confには、タスクが特定の cgroup に属する場合にこれを判別するためのルールが含まれます。cgrulesengd(8):cgrulesengdサービスは、タスクを cgroup に配分します。cgset(1):cgsetコマンドは、cgroup のパラメーターを設定します。lscgroup(1):lscgroupコマンドは、階層内の cgroup を一覧表示します。lssubsys(1):lssubsysコマンドは、指定されたサブシステムを含む階層を一覧表示します。
第4章 コントロールグループの適用例
4.1. データベース I/O の優先度設定

図4.1 リソース割り当てを使用しない I/O スループット
手順4.1 I/O スループットの優先度設定
- リソースアカウンティングが優先度の高いサービスと優先度の低いサービスの両方に設定されていることを確認します。
~]#
systemctlset-propertydb1.serviceBlockIOAccounting=true~]#systemctlset-propertydb2.serviceBlockIOAccounting=true - 優先度の高いサービスと優先度の低いサービスの比を 10:1 に設定します。それらのサービスで実行されているプロセスは、それらのサービスで利用可能なリソースのみを使用します。
~]#
systemctlset-propertydb1.serviceBlockIOWeight=1000~]#systemctlset-propertydb2.serviceBlockIOWeight=100

図4.2 I/O スループットとリソース割り当て
blkio コントローラーに関する説明を参照してください。
4.2. ネットワークトラフィックの優先度設定
net_prio コントローラーを使用して、cgroup 内のプロセスのネットワークの優先順位を設定することができます。次に、これらの優先度が Type of Service (ToS) ビットに変換され、各パケットに埋め込まれます。2 つのファイル共有サービス (NFS および Samba) の優先度を設定するには、手順4.2「ファイル共有サービスのネットワーク優先度の設定」 の手順に従ってください。
手順4.2 ファイル共有サービスのネットワーク優先度の設定
net_prioコントローラーはカーネルにコンパイルされません。これは手動で読み込む必要のあるモジュールです。これを実行するには、以下を入力します。~]#
modprobe netprio_cgroupnet_prioサブシステムを/cgroup/net_priocgroup に接続します。~]#
mkdir sys/fs/cgroup/net_prio~]#mount -t cgroup -o net_prio none sys/fs/cgroup/net_prio- サービスごとに 2 つの cgroup を作成します。
~]#
mkdir sys/fs/cgroup/net_prio/nfs_high~]#mkdir sys/fs/cgroup/net_prio/samba_low nfs_highcgroup にnfsサービスを自動的に移動するには、/etc/sysconfig/nfsファイルに以下の行を追加します。CGROUP_DAEMON="net_prio:nfs_high"
この設定により、nfsサービスが起動または再起動する際にnfsサービスプロセスがnfs_highcgroup に確実に移動します。smbdサービスの設定ファイルは/etc/sysconfigディレクトリーにはありません。smbdサービスをsamba_lowcgroup に自動的に移動するには、/etc/cgrules.confファイルに以下の行を追加してください。*:smbd net_prio samba_low
このルールにより、/usr/sbin/smbdのみではなく、すべてのsmbdサービスがsamba_lowcgroup に移動する点に注意してください。同様に、nmbdおよびwinbinddサービスをsamba_lowcgroup に移動させるルールを定義することができます。cgredサービスを起動して、前の手順からの設定を読み込みます。~]#
systemctl start cgredStarting CGroup Rules Engine Daemon: [ OK ]- この例では、両方のサービスが
eth1ネットワークインターフェースを使用していることを前提とします。各 cgroup にネットワークの優先度を定義します。ここで1は優先度が低く、10は優先度が高いことを示します。~]#
echo "eth1 1" > /sys/fs/cgroup/net_prio/samba_low/net_prio.ifpriomap~]#echo "eth1 10" > /sys/fs/cgroup/net_prio/nfs_high/net_prio.ifpriomap nfsおよびsmbサービスを起動し、それらのプロセスが正しい cgroup に移動したことを確認します。~]#
systemctl start smbStarting SMB services: [ OK ] ~]#cat /sys/fs/cgroup/net_prio/samba_low/tasks16122 16124 ~]#systemctl start nfsStarting NFS services: [ OK ] Starting NFS quotas: [ OK ] Starting NFS mountd: [ OK ] Stopping RPC idmapd: [ OK ] Starting RPC idmapd: [ OK ] Starting NFS daemon: [ OK ] ~]#cat sys/fs/cgroup/net_prio/nfs_high/tasks16321 16325 16376NFS から発信されるネットワークトラフィックの優先度が、Samba から発信されるトラフィックよりも高くなりました。
net_prio サブシステムはクライアントアプリケーション (例: Firefox) のネットワーク優先度設定に使用することができます。
付録A 改訂履歴
| 改訂履歴 | |||
|---|---|---|---|
| 改訂 0.0-1.7.3 | Mon Jul 3 2017 | ||
| |||
| 改訂 0.0-1.7.2 | Mon Feb 27 2017 | ||
| |||
| 改訂 0.0-1.7.1 | Sun Feb 26 2017 | ||
| |||
| 改訂 0.0-1.7 | Mon Oct 17 2016 | ||
| |||
| 改訂 0.0-1.6 | Wed Nov 11 2015 | ||
| |||
| 改訂 0.0-1.4 | Thu Feb 19 2015 | ||
| |||
| 改訂 0.0-1.0 | Mon Jul 21 2014 | ||
|
| |||
| 改訂 0.0-0.14 | Mon May 13 2013 | ||
| |||
