システムリソース制御 - IOWriteIOPSMaxが機能しませんか?

システムリソース制御 - IOWriteIOPSMaxが機能しませんか?

IOを特定の単位に制限しようとしていますが、IOWriteIOPSMaxプロパティは何の効果もないようです。

最初はIOWeightを試してみましたが、テストするのは難しく、IOPSMaxのドキュメントではこれが純粋な制限であると提案しました。

ポップアップオペレーティングシステム、systemd 249、cgroupv2

デフォルトでは実行

user@x1:~/tmp$ systemd-run --user --same-dir --pipe --wait \
dd status=progress if=/dev/zero of=loadfile bs=1k count=5000024 

Running as unit: run-u233.service
4876370944 bytes (4.9 GB, 4.5 GiB) copied, 32 s, 152 MB/s 
5000024+0 records in
5000024+0 records out
5120024576 bytes (5.1 GB, 4.8 GiB) copied, 32.914 s, 156 MB/s
Finished with result: success
Main processes terminated with: code=exited/status=0
Service runtime: 33.592s
CPU time consumed: 16.924s

制限を設けて実行 - 意図的に非常に低く設定:

user@x1:~/tmp$ systemd-run --user --same-dir --pipe --wait \
-p IOAccounting=yes \
-p IOWriteIOPSMax="/dev/nvme0n1 5" \
-p IOReadIOPSMax="/dev/nvme0n1 5" \
dd status=progress if=/dev/zero of=loadfile bs=1k count=5000024 

Running as unit: run-u234.service
5090277376 bytes (5.1 GB, 4.7 GiB) copied, 19 s, 268 MB/s
5000024+0 records in
5000024+0 records out
5120024576 bytes (5.1 GB, 4.8 GiB) copied, 19.2141 s, 266 MB/s
Finished with result: success
Main processes terminated with: code=exited/status=0
Service runtime: 19.899s
CPU time consumed: 16.838s

どちらの実行も同じ時間がかかるようです。systemctl show unit | grep IO両方のプロパティが設定されていることを確認してください。

他のウィンドウでiostat -xd 1/ dev/nvme0n1300w / sが表示されるのを見ると、適用されたプロパティは10未満に減少すると予想されます。私のアプローチに問題がありますか?

編集:追加/proc/self/cgroup情報:

user@x1:~$ systemd-run --user --same-dir --pipe --wait -p IOAccounting=yes -p IOWriteIOPSMax="/dev/nvme0n1 5" -p IOReadIOPSMax="/dev/nvme0n1 5" cat /proc/self/cgroup
Running as unit: run-u282.service
0::/user.slice/user-1000.slice/[email protected]/app.slice/run-u282.service

編集:rootとして実行

root@x1:~# systemd-run  --same-dir --pipe --wait \
-p IOAccounting=yes \
-p IOWriteIOPSMax="/dev/nvme0n1 5" \
-p IOReadIOPSMax="/dev/nvme0n1 5" \
dd status=progress if=/dev/zero of=loadfile bs=1k count=5000024 

Running as unit: run-u1099.service
4847981568 bytes (4.8 GB, 4.5 GiB) copied, 17 s, 285 MB/s
5000024+0 records in
5000024+0 records out
5120024576 bytes (5.1 GB, 4.8 GiB) copied, 17.9437 s, 285 MB/s
Finished with result: success
Main processes terminated with: code=exited/status=0
Service runtime: 17.945s
CPU time consumed: 16.748s
IO bytes read: 0B
IO bytes written: 0B

編集:そして標準単位として使用されます。ルートとして実行

root@x1:/etc/systemd/system# systemctl cat testme.service
# /etc/systemd/system/testme.service
[Service]
IOAccounting=yes
IOReadIOPSMax=/root 10
IOWriteIOPSMax=/root 10
ExecStart=dd status=progress if=/dev/zero of=/root/loadfile bs=1k count=5000024 


root@x1:/etc/systemd/system# journalctl -u testme.service -f
Nov 05 14:20:25 x1 systemd[1]: Started testme.service.
Nov 05 14:20:50 x1 dd[56684]: [1.3K blob data]
Nov 05 14:20:50 x1 dd[56684]: 5000024+0 records in
Nov 05 14:20:50 x1 dd[56684]: 5000024+0 records out
Nov 05 14:20:50 x1 dd[56684]: 5120024576 bytes (5.1 GB, 4.8 GiB) copied, 24.6735 s, 208 MB/s
Nov 05 14:20:50 x1 systemd[1]: testme.service: Deactivated successfully.
Nov 05 14:20:50 x1 systemd[1]: testme.service: Consumed 17.352s CPU time.

