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/nvme0n1
300w / 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
モードで実行すると--user
cgroupを変更できないため、このオプションは効果がありません。 dd
必要な方法で実行するときのデフォルト値は、非同期I / Oを使用することです。つまり、データが実際にディスクに書き込まれるまで、プロセスはブロックされません。そのため、IOWriteIOPSMax
操作には影響しません。実際にテストするには、データが実際にディスクに書き込まれるように同期I / Oを使用する必要があります。oflag=sync
コマンドにフラグを追加するだけですdd
。
テストスクリプト
これらの条件をテストして検証するために、次のようなスクリプトを作成しました。
io.max
cgroupファイルが存在し、実際に制限があることを確認してください。- 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
旗を持って走る
- cgroup
io.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
- cgroup
io.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