시스템 리소스 제어 - 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@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

대답은 두 부분으로 나누어져 있습니다:

  • 설정되면 cgroups 파일을 통해 IOWriteIOPSMax제한이 적용됩니다 . io.max모드에서 실행할 때는 --usercgroup을 변경할 수 없으므로 이 옵션은 효과가 없습니다.
  • dd원하는 방식으로 실행할 때 기본값은 비동기 I/O를 사용하는 것입니다. 즉, 데이터가 실제로 디스크에 기록될 때까지 프로세스가 차단되지 않습니다. 그렇기 때문에 IOWriteIOPSMax작동에는 영향을 미치지 않습니다. 실제로 테스트하려면 데이터가 실제로 디스크에 기록되도록 동기식 I/O를 사용해야 합니다. oflag=sync명령에 플래그를 추가하면 됩니다 dd.

테스트 스크립트

이러한 조건을 테스트하고 확인하기 위해 다음을 수행하는 스크립트를 만들었습니다.

  1. io.maxcgroup 파일이 존재하는지, 실제로 제한 사항이 있는지 확인하십시오 .
  2. 두 개의 명령을 실행합니다 dd. 첫 번째 명령에는 비동기 I/O가 있고 두 번째 명령에는 동기 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가 이전보다 훨씬 느려졌습니다(~2MB/s 대신 1.8kB/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

관련 정보