(同じ結果/rootがに置き換えられます/dev/nvme..

答え1

答えは2つの部分に分かれています:

  • 設定すると、cgroupsファイルを介してIOWriteIOPSMax制限が適用されます。io.maxモードで実行すると--usercgroupを変更できないため、このオプションは効果がありません。
  • dd必要な方法で実行するときのデフォルト値は、非同期I / Oを使用することです。つまり、データが実際にディスクに書き込まれるまで、プロセスはブロックされません。そのため、IOWriteIOPSMax操作には影響しません。実際にテストするには、データが実際にディスクに書き込まれるように同期I / Oを使用する必要があります。oflag=syncコマンドにフラグを追加するだけですdd

テストスクリプト

これらの条件をテストして検証するために、次のようなスクリプトを作成しました。

  1. io.maxcgroupファイルが存在し、実際に制限があることを確認してください。
  2. 2つのコマンドを実行しますdd。最初のコマンドには非同期I / Oがあり、2番目のコマンドには同期I / Oがあります。
cat systemd_io.sh
#!/bin/bash
CGROUPS="$(</proc/self/cgroup)"
echo "/proc/self/cgroup: '$CGROUPS'" 
IO_MAX_FILE="/sys/fs/cgroup/${CGROUPS#0::/}/io.max"
if [ -f "$IO_MAX_FILE" ]
then
        IO_MAX="$(<$IO_MAX_FILE)" 
        if [ -z "$IO_MAX" ]
        then echo "$IO_MAX_FILE exists but is empty."
        else printf "Content of %s:\n%s\n" "$IO_MAX_FILE" "$IO_MAX"
        fi
else
        echo $IO_MAX_FILE does not exist.
fi
echo
echo Writing file without sync:
dd if=/dev/zero of=loadfile bs=1k count=10 2>&1 |tail -1
rm -f loadfile
echo
echo Writing file WITH oflag=sync:
dd if=/dev/zero of=loadfile bs=1k count=10 oflag=sync 2>&1 |tail -1
rm -f loadfile
echo

systemd-run--user旗を持って走る

  • cgroupio.maxファイルも生成されないため、IOは制限されません。
root:~/tmp$ systemd-run --user --same-dir --pipe --wait -p IOWriteIOPSMax="/dev/vda 5" ./systemd_io.sh 2>/dev/null
/proc/self/cgroup: '0::/user.slice/user-0.slice/[email protected]/app.slice/run-u18.service'
/sys/fs/cgroup/user.slice/user-0.slice/[email protected]/app.slice/run-u18.service/io.max does not exist.

Writing file without sync:
10240 bytes (10 kB, 10 KiB) copied, 0.000142996 s, 71.6 MB/s

Writing file WITH oflag=sync:
10240 bytes (10 kB, 10 KiB) copied, 0.00483422 s, 2.1 MB/s

systemd-runフラグなし--user動作とフラグなし動作IOWriteIOPSMax

  • cgroupファイルがio.max作成されましたが空なので制限はありません。
  • 同期I / Oの書き込み比率はユーザー書き込み比率と同じです。
root:~/tmp$ systemd-run --same-dir --pipe --wait  ./systemd_io.sh 2>/dev/null
/proc/self/cgroup: '0::/system.slice/run-u187.service'
/sys/fs/cgroup/system.slice/run-u187.service/io.max exists but is empty.

Writing file without sync:
10240 bytes (10 kB, 10 KiB) copied, 0.000144849 s, 70.7 MB/s

Writing file WITH oflag=sync:
10240 bytes (10 kB, 10 KiB) copied, 0.00446492 s, 2.3 MB/s

systemd-run表示なしで動作--userします。IOWriteIOPSMax

  • cgroupio.maxファイルにはIOWriteIOPSMax
  • 非同期I / Oは影響を受けませんが(上記の理由で)、今回は同期I / Oが以前よりはるかに遅くなりました(〜2 MB / sではなく1.8 kB / s)。動作していることが確認されましたIOWriteIOPSMax
root:~/tmp$ systemd-run --same-dir --pipe --wait -p IOWriteIOPSMax="/dev/sda 5" ./systemd_io.sh 2>/dev/null
/proc/self/cgroup: '0::/system.slice/run-u189.service'
Content of /sys/fs/cgroup/system.slice/run-u189.service/io.max:
253:0 rbps=max wbps=max riops=max wiops=5

Writing file without sync:
10240 bytes (10 kB, 10 KiB) copied, 0.000136314 s, 75.1 MB/s

Writing file WITH oflag=sync:
10240 bytes (10 kB, 10 KiB) copied, 5.78732 s, 1.8 kB/s

関連情報