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

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付属のパッケージから直接ダウンロードしました。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]

ソースコードを確認したところ、利用率は次の行sysstat381計算されることがわかりました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)

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/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。私よりも経験豊富なプラットフォームユーザーがこの問題を理解するのに役立つことを願っています。ありがとうございます。

ベストアンサー1

おすすめ記事