iostat 在分析 Beaglebone Black 板时返回大于 100% 的磁盘利用率

iostat 在分析 Beaglebone Black 板时返回大于 100% 的磁盘利用率

我需要分析在 BeagleBone Black (BBB) 上运行的软件的性能。 BBB 具有频率高达 1GHz 的 ARM Cortex-A8、512MB RAM 和 4GB eMMC 板载闪存。您可以在这里找到更多信息: https://beagleboard.org/black

BBB 运行从 14GB MicroSD 启动的 Debian bullseye:

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.cxds→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)

每秒从 中iostat读取ms执行 I/O 所花费的时间/proc/diskstats。该变量sdc->tot_ticks代表最后读取的值,sdp->tot_ticks上一次采样的值,而是itc我们从命令行设置的采样间隔(即一秒)。

我不明白为什么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)。

我制作了一个简单的 bash 脚本(附在本段中),它模仿iostat.它检索第 10 个字段/proc/diskstats并计算给定观察时间的利用率。我将观察期设置为 1 秒,与我第一次尝试时相同iostat,并获得了超过 100% 的利用率。我相信这iostat不是问题,正如这个问题所证实的: https://github.com/sysstat/sysstat/issues/73#issuecomment-860158402

使用 bash 脚本,我得到的值甚至比从iostat.我相信这是由于/proc/diskstats读数或 BBB 性能延长了脚本(或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

oflag=sync

与 oflag=sync

我不知道内核是如何更新的/proc/diskstats。我希望平台上比我更有经验的人可以帮助我理解这个问题。谢谢。

相关内容