BeagleBone Black(BBB)에서 실행되는 소프트웨어의 성능을 분석해야 합니다. BBB는 최대 1GHz, 512MB RAM 및 4GB eMMC 온보드 플래시 메모리에서 실행되는 ARM Cortex-A8을 갖추고 있습니다. 자세한 내용은 여기에서 확인할 수 있습니다. https://beagleboard.org/black
14GB MicroSD에서 부팅된 데비안 불스아이를 실행하는 BBB:
debian@BeagleBone:~$ uname -a
Linux BeagleBone 5.10.109-ti-r45 #1bullseye SMP PREEMPT Fri May 6 16:59:02 UTC 2022 armv7l GNU/Linux
질문
첫 번째 실험으로 iostat
병렬로 실행 중 입니다 dd
.
dd if=/dev/urandom of=~debian/ddtest/200MBfile bs=1M count=200 & iostat -xdz 1 20
iostat
반환된 활용도 값이 100%보다 큰 이유를 이해할 수 없습니다 . 매초마다 1
명령줄에 매개변수로 지정된 측정항목이 표시됩니다. 다음은 터미널에서 본 내용의 일부입니다.
Device r/s rkB/s rrqm/s %rrqm r_await rareq-sz w/s wkB/s wrqm/s %wrqm w_await wareq-sz d/s dkB/s drqm/s %drqm d_await dareq-sz f/s f_await aqu-sz %util
mmcblk0 0.00 0.00 0.00 0.00 0.00 0.00 18.00 9216.00 0.00 0.00 1062.00 512.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 19.12 92.80
Device r/s rkB/s rrqm/s %rrqm r_await rareq-sz w/s wkB/s wrqm/s %wrqm w_await wareq-sz d/s dkB/s drqm/s %drqm d_await dareq-sz f/s f_await aqu-sz %util
mmcblk0 0.00 0.00 0.00 0.00 0.00 0.00 16.00 8192.00 7.00 30.43 2058.25 512.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 32.93 101.20
Device r/s rkB/s rrqm/s %rrqm r_await rareq-sz w/s wkB/s wrqm/s %wrqm w_await wareq-sz d/s dkB/s drqm/s %drqm d_await dareq-sz f/s f_await aqu-sz %util
mmcblk0 0.00 0.00 0.00 0.00 0.00 0.00 25.00 12800.00 0.00 0.00 2295.64 512.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 57.39 103.60
Device r/s rkB/s rrqm/s %rrqm r_await rareq-sz w/s wkB/s wrqm/s %wrqm w_await wareq-sz d/s dkB/s drqm/s %drqm d_await dareq-sz f/s f_await aqu-sz %util
mmcblk0 0.00 0.00 0.00 0.00 0.00 0.00 33.00 15908.00 0.00 0.00 1136.58 482.06 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 37.51 89.60
mmcblk0
은 14GB 메모리의 이름입니다( 그림 참조 lsblk
).
sysstat
포함된 패키지 에서 직접 다운로드했습니다.iostat
https://packages.debian.org/stable/sysstat버전을 설치했습니다 12.5.2-2
.
sudo apt list | grep sysstat sysstat/stable,now 12.5.2-2 armhf [residual-config]
소스 코드를 확인한 결과 활용도가 다음 줄 sysstat
에서 381
계산되는 것으로 나타났습니다 rd_stats.c
.
xds→util = S_VALUE(spd→tot_ticks, sdc→tot_ticks, itc);
S_VALUE
154
다음 줄에 정의된 매크로입니다 common.h
.
#define S_VALUE(m,n,p) (((double) ((n) - (m))) / (p) * 100)
초당 I/O iostat
읽기를 ms
수행하는 데 소요된 시간입니다 /proc/diskstats
. 이 변수는 sdc->tot_ticks
마지막으로 읽은 값, sdp->tot_ticks
마지막 샘플의 값을 나타내지만 itc
명령줄에서 설정한 샘플링 간격(예: 1초)을 나타냅니다.
iostat
왜 반환 값이 100%보다 큰지 이해가 되지 않습니다 . I/O()를 수행하는 데 걸리는 시간이 sdc->tot_ticks - sdp->tot_ticks
일반적으로 .보다 길다는 것을 알았습니다 itc
. 내 생각에는 iostat
디스크 작업이 수행 중이거나 dd
샘플 사이의 스케줄러에 의해 선점되거나 /proc/diskstat
일부 프로세스가 병렬로 실행되고 있는 것 같습니다.
실험
몇 가지 실험을 했지만 여전히 문제의 원인을 이해하지 못합니다.
으로 iotop
어떤 프로세스가 동시에 실행되고 있는지 확인했습니다 dd
. jb2 및 systemdjournald라는 저널링 프로세스를 발견했습니다. 레코드의 10번째 필드 /proc/diskstats
는 동시성을 고려하여 시간 대기열과 디스크 사용량을 나타내므로 디스크 활용도에는 영향을 미치지 않습니다 (https://serverfault.com/questions/862334/interpreting-read-write-and-total-io-time-in-proc-diskstats).
iostat
나는 10번째 필드를 검색 /proc/diskstats
하고 주어진 관찰 시간에 대한 활용도를 계산 하는 간단한 bash 스크립트(이 단락에 첨부됨)를 만들었습니다 . 첫 번째 시도와 마찬가지로 관찰 기간을 1초로 설정했는데 iostat
, 활용도가 100%를 넘었습니다. 나는 이것이 iostat
문제가 되지 않는다고 생각합니다. 이 질문은 다음과 같습니다:
https://github.com/sysstat/sysstat/issues/73#issuecomment-860158402
bash 스크립트를 사용하면 에서보다 더 나은 값을 얻을 수 있습니다 . 이는 스크립트 실행 시간을 연장하는 읽기 또는 BBB 성능 iostat
때문이라고 생각합니다 ./proc/diskstats
iostat
#!/bin/bash
for (( i=0; i<$2; i++ ));
do
value=$(cat "/proc/diskstats" | awk '/ mmcblk0 / {print $13}')
if [ ! -z "$prev" ]; then
bc -l <<< "scale=4;(($value - $prev)/($1*1000))*100"
fi
sleep $1
prev=$value
done
dd
이 옵션을 사용 하면 디스크 사용률이 감소하는 것으로 나타났습니다 oflag=sync
. 또한 로깅 프로세스는 동시에 실행되지 않고 dd
이후에 실행됩니다. 이 플래그는 장치가 실제로 기록될 때까지 쓰기 프로세스를 차단합니다. 다음은 perf
블록 I/O 요청을 발행한 출력 기록입니다.
sudo perf record -e block:block_rq_insert -a dd if=/de/urandom of=~debian/ddtest/500MBfile bs=1M count=200
아니요oflag=sync
그리고oflag=sync
커널이 어떻게 업데이트되는지 모르겠습니다 /proc/diskstats
. 나보다 경험이 더 많은 플랫폼 사용자가 이 문제를 이해하는 데 도움을 줄 수 있기를 바랍니다. 감사해요.