systemdを使用したcgroups v2の管理
cgroups v2を使用してリソース割当てを管理するための優先される方法は、systemdによって提供される制御グループ機能を使用することです。
ノート:
システムでcgroups v2機能を有効にする方法の詳細は、『Oracle Linux 8: カーネルおよびシステム・ブートの管理』を参照してくださいデフォルトでは、systemdは、ホストに設定されたsystemdサービスごとにcgroupフォルダを作成します。systemdは、servicename.serviceという形式を使用してこれらのフォルダに名前を付けます。servicenameは、フォルダに関連付けられたサービスの名前です。
systemdがサービスに対して作成するcgroupフォルダのリストを表示するには、次のサンプル・コード・ブロックに示すように、cgroupファイル・システムのsystem.sliceブランチでlsコマンドを実行します:
ls /sys/fs/cgroup/system.slice/
... ... ...
app_service1.service cgroup.subtree_control httpd.service
app_service2.service chronyd.service ...
... crond.service ...
cgroup.controllers dbus-broker.service ...
cgroup.events dtprobed.service ...
cgroup.freeze firewalld.service ...
... gssproxy.service ...
... ... ...-
フォルダapp_service1.
serviceおよびapp_service2.serviceは、システム上に存在する可能性のあるカスタム・アプリケーション・サービスを表します。
systemdでは、サービス制御グループに加えて、ホスト上のユーザーごとにcgroupフォルダも作成されます。 各ユーザーに対して作成されたcgroupを確認するには、次のサンプル・コード・ブロックに示すように、cgroupファイル・システムのuser.sliceブランチでlsコマンドを実行します:
ls /sys/fs/cgroup/user.slice/
cgroup.controllers cgroup.subtree_control user-1001.slice
cgroup.events cgroup.threads user-982.slice
cgroup.freeze cgroup.type ...
... ... ...
... ... ...
... ... ...前述のコード・ブロックの内容は次のとおりです:
-
各ユーザーの
cgroupフォルダには、user-UID.sliceという形式を使用して名前が付けられます。 したがって、制御グループuser-1001.sliceは、たとえばUIDが1001のユーザー用です。
systemdは、cgroupおよびカーネル・リソース・コントローラ機能への高レベルのアクセスを提供するため、ファイル・システムに直接アクセスする必要はありません。 たとえば、app_service1.serviceというサービスのCPUの重みを設定するには、次のようにsystemctl set-propertyコマンドを実行します:
sudo systemctl set-property app_service1.service CPUWeight=150したがって、systemdを使用すると、systemd機能を使用せずにcgroupを構成するときに使用されるプロセスのPIDレベルではなく、アプリケーション・レベルでリソース配分を管理できます。
systemdでのスライスとリソース割当てについて
この項では、次の円グラフの例に示すように、systemdがデフォルトの各カーネル・コントローラ(たとえば、CPU、memoryおよびblkio)をスライスと呼ばれる部分に分割する方法を確認します:
ノート:
リソース・コントローラ・オプションの設定およびカスタム・スライスの作成の項に示すように、リソース配分用に独自のカスタム・スライスを作成することもできます。図7-1 CPUやメモリーなどのリソース・コントローラの配分を示す円グラフ

