Red Hat Training

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

2.3. コントロールグループの変更

systemd による永続ユニットのそれぞれには、/usr/lib/systemd/system/ ディレクトリーにユニット設定ファイルがあります。サービスユニットのパラメーターを変更するには、この設定ファイルを変更します。これは、systemctl set-property コマンドを使用して、手動またはコマンドラインインターフェースから実行できます。

2.3.1. コマンドラインインターフェースからのパラメーターの設定

systemctl set-property コマンドを使用すると、アプリケーションのランタイム時にリソース制御の設定を永続的に変更できます。これを行うには、root として以下の構文を使用します。
~]# systemctl set-property name parameter=value
name を、変更する systemd ユニットの名前に置き換え、parameter を、変更するパラメーターの名前に置き換え、value を、このパラメーターに割り当てる新しい値に置き換えます。
「ユニットファイルの変更」systemctl set-property では、複数のプロパティーを一度に変更できます。
変更は即座に適用され、ユニットファイルに書き込まれ、再起動後に保持されるようにします。この動作を変更するには、設定を一時的にする --runtime オプションを指定します。
~]# systemctl set-property --runtime name property=value

例2.2 systemctl set-property の使用

コマンドラインから httpd.service の CPU およびメモリーの使用状況を制限するには、以下を入力します。
~]# systemctl set-property httpd.service CPUShares=600 MemoryLimit=500M
これを一時的に変更するには、--runtime オプションを追加します。
~]# systemctl set-property --runtime httpd.service CPUShares=600 MemoryLimit=500M

2.3.2. ユニットファイルの変更

systemd サービスユニットファイルは、リソース管理に役立つ多くの高レベルの設定パラメーターを提供します。これらのパラメーターは Linux cgroup コントローラーと通信し、カーネルで有効にする必要があります。これらのパラメーターを使用して、CPU、メモリー消費、ブロック IO、さらに粒度の細かいユニットプロパティーを管理できます。

CPU の管理

cpu コントローラーは、カーネル内でデフォルトで有効になっており、すべてのシステムサービスは、含まれるプロセスの数にかかわらず、同じ CPU 時間を受け取ります。このデフォルトの動作は、/etc/systemd/system.conf 設定ファイルの DefaultControllers パラメーターで変更できます。CPU 割り当てを管理するには、ユニット設定ファイルの [Service] セクションで以下のディレクティブを使用します。
CPUShares=value
value を、CPU 共有数に置き換えます。デフォルト値は 1024 です。数値を大きくすると、CPU 時間を単位に割り当てます。CPUShares パラメーターの値を設定すると、ユニットファイルで CPUAccounting が自動的に有効になります。したがって、ユーザーは systemd-cgtop コマンドでプロセッサーの使用を監視できます。
CPUShares パラメーターは cpu.shares コントロールグループパラメーターを制御します。他の CPU コントローラー固有のカーネルドキュメント コントローラーの説明を参照してください。

例2.3 ユニットの CPU 使用率の制限

デフォルトの 1024 ではなく Apache サービス 1500 CPU 共有を割り当てるには、以下の内容で新たな /etc/systemd/system/httpd.service.d/cpu.conf 設定ファイルを作成します。
[Service]
CPUShares=1500
変更を適用するには、systemd の設定を再読み込みし、変更したサービスファイルを考慮して Apache を再起動します。
~]# systemctl daemon-reload
~]# systemctl restart httpd.service
CPUQuota=value
value を、指定された CPU 時間クォータを実行したプロセスに割り当てる CPU 時間クォータの値に置き換えます。パーセンテージで表される CPUQuota パラメーターの値は、1 つの CPU 時間で利用可能な CPU 時間の合計と、そのユニットが最大で取得する CPU 時間を指定します。
100% より大きい値は、複数の CPU が使用されることを示します。CPUQuota は、統一されたコントロールグループ階層の cpu.max 属性と、レガシー cpu.cfs_quota_us 属性を制御します。CPUQuota パラメーターの値を設定すると、ユニットファイルで CPUAccounting が自動的に有効になります。したがって、ユーザーは systemd-cgtop コマンドでプロセッサーの使用を監視できます。

例2.4 CPUQuota の使用

CPUQuota を 20% に設定すると、実行されたプロセスが 1 つの CPU で 20% を超える CPU 時間を取得できなくなります。
Apache サービス CPU クォータが 20% のものを割り当てるには、以下の内容を /etc/systemd/system/httpd.service.d/cpu.conf 設定ファイルに追加します。
[Service]
CPUQuota=20%
変更を適用するには、systemd の設定を再読み込みし、変更したサービスファイルを考慮して Apache を再起動します。
~]# systemctl daemon-reload
~]# systemctl restart httpd.service

