Red Hat Training

A Red Hat training course is available for Red Hat Enterprise Linux

第2章 コントロールグループの使用

以下のセクションでは、コントロールグループの作成および管理に関連するタスクの概要を示します。本書は、cgroup 管理の方法として推奨され、今後サポートされる予定の systemd によって提供されるユーティリティーに焦点を当てています。以前のバージョンの Red Hat Enterprise Linux では、cgroup の作成および管理の目的で libcgroup パッケージを使用しています。このパッケージは後方互換性を確保するために依然として使用できますが (警告 を参照)、Red Hat Enterprise Linux の今後のバージョンではサポートされません。

2.1. コントロールグループの作成

systemd の観点では、cgroup はユニットファイルで設定し、systemd のコマンドラインユーティリティーで管理できるシステムユニットにバインドされます。アプリケーションのタイプによっては、リソース管理設定を 一時的な 設定にすることも、永続的な 設定にすることもできます。
サービスの 一時的な cgroup を作成するには、サービスを systemd-run コマンドで起動します。これにより、ランタイム時にサービスによって消費されるリソースに制限を設定することができます。各種のアプリケーションは、systemd への API 呼び出しを使用して一時的な cgroup を動的に作成できます。API の参考情報については 「オンラインのドキュメント」 を参照してください。一時的なユニットは、サービスが停止するとすぐに自動的に削除されます。
永続的な cgroup をサービスに割り当てるには、そのユニット設定ファイルを編集します。この設定はシステムの再起動後も保存されるため、この設定を使用して自動的に起動するサービスを管理することができます。スコープユニットはこの方法では作成できないことに注意してください。

2.1.1. systemd-run を使用した一時的な cgroup の作成

systemd-run コマンドは、一時的な サービス または スコープ ユニットを作成および起動し、このユニットでカスタムコマンドを実行するために使用されます。サービスユニットで実行されるコマンドはバックグランドで非同期に開始し、それらのコマンドは systemd プロセスから起動します。スコープユニットで実行されるコマンドは systemd-run プロセスから直接開始されるため、呼び出し側の実行環境を継承します。この場合は同期的に実行されます。
指定された cgroup でコマンドを実行するには、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=test top -b
以下のメッセージが、サービスを正常に起動したことを確認するために表示されます。
Running as unit toptest.service
ここで、toptest.service という名前は systemctl コマンドで cgroup をモニタリングまたは変更するために使用できます。

2.1.2. 永続的な cgroup の作成

システムの起動時にユニットを自動的に起動するように設定するには、systemctl enable コマンドを実行します (Red Hat Enterprise Linux 7 システム管理者のガイドsystemd によるサービス管理 の章を参照してください)。このコマンドを実行すると、ユニットファイルが /usr/lib/systemd/system/ ディレクトリーに自動的に作成されます。cgroup に永続的な変更を加えるには、そのユニットファイルの設定パラメーターを追加または変更します。詳細は、「ユニットファイルの変更」 を参照してください。