
BeagleBone Black(BBB)で実行されているソフトウェアのパフォーマンスを分析する必要があります。 BBBは、最大1GHz、512MB RAM、および4GB eMMCオンボードフラッシュメモリで動作するARM Cortex-A8を備えています。詳細はこちらからご覧いただけます。 https://beagleboard.org/black
14 GB MicroSD から起動した Debian ブルスアイを実行する 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)
1秒あたりのI / Oiostat
読み取りを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
。私よりも経験豊富なプラットフォームユーザーがこの問題を理解するのに役立つことを願っています。ありがとうございます。