我需要分析在 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
,即包含在内的包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)
每秒从 中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
我不知道内核是如何更新的/proc/diskstats
。我希望平台上比我更有经验的人可以帮助我理解这个问题。谢谢。