前述の円グラフが示すように、デフォルトでは、各リソース・コントローラは次の3つのスライス間で均等に分割されます:
-
System (
system.slice)。 -
User (
user.slice)。 -
Machine (
machine.slice)。
次のリストは、各スライスをさらに詳しく示します。 説明のために、リストの例ではCPUコントローラに焦点を当てています。
- System (
system.slice) -
このリソース・スライスは、デーモンおよびサービス・ユニット間のリソース割当てを管理するために使用されます。
前述の円グラフの例に示すように、システム・スライスはさらにサブスライスに分割されます。 たとえば、CPUリソースの場合、次のようにサブスライスの割当てがシステム・スライス内に存在する可能性があります:-
httpd.service(CPUWeight=100) -
sshd.service(CPUWeight=100) -
crond.service(CPUWeight=100) -
app1.
service(CPUWeight=100) -
app2.
service(CPUWeight=100)
serviceおよびapp2.serviceは、システムで実行している可能性のあるカスタム・アプリケーション・サービスを表します。 -
- User (
user.slice) - このリソース・スライスは、ユーザー・セッション間のリソース割当てを管理するために使用されます。 関連付けられたユーザーがサーバーでアクティブになっているログインの数に関係なく、
UIDごとに1つのスライスが作成されます。 円グラフの例に続いて、サブスライスは次のようになります:-
user1 (
CPUWeight=100,UID=982) -
user2 (
CPUWeight=100,UID=1001)
-
- Machine (
machine.slice) - このリソース・スライスは、KVMゲストやLinuxコンテナなどのホストされた仮想マシン間のリソース割当ての管理に使用されます。 マシン・スライスは、サーバーが仮想マシンまたはLinuxコンテナをホストしている場合にのみサーバーに存在します。
ノート:
共有割当てでは、リソースの最大制限は設定されません。
たとえば、前述の例では、スライスuser.sliceには、user1およびuser2の2人のユーザーがあります。 各ユーザーには、親user.sliceで使用可能なCPUリソースの等しい共有が割り当てられます。 ただし、user1に関連付けられたプロセスがアイドル状態であり、CPUリソースを必要としない場合、そのCPU共有は必要に応じてuser2への割当てに使用できます。 このような状況では、他のユーザーが必要とする場合、親user.sliceに割り当てられているCPUリソース全体がuser2に割り当てられることもあります。
CPUリソースを制限するには、CPUQuotaプロパティを必要な割合に設定する必要があります。
cgroup階層内のスライス、サービスおよびスコープ
前述の項で使用されている円グラフから類推すると、リソースの区分をスライスに概念化できます。 ただし、構造的な組織では、制御グループは階層に配置されます。 systemd-cglsコマンドを次のように実行すると、システム上のsystemd制御グループ階層を表示できます:
ヒント:
次の例のように、ルート・スライス-.sliceから始まるcgroup階層全体を表示するには、制御グループ・マウント・ポイント/sys/fs/cgroup/の外部からsystemd-cglsを実行してください。 それ以外の場合、/sys/fs/cgroup/内からコマンドを実行すると、コマンドの実行元のcgroupの場所から出力が開始されます。 詳細は、systemd-cgls(1)を参照してください。
systemd-cglsControl group /:
-.slice
...
ââuser.slice (#1429)
â â user.invocation_id: 604cf5ef07fa4bb4bb86993bb5ec15e0
â ââuser-982.slice (#4131)
â â â user.invocation_id: 9d0d94d7b8a54bcea2498048911136c8
â â ââsession-c1.scope (#4437)
â â â ââ2416 /usr/bin/sudo -u ocarun /usr/libexec/oracle-cloud-agent/plugins/runcommand/runcommand
â â â ââ2494 /usr/libexec/oracle-cloud-agent/plugins/runcommand/runcommand
â â ââuser@982.service ⦠(#4199)
â â â user.delegate: 1
â â â user.invocation_id: 37c7aed7aa6e4874980b79616acf0c82
â â ââinit.scope (#4233)
â â ââ2437 /usr/lib/systemd/systemd --user
â â ââ2445 (sd-pam)
â ââuser-1001.slice (#7225)
â â user.invocation_id: ce93ad5f5299407e9477964494df63b7
â ââsession-2.scope (#7463)
â â ââ20304 sshd: oracle [priv]
â â ââ20404 sshd: oracle@pts/0
â â ââ20405 -bash
â â ââ20441 systemd-cgls
â â ââ20442 less
â ââuser@1001.service ⦠(#7293)
â â user.delegate: 1
â â user.invocation_id: 70284db060c1476db5f3633e5fda7fba
â ââinit.scope (#7327)
â ââ20395 /usr/lib/systemd/systemd --user
â ââ20397 (sd-pam)
ââinit.scope (#19)
â ââ1 /usr/lib/systemd/systemd --switched-root --system --deserialize 28
ââsystem.slice (#53)
...
ââdbus-broker.service (#2737)
â â user.invocation_id: 2bbe054a2c4d49809b16cb9c6552d5a6
â ââ1450 /usr/bin/dbus-broker-launch --scope system --audit
â ââ1457 dbus-broker --log 4 --controller 9 --machine-id 852951209c274cfea35a953ad2964622 --max-bytes 536870912 --max-fds 4096 --max-matches 131072 --audit
...
ââchronyd.service (#2805)
â â user.invocation_id: e264f67ad6114ad5afbe7929142faa4b
â ââ1482 /usr/sbin/chronyd -F 2
ââauditd.service (#2601)
â â user.invocation_id: f7a8286921734949b73849b4642e3277
â ââ1421 /sbin/auditd
â ââ1423 /usr/sbin/sedispatch
ââtuned.service (#3349)
â â user.invocation_id: fec7f73678754ed687e3910017886c5e
â ââ1564 /usr/bin/python3 -Es /usr/sbin/tuned -l -P
ââsystemd-journald.service (#1837)
â â user.invocation_id: bf7fb22ba12f44afab3054aab661aedb
â ââ1068 /usr/lib/systemd/systemd-journald
ââatd.service (#3961)
â â user.invocation_id: 1c59679265ab492482bfdc9c02f5eec5
â ââ2146 /usr/sbin/atd -f
ââsshd.service (#3757)
â â user.invocation_id: 57e195491341431298db233e998fb180
â ââ2097 sshd: /usr/sbin/sshd -D [listener] 0 of 10-100 startups
ââcrond.service (#3995)
â â user.invocation_id: 4f5b380a53db4de5adcf23f35d638ff5
â ââ2150 /usr/sbin/crond -n
...
前述のサンプル出力は、すべての*.slice制御グループがルート・スライス-.sliceの下にどのように存在しているかを示しています。 ルート・スライスの下には、 user.sliceおよびsystem.slice制御グループがあり、それぞれに子cgroupサブスライスがあります。
systemd-cgls コマンドの出力を確認すると、ルート-.sliceを除いて、すべてのプロセスがリーフ・ノード上にあることがわかります。 この配置は、cgroups v2によって"内部プロセスなし"ルールと呼ばれるルールで強制されます。 "内部プロセスなし"ルールの詳細は、cgroups (7)を参照してください。
前述のsystemd-cgls コマンド例の出力では、スライスにsystemdスコープの子制御グループを含める方法も示しています。systemdスコープについては、次の項で説明します。
systemdスコープ
systemdスコープは、systemdとは無関係に起動されたシステム・サービス・ワーカー・プロセスをグループ化するsystemdユニット・タイプです。 スコープ・ユニットは、systemdのバス・インタフェースを使用してプログラムで作成される一時cgroupです。
たとえば、次のサンプル・コードでは、UID 1001のユーザーがsystemd-cglsコマンドを実行しており、出力には、systemdとは関係なくユーザーが生成したプロセス(コマンド自体のプロセス21380 sudo systemd-cglsを含む)に対してsession-2.scopeが作成されていることが示されています:
ノート:
次の例では、制御グループのマウント・ポイント/sys/fs/cgroup/内からコマンドが実行されています。 したがって、ルート・スライスのかわりに、コマンドの実行元のcgroupの場所から出力が開始されます。
sudo systemd-cglsWorking directory /sys/fs/cgroup:
...
ââuser.slice (#1429)
â â user.invocation_id: 604cf5ef07fa4bb4bb86993bb5ec15e0
â â trusted.invocation_id: 604cf5ef07fa4bb4bb86993bb5ec15e0
...
â ââuser-1001.slice (#7225)
â â user.invocation_id: ce93ad5f5299407e9477964494df63b7
â â trusted.invocation_id: ce93ad5f5299407e9477964494df63b7
â ââsession-2.scope (#7463)
â â ââ20304 sshd: oracle [priv]
â â ââ20404 sshd: oracle@pts/0
â â ââ20405 -bash
â â ââ21380 sudo systemd-cgls
â â ââ21382 systemd-cgls
â â ââ21383 less
â ââuser@1001.service ⦠(#7293)
â â user.delegate: 1
â â trusted.delegate: 1
â â user.invocation_id: 70284db060c1476db5f3633e5fda7fba
â â trusted.invocation_id: 70284db060c1476db5f3633e5fda7fba
â ââinit.scope (#7327)
â ââ20395 /usr/lib/systemd/systemd --user
â ââ20397 (sd-pam)リソース・コントローラ・オプションの設定およびカスタム・スライスの作成
systemdには、システムでのリソース割当てをカスタマイズするために、CPUWeight、CPUQuotaなどのリソース・コントローラ・オプションを設定するための次の方法が用意されています:
-
サービス・ユニット・ファイルの使用。
-
ドロップイン・ファイルの使用。
-
systemctl set-propertyコマンドの使用。
次の項では、これらの各方法を使用してシステム内のリソースとスライスを構成する手順の例を示します。
systemctl set-propertyの使用
systemctl set-propertyコマンドは、構成ファイルを次の場所に配置します:
/etc/systemd/system.control
注意:
systemctl set-propertyコマンドで作成されるファイルを手動で編集しないでください。
ノート:
systemctl set-propertyコマンドでは、このトピックで前述したシステム・ユニット・ファイルおよびドロップイン・ファイルで使用されるすべてのリソース制御プロパティが認識されるわけではありません。
次の手順では、systemctl set-propertyコマンドを使用してリソース割当てを構成する方法を示します: