iostat는 Beaglebone Black Board를 분석할 때 100%보다 큰 디스크 사용률을 반환합니다.

iostat는 Beaglebone Black Board를 분석할 때 100%보다 큰 디스크 사용률을 반환합니다.

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포함된 패키지 에서 직접 다운로드했습니다.iostathttps://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_VALUE154다음 줄에 정의된 매크로입니다 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/diskstatsiostat

#!/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

nooflag=동기화

그리고oflag=sync

oflag=sync 사용

커널이 어떻게 업데이트되는지 모르겠습니다 /proc/diskstats. 나보다 경험이 더 많은 플랫폼 사용자가 이 문제를 이해하는 데 도움을 줄 수 있기를 바랍니다. 감사해요.

관련 정보