メモリーの管理

ユニットのメモリー消費を制限するには、ユニット設定ファイルの [Service] セクションで以下のディレクティブを使用します。
MemoryLimit=value
value を、cgroup で実行されるプロセスの最大メモリー使用量の制限に置き換えます。測定単位のキロバイト、メガバイト 、ギガバイト、またはテラバイトを指定するには、接尾辞 K、M、G、または T を使用します。また、ユニット用に MemoryAccounting パラメーターを有効にする必要があります
TheMemoryLimit パラメーターは、memory.limit_in_bytes コントロールグループパラメーターを制御します。詳細は、メモリーコントローラーの説明を参照してください コントローラー固有のカーネルドキュメント

例2.5 ユニットのメモリー消費の制限

1GB のメモリー上限を Apache サービスに割り当てるには、/etc/systemd/system/httpd.service.d/cpu.conf ユニットファイルのMemoryLimit 設定を変更します。
[Service]
MemoryLimit=1G
変更を適用するには、systemd の設定を再読み込みし、変更したサービスファイルを考慮して Apache を再起動します。
~]# systemctl daemon-reload
~]# systemctl restart httpd.service

ブロック IO の管理

Block IO を管理するには、ユニット設定ファイルの [Service] セクションで以下のディレクティブを使用します。以下のディレクティブは、BlockIOAccounting パラメーターが有効になっていることを前提としています
BlockIOWeight=value
実行したプロセスの新しいブロック IO ウェイトに値を置き換えます。10 から 1000 までの値を 1 つ選択します。デフォルト値は 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 と同じ引数を受け入れます。
上記のディレクティブはそれぞれ、対応する cgroup パラメーターを制御します。他の CPU 関連の制御パラメーターについては、blkio コントローラーの説明を参照してください コントローラー固有のカーネルドキュメント
注記
現在、blkio リソースコントローラーはバッファーされた書き込み操作をサポートしません。これは主に直接 I/O を対象とするため、バッファーされた書き込みを使用するサービスは、BlockIOWriteBandwidth で設定された制限を無視します。一方、バッファーされた読み取り操作がサポートされ、BlockIOReadBandwidth 制限は直接読み取りとバッファーされた読み取りの両方に正常に適用されます。

例2.6 ユニットのブロック IO の制限

/home/jdoe/ ディレクトリーにアクセスする Apache サービスのブロック IO ウェイトを下げるには、以下のテキストを /etc/systemd/system/httpd.service.d/cpu.conf ユニットファイルに追加します。
[Service]
BlockIODeviceWeight=/home/jdoe 750
Apache 読み取りの最大帯域幅を、1 秒あたり /var/log/ ディレクトリーから 5MB に設定するには、以下の構文を使用します。
[Service]
BlockIOReadBandwidth=/var/log 5M
変更を適用するには、systemd の設定を再読み込みし、変更したサービスファイルを考慮して Apache を再起動します。
~]# systemctl daemon-reload
~]# systemctl restart httpd.service

その他のシステムリソースの管理

リソース管理を容易にするために、ユニットファイルで使用できる他のディレクティブがいくつかあります。
DeviceAllow=device_name options
このオプションは、特定のデバイスノードへのアクセスを制御します。device_name は、デバイスノードまたはデバイスグループ名へのパスを /proc/devices で指定します。options を、r、w、および m の組み合わせで、ユニットがデバイスノードの読み取り、書き込み、または作成を可能にします。
DevicePolicy=value
ここで、value は、strict (デバイスAllowで指定されたアクセスの種類のみ)、終了 /dev/null、/dev/zero、/dev/full、/dev/random、および /dev/urandom)などの標準の擬似デバイスへのアクセスを許可します (明示的なデバイス Allow がない場合、デフォルトの動作)。
Slice=slice_name
slice_name を、ユニットを配置するスライスの名前に置き換えます。デフォルトは system.slice です。スコープのユニットは、親スライスと関連付けられているため、このように配置することはできません。
ExecStartPost=command
現在、systemd は cgroup 機能のサブセットのみをサポートします。ただし、回避策として、ExecStartPost= オプションで memory.memsw.limit_in_bytes パラメーターを設定して、サービスにスワップの使用を防ぐために パラメーターを設定します。ExecStartPost= の詳細は、systemd.service(5) man ページを参照してください。

例2.7 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 設定を再読み込みし、変更した設定を考慮してサービスを再起動します。
~]# systemctl daemon-reload
~]# systemctl restart example.service

このページには機械翻訳が使用されている場合があります (詳細はこちら)。