ノート:
- このチュートリアルは、Oracle提供の無料ラボ環境で入手できます。
- Oracle Cloud Infrastructureの資格証明、テナンシおよびコンパートメントに例の値を使用します。演習を完了するときは、これらの値をクラウド環境に固有の値に置き換えます。
Oracle Linuxでのラン・コントロール・グループ・バージョン2
イントロダクション
制御グループ(cgroups)は、実行中のプロセスのためのCPU時間、メモリー、ネットワーク帯域幅などのリソースを制限、優先順位付け、および割り当てするための Linuxカーネル機能です。
このチュートリアルでは、cgroups v2を使用したユーザー・プロセスのCPU時間の制限について説明します。
目的
この演習では、次のことを学習します。
- cgroups v2の有効化
- ユーザー・プロセスの弱いCPU制限の設定
- ユーザー・プロセスのハードCPU制限の設定
前提条件
- 次の構成で Oracle Linux 8がインストールされているシステム:
sudo
権限を持つroot以外のユーザー
演習環境の設定
ノート:無料の演習環境を使用する場合は、接続やその他の使用方法の手順について、Oracle Linuxの演習の基本を参照してください。
演習を開始する前に、いくつかのハウスキーピング項目を完了する必要があります。作成された項目は、cgroupの制限機能をデモンストレーションするために使用されます。
ロード生成スクリプトの作成
-
まだ接続されていない場合は、端末を開き、sshを介してol8-serverシステムに接続します。
ssh oracle@<ip_address_of_ol8-server>
-
foo.exe
スクリプトを作成します。echo '#!/bin/bash /usr/bin/sha1sum /dev/zero' > foo.exe
-
foo.exe
スクリプトを$PATH
内の場所にコピーし、適切な権限を設定します。sudo mv foo.exe /usr/local/bin/foo.exe sudo chown root:root /usr/local/bin/foo.exe sudo chmod 755 /usr/local/bin/foo.exe
ノート: (オプション) SELinux
enforcing
で実行している場合:sudo sestatus
次のコマンドを実行して、権限をコピーして変更した後、SELinuxラベルを修正します。
sudo /sbin/restorecon -v /usr/local/bin/foo.exe
ロード生成サービスを作成
-
foo.service
ファイルを作成します。echo '[Unit] Description=the foo service After=network.target [Service] ExecStart=/usr/local/bin/foo.exe [Install] WantedBy=multi-user.target' > foo.service
-
foo.service
スクリプトをsystemdスクリプトの場所にコピーし、適切な権限を設定します。sudo mv foo.service /etc/systemd/system/foo.service sudo chown root:root /etc/systemd/system/foo.service sudo chmod 644 /etc/systemd/system/foo.service
ノート: (オプション) SELinux
enforcing
で実行する場合は、次のコマンドを実行して、権限をコピーして変更した後、SELinuxラベルを修正します。sudo /sbin/restorecon -v /etc/systemd/system/foo.service
-
デーモンを再ロードすると、systemdが新しいサービスを認識します。
sudo systemctl daemon-reload
-
foo.service
を起動し、ステータスを確認します。sudo systemctl start foo.service sudo systemctl status foo.service
ユーザーの作成
追加のユーザーは、これらの異なるアカウントおよび異なるCPU重みでロード生成スクリプトを実行できます。
-
ユーザーを作成し、パスワードを設定します。
sudo useradd -u 8000 ralph sudo useradd -u 8001 alice echo "ralph:oracle" | sudo chpasswd echo "alice:oracle" | sudo chpasswd
-
SSH接続を許可します。
oracle
ユーザー・アカウントからSSHキーをコピーします。sudo mkdir /home/ralph/.ssh sudo cp /home/oracle/.ssh/authorized_keys /home/ralph/.ssh/authorized_keys sudo chown -R ralph:ralph /home/ralph/.ssh sudo chmod 700 /home/ralph/.ssh sudo chmod 600 /home/ralph/.ssh/authorized_keys
-
alice
ユーザーに対して繰り返します。sudo mkdir /home/alice/.ssh sudo cp /home/oracle/.ssh/authorized_keys /home/alice/.ssh/authorized_keys sudo chown -R alice:alice /home/alice/.ssh sudo chmod 700 /home/alice/.ssh sudo chmod 600 /home/alice/.ssh/authorized_keys
-
新しい端末を開き、両方のSSH接続が機能することを確認します。
ssh ralph@<ip_address_of_ol8-server>
次に、セッションを
exit
し、次のユーザーに対して繰り返します。ssh alice@<ip_address_of_ol8-server>
セッションを終了し、ターミナル・ウィンドウを閉じます。
cgroups v2をマウントします
Oracle Linuxは、起動時にデフォルトでcgroup v1をマウントします。cgroups v2を使用するには、ブート・カーネル・パラメータを手動で構成する必要があります。
-
oracle
としてログインしている端末に戻ります。 -
cgroups v2 systemdカーネル・パラメータを追加します。
sudo grubby --update-kernel=ALL --args="systemd.unified_cgroup_hierarchy=1"
かわりに、
sudo grubby --update-kernel=/boot/vmlinuz-$(uname -r) --args="systemd.unified_cgroup_hierarchy=1"
を実行して現在のブート・エントリのみを指定できます。 -
リブートします。
sudo reboot
リブートが完了するまでに数分かかります。
ノート:再起動が完了し、sshdデーモンが実行されるまで、システムにsshすることはできません。
-
sshを使用してol8-serverシステムに接続します。
ssh oracle@<ip_address_of_ol8-server>
-
cgroups v2がマウントされたことを確認します。
sudo mount -l | grep cgroup
出力例:
cgroup2 on /sys/fs/cgroup type cgroup2 (rw,nosuid,nodev,noexec,relatime,seclabel,nsdelegate)
-
cgroupsによってマウントされたディレクトリの内容を調べます。
ll /sys/fs/cgroup
出力例:
total 0 -r--r--r--. 1 root root 0 Mar 13 21:20 cgroup.controllers -rw-r--r--. 1 root root 0 Mar 13 21:20 cgroup.max.depth -rw-r--r--. 1 root root 0 Mar 13 21:20 cgroup.max.descendants -rw-r--r--. 1 root root 0 Mar 13 21:20 cgroup.procs -r--r--r--. 1 root root 0 Mar 13 21:20 cgroup.stat -rw-r--r--. 1 root root 0 Mar 13 21:20 cgroup.subtree_control -rw-r--r--. 1 root root 0 Mar 13 21:20 cgroup.threads -rw-r--r--. 1 root root 0 Mar 13 21:20 cpu.pressure -r--r--r--. 1 root root 0 Mar 13 21:20 cpuset.cpus.effective -r--r--r--. 1 root root 0 Mar 13 21:20 cpuset.mems.effective drwxr-xr-x. 2 root root 0 Mar 13 21:20 init.scope -rw-r--r--. 1 root root 0 Mar 13 21:20 io.pressure -rw-r--r--. 1 root root 0 Mar 13 21:20 memory.pressure drwxr-xr-x. 87 root root 0 Mar 13 21:20 system.slice drwxr-xr-x. 4 root root 0 Mar 13 21:24 user.slice
出力には、root制御グループがデフォルトの場所に表示されます。このディレクトリには、cgroupという接頭辞が付いたインタフェース・ファイルと、
.scope
および.slice
で終わるsystemd
に関連するディレクトリが含まれます。
仮想ファイル・システムの操作
開始する前に、/sys/fs/cgroup
にマウントされたcgroups仮想ファイル・システムについて少し学習する必要があります。
-
すべてのユーザのCPUに参加するCPUを表示します。
cat /sys/fs/cgroup/cpuset.cpus.effective
出力例:
[oracle@ol8-server ~]$ cat /sys/fs/cgroup/cpuset.cpus.effective 0-1
テスト・ボックスは、デュアルコア・システムであるVM.Standard2.1シェイプにデプロイされたOracle Linux 8インスタンスです。
-
アクティブなコントローラを表示します。
cat /sys/fs/cgroup/cgroup.controllers
出力例:
[oracle@ol8-server ~]$ cat /sys/fs/cgroup/cgroup.controllers cpuset cpu io memory pids rdma
この演習の後半で使用するため、CPUコントローラの存在を確認することをお薦めします。
-
oracle
によって生成されたプロセスを表示します。最初に、
oracle
のユーザーID (UID)を決定する必要があります。who id
出力例:
[oracle@ol8-server ~]$ who oracle pts/0 2022-03-13 21:23 (10.39.209.157) [oracle@ol8-server ~]$ id uid=1001(oracle) gid=1001(oracle) groups=1001(oracle),10(wheel) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
UIDを使用すると、
oracle
ユーザー・スライスを見つけることができます。cd /sys/fs/cgroup/user.slice ls
出力例:
[oracle@ol8-server ~]$ cd /sys/fs/cgroup/user.slice [oracle@ol8-server user.slice]$ ls cgroup.controllers cgroup.subtree_control memory.events memory.pressure pids.max cgroup.events cgroup.threads memory.events.local memory.stat user-0.slice cgroup.freeze cgroup.type memory.high memory.swap.current user-1001.slice cgroup.max.depth cpu.pressure memory.low memory.swap.events user-989.slice cgroup.max.descendants cpu.stat memory.max memory.swap.max cgroup.procs io.pressure memory.min pids.current cgroup.stat memory.current memory.oom.group pids.events
Systemdは、すべてのユーザーに
user-<UID>.slice
という名前のスライスを割り当てます。そのため、そのディレクトリの下には何がありますか。cd user-1001.slice ls
出力例:
[oracle@ol8-server user.slice]$ cd user-1001.slice/ [oracle@ol8-server user-1001.slice]$ ls cgroup.controllers cgroup.max.descendants cgroup.threads io.pressure user-runtime-dir@1001.service cgroup.events cgroup.procs cgroup.type memory.pressure cgroup.freeze cgroup.stat cpu.pressure session-3.scope cgroup.max.depth cgroup.subtree_control cpu.stat user@1001.service
これらは、
oracle
ユーザーの最上位レベルのcgroupです。ただし、cgroup.procs
にはプロセスはリストされていません。ユーザー・プロセスのリストはどこにありますか。cat cgroup.procs
出力例:
[oracle@ol8-server user-1001.slice]$ cat cgroup.procs [oracle@ol8-server user-1001.slice]$
oracle
がこの演習の最初にSSHセッションを開いたときに、ユーザー・セッションでスコープ・サブユニットが作成されました。このスコープでは、cgroup.procs
で、そのセッションで生成されたプロセスのリストを確認できます。ノート:システムへの接続数に基づいてユーザーが複数のセッションを持つ場合があります。そのため、必要に応じて、サンプル内の3を置き換えます。
cd session-3.scope ls cat cgroup.procs
出力例:
[oracle@ol8-server user-1001.slice]$ cd session-3.scope/ [oracle@ol8-server session-3.scope]$ ls cgroup.controllers cgroup.max.depth cgroup.stat cgroup.type io.pressure cgroup.events cgroup.max.descendants cgroup.subtree_control cpu.pressure memory.pressure cgroup.freeze cgroup.procs cgroup.threads cpu.stat [oracle@ol8-server session-3.scope]$ cat cgroup.procs 3189 3200 3201 54217
これで、プロセスが困難であることがわかったので、
systemd-cgls
を使用して、ツリーのようなビューで同じ情報を表示できます。ノート:仮想ファイルシステム内から実行する場合、
systemd-cgls
はcgroup出力を現在の作業ディレクトリに制限します。cd /sys/fs/cgroup/user.slice/user-1001.slice systemd-cgls
出力例:
[oracle@ol8-server user-1001.slice]$ systemd-cgls Working directory /sys/fs/cgroup/user.slice/user-1001.slice: ├─session-3.scope │ ├─ 3189 sshd: oracle [priv] │ ├─ 3200 sshd: oracle@pts/0 │ ├─ 3201 -bash │ ├─55486 systemd-cgls │ └─55487 less └─user@1001.service └─init.scope ├─3193 /usr/lib/systemd/systemd --user └─3195 (sd-pam)
使用中のCPUコアの制限
cgroups v2では、systemdはcpusetコントローラを完全に制御します。このレベルの制御により、管理者は特定のCPUコアでのみ作業をスケジュールできます。
-
CPUで
user.slice
を確認します。cd /sys/fs/cgroup/user.slice ls cat ../cpuset.cpus.effective
出力例:
[oracle@ol8-server cgroup]$ cd /sys/fs/cgroup/user.slice/ [oracle@ol8-server user.slice]$ ls cgroup.controllers cgroup.subtree_control memory.events memory.pressure pids.max cgroup.events cgroup.threads memory.events.local memory.stat user-0.slice cgroup.freeze cgroup.type memory.high memory.swap.current user-1001.slice cgroup.max.depth cpu.pressure memory.low memory.swap.events user-989.slice cgroup.max.descendants cpu.stat memory.max memory.swap.max cgroup.procs io.pressure memory.min pids.current cgroup.stat memory.current memory.oom.group pids.events [oracle@ol8-server user.slice]$ cat ../cpuset.cpus.effective 0-1
cpuset.cpus.effective
は、user.sliceによって使用される実際のコアを示しています。特定のcgroupディレクトリ内にパラメータが存在しない場合、または設定しない場合、値は親から継承されます。この場合も最上位レベルのcgroupルートディレクトリになります。 -
system
およびユーザー0、1001、および989スライスをCPUコア0に制限します。cat /sys/fs/cgroup/system.slice/cpuset.cpus.effective sudo systemctl set-property system.slice AllowedCPUs=0 cat /sys/fs/cgroup/system.slice/cpuset.cpus.effective
出力例:
[oracle@ol8-server user.slice]$ cat /sys/fs/cgroup/system.slice/cpuset.cpus.effective cat: /sys/fs/cgroup/system.slice/cpuset.cpus.effective: No such file or directory [oracle@ol8-server user.slice]$ sudo systemctl set-property system.slice AllowedCPUs=0 [oracle@ol8-server user.slice]$ cat /sys/fs/cgroup/system.slice/cpuset.cpus.effective 0
ノート:
No such file or directory
は、デフォルトでsystem
スライスが親からcpuset.cpus.effective
値を継承することを示します。sudo systemctl set-property user-0.slice AllowedCPUs=0 sudo systemctl set-property user-1001.slice AllowedCPUs=0 sudo systemctl set-property user-989.slice AllowedCPUs=0
-
ralph
ユーザーをCPUコア1に制限します。sudo systemctl set-property user-8000.slice AllowedCPUs=1 cat /sys/fs/cgroup/user.slice/user-8000.slice/cpuset.cpus.effective
出力例:
[oracle@ol8-server ~]$ sudo systemctl set-property user-8000.slice AllowedCPUs=1 [oracle@ol8-server ~]$ cat /sys/fs/cgroup/user.slice/user-8000.slice/cpuset.cpus.effective 1
-
新しいターミナルを開き、
ralph
としてsshを介してol8-serverシステムに接続します。ssh ralph@<ip_address_of_ol8-server>
-
foo.exe
スクリプトを使用してテストします。foo.exe &
結果を確認します。
top
top
が実行されると、1 key
を押してCPUを個別に表示します。出力例:
top - 18:23:55 up 21:03, 2 users, load average: 1.03, 1.07, 1.02 Tasks: 155 total, 2 running, 153 sleeping, 0 stopped, 0 zombie %Cpu0 : 6.6 us, 7.0 sy, 0.0 ni, 84.8 id, 0.0 wa, 0.3 hi, 0.3 si, 1.0 st %Cpu1 : 93.0 us, 6.0 sy, 0.0 ni, 0.0 id, 0.0 wa, 0.7 hi, 0.3 si, 0.0 st MiB Mem : 14707.8 total, 13649.1 free, 412.1 used, 646.6 buff/cache MiB Swap: 4096.0 total, 4096.0 free, 0.0 used. 13993.0 avail Mem PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 226888 ralph 20 0 228492 1808 1520 R 99.7 0.0 199:34.27 sha1sum 269233 root 20 0 223724 6388 1952 S 1.3 0.0 0:00.04 pidstat 1407 root 20 0 439016 41116 39196 S 0.3 0.3 0:17.81 sssd_nss 1935 root 20 0 236032 3656 3156 S 0.3 0.0 0:34.34 OSWatcher 2544 root 20 0 401900 40292 9736 S 0.3 0.3 0:10.62 ruby 1 root 20 0 388548 14716 9508 S 0.0 0.1 0:21.21 systemd ...
q
と入力して最上位を終了します。 -
プロセスを実行しているプロセッサをチェックする別の方法。
ps -eo pid,psr,user,cmd | grep ralph
出力例:
[ralph@ol8-server ~]$ ps -eo pid,psr,user,cmd | grep ralph 226715 1 root sshd: ralph [priv] 226719 1 ralph /usr/lib/systemd/systemd --user 226722 1 ralph (sd-pam) 226727 1 ralph sshd: ralph@pts/2 226728 1 ralph -bash 226887 1 ralph /bin/bash /usr/local/bin/foo.exe 226888 1 ralph /usr/bin/sha1sum /dev/zero 269732 1 ralph ps -eo pid,psr,user,cmd 269733 1 ralph grep --color=auto ralph
psr
列は、cmd
のCPU番号または実際のプロセスです。 -
終了して、
ralph
としてログインするために使用する端末ウィンドウを閉じます。 -
foo.exe
ジョブを終了します。oracle
としてログインしている端末に切り替えて、次のコマンドを実行します。sudo pkill sha1sum
ユーザーのCPU重量の調整
alice
を楽しむ時間。彼女は完了すべき重要な作業をいくつか持っているので、CPUの2倍の優先順位を彼女に与えます。
-
alice
をralph
と同じCPUに割り当てます。sudo systemctl set-property user-8001.slice AllowedCPUs=1 cat /sys/fs/cgroup/user.slice/user-8001.slice/cpuset.cpus.effective
-
CPUWeight
を設定します。sudo systemctl set-property user-8001.slice CPUWeight=200 cat /sys/fs/cgroup/user.slice/user-8001.slice/cpu.weight
デフォルトの重みは100であるため、200はその数値の2倍です。
-
新しいターミナルを開き、
ralph
としてsshを介してol8-serverシステムに接続します。ssh ralph@<ip_address_of_ol8-server>
-
ralph
としてfoo.exe
を実行します。foo.exe &
-
別の新しい端末を開き、
alice
としてsshを介してol8-serverシステムに接続します。ssh alice@<ip_address_of_ol8-server>
-
alice
としてfoo.exe
を実行します。foo.exe &
-
top
を介して、alice
の優先順位が高いことを確認します。top
トップが稼働したら、
1 key
を押してCPUを個別に表示します。出力例:
top - 20:10:55 up 25 min, 3 users, load average: 1.29, 0.46, 0.20 Tasks: 164 total, 3 running, 161 sleeping, 0 stopped, 0 zombie %Cpu0 : 0.0 us, 0.0 sy, 0.0 ni, 96.5 id, 0.0 wa, 0.0 hi, 3.2 si, 0.3 st %Cpu1 : 92.4 us, 7.6 sy, 0.0 ni, 0.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st MiB Mem : 15715.8 total, 14744.6 free, 438.5 used, 532.7 buff/cache MiB Swap: 4096.0 total, 4096.0 free, 0.0 used. 15001.1 avail Mem PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 7934 alice 20 0 15800 1768 1476 R 67.0 0.0 0:36.15 sha1sum 7814 ralph 20 0 15800 1880 1592 R 33.3 0.0 0:34.60 sha1sum 1 root 20 0 388476 14440 9296 S 0.0 0.1 0:02.22 systemd 2 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kthreadd ...
-
oracle
ユーザーとしてログインした端末に戻ります。 -
foo.service
を使用してsystem.slice
をロードします。sudo systemctl start foo.service
次に、
alice
端末ウィンドウで実行中の最上位の出力を確認します。ユーザーが重みに基づいてCPU 1を分割している間に、foo.service
がCPU 0を消費していることを確認します。出力例:
top - 19:18:15 up 21:57, 3 users, load average: 2.15, 2.32, 2.25 Tasks: 159 total, 4 running, 155 sleeping, 0 stopped, 0 zombie %Cpu0 : 89.1 us, 7.3 sy, 0.0 ni, 0.0 id, 0.0 wa, 0.7 hi, 0.3 si, 2.6 st %Cpu1 : 93.7 us, 5.3 sy, 0.0 ni, 0.0 id, 0.0 wa, 0.7 hi, 0.3 si, 0.0 st MiB Mem : 14707.8 total, 13640.1 free, 420.5 used, 647.2 buff/cache MiB Swap: 4096.0 total, 4096.0 free, 0.0 used. 13984.3 avail Mem PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 280921 root 20 0 228492 1776 1488 R 93.4 0.0 0:07.74 sha1sum 279185 alice 20 0 228492 1816 1524 R 65.6 0.0 7:35.18 sha1sum 279291 ralph 20 0 228492 1840 1552 R 32.8 0.0 7:00.30 sha1sum 2026 oracle-+ 20 0 935920 29280 15008 S 0.3 0.2 1:03.31 gomon 1 root 20 0 388548 14716 9508 S 0.0 0.1 0:22.30 systemd 2 root 20 0 0 0 0 S 0.0 0.0 0:00.10 kthreadd ...
CPU割当て制限の割当て
最後に、ralph
のCPU時間の上限を設定します。
-
oracle
ユーザーとしてログインした端末に戻ります。 -
割当てを5%に設定します
sudo systemctl set-property user-8000.slice CPUQuota=5%
変更はただちに有効になり、
alice
ユーザー端末で実行中の最上位の出力に表示されます。出力例:
top - 19:24:53 up 22:04, 3 users, load average: 2.21, 2.61, 2.45 Tasks: 162 total, 4 running, 158 sleeping, 0 stopped, 0 zombie %Cpu0 : 93.0 us, 4.7 sy, 0.0 ni, 0.0 id, 0.0 wa, 0.7 hi, 0.0 si, 1.7 st %Cpu1 : 91.7 us, 5.6 sy, 0.0 ni, 0.0 id, 0.0 wa, 1.0 hi, 1.0 si, 0.7 st MiB Mem : 14707.8 total, 13639.4 free, 420.0 used, 648.4 buff/cache MiB Swap: 4096.0 total, 4096.0 free, 0.0 used. 13984.7 avail Mem PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 280921 root 20 0 228492 1776 1488 R 97.4 0.0 6:26.75 sha1sum 279185 alice 20 0 228492 1816 1524 R 92.1 0.0 12:21.12 sha1sum 279291 ralph 20 0 228492 1840 1552 R 5.3 0.0 8:44.84 sha1sum 1 root 20 0 388548 14716 9508 S 0.0 0.1 0:22.48 systemd 2 root 20 0 0 0 0 S 0.0 0.0 0:00.10 kthreadd ...
-
oracle
端末ウィンドウを使用して、ralph
ユーザーのキャップを元に戻します。
echo "max 100000" | sudo tee -a user-8000.slice/cpu.max
割当て制限はcpu.max
ファイルに書き込まれ、デフォルトはmax 100000
です。
出力例:
[oracle@ol8-server user.slice]$ echo "max 100000" | sudo tee -a user-8000.slice/cpu.max max 100000
cgroups v2を有効にし、システムのロード中にユーザーを特定のCPUに制限し、そのCPUの割合のみを使用するようにロックできます。Oracle Linuxでその他のリソースを確認してください。
詳細情報
関連項目:
その他の学習リソース
docs.oracle.com/learnの他のラボを調べるか、Oracle Learning YouTubeチャネルでさらに無料の学習コンテンツにアクセスします。さらに、education.oracle.com/learning-explorerにアクセスしてOracle Learning Explorerにします。
製品ドキュメントは、Oracleヘルプ・センターを参照してください。
Run Control Groups Version 2 on Oracle Linux
F54932-01
March 2022
Copyright © 2022, Oracle and/or its affiliates.