私はf3
カスタムBashスクリプトを使用して複数のUSBフラッシュドライブをテストしています。
私が直面している一般的な問題は、いくつかの故障したドライブがすべての通常のドライブのIOを使い果たし、テストプロセスが効果的に遅れることです。
たとえば、テスト用に50個のUSBドライブを残すと、1時間後に48個のUSBドライブが何もせず、2つのUSBドライブのLEDが点滅することがよくあります。これら2つのドライブを取り外すと、突然他のすべてのドライブテストが復元されます。
時には、24台のドライブが動作を停止し、残りのドライブが正しく動作しているように見える、より複雑な状況が発生します。 20分経っても進歩がないいくつかのドライブを除けば。プラグを抜くと、残りが復元され、テストが続行されます。
しかし、故障したドライブのテストを中止するだけで、残りのドライブを正常に戻すのに十分であることも発見しました。
どのドライブが他のドライブでこのファイル操作をブロックしているかを確認して、スクリプトがそのドライブを自動的に停止する方法を探しています。
atop
、iostat
、 を探して差別化要素を探してhtop
みましたがdmesg
、何も見えません。カーネルデバッグインタフェース(Kernel Debug Interface)というものがあることがわかりましたusbmon
。レベルが低すぎるので、どのように使用するのかわかりません。生のUSBパケットには何も伝えません。
どのドライブが故障しているかを確認するために使用できる他のツールはありますか?
私はドライブをテストするために使用してf3write
プログラムします。f3read
プログラムf3write
は1 GBのファイルを生成し、ファイルをf3read
読み取り、プロセス中に発生したデータの破損を識別します。
また、これは奇妙ですが、ドライブが正常に動作しない場合、残りの「正常」ドライブは現在のファイルに対して操作を実行します。たとえば、1GBのファイルを書き込んだり読み取ったりできますが、誤動作しているドライブが削除されるまで新しいファイルは作成されません。これは、「IOホグ」ドライブがあると新しいファイルを開くことが不可能になるのと同じです。
それらを区別するにはどうすればよいですか?
答え1
ついにこれを行う方法を見つけました。
以下は、ドライブと1秒あたりの合計読み取り/書き込みIO速度を一覧表示するBashスクリプトです。あるドライブが別のドライブのIO需要を欠いている場合は、ここで最も高い数のドライブとして識別できます。
#!/bin/bash
# hogs.sh - by Tobiasz 'unfa' Karoń - identify IO hogs in the system
rm hogs.a hogs.b 2>/dev/null
while [ 1=1 ]; do
mv hogs.a hogs.b 2>/dev/null # store old data and make room for new data
for i in /sys/block/sd*; do # cycle through all block devices
# sum two last fields of the stat data and put that into a file along with the drive handle
echo $(echo -n "$i" | cut -d'/' -f4; cat "$i/stat" | xargs| cut -d' ' -f 10-11 | tr ' ' '+' | bc) >> hogs.a
done
# sort files
sort hogs.a > hogs.a2
sort hogs.b > hogs.b2
join hogs.a2 hogs.b2 > hogs.c # combine previous and current data into one file so we can calculate a difference
rm hogs.d 2>/dev/null
while read line; do
echo "$(echo "$line" | cut -d' ' -f1) $(echo "$line" | cut -d' ' -f 2- | tr ' ' '-' | bc)" >> hogs.d
done < hogs.c
sort hogs.d > hogs # sort for the final output
echo "max $(cat hogs | cut -d' ' -f2 | sort -n | tail -n1)" >> hogs # add the highest value
echo "min $(cat hogs | cut -d' ' -f2 | sort -n | head -n1)" >> hogs # add the lowest value
clear
cat hogs # print the final output
sleep 1
done
このスクリプトは、/sys/block/sd*/stat ファイルを使用して、システム内の各ブロックデバイスの IO/秒を表示します。これがどんな単位なのかはよくわかりませんが、それがうまく機能すればそれが私が興味のあるすべてだ。
本当に悪夢ですね。 4つのUSBハブを使用したf3を含む40台のドライブのイメージングテスト。それからすべてが止まり、あなたは理由を知りません。ドライブにLEDがある場合、通常、低IOを引き起こすドライブは点滅し、他のドライブは点滅しません。しかし、多くのフラッシュモジュールにはLEDがありません。それで、私がこれを見つけるまで、問題の原因が何であるかを知る方法はありませんでした。
これは、atopによって報告されたドライブの読み取り/書き込み速度ではありません。これらの読み取り値は、誤動作しているドライブでは正しくありません。通常、すべての読み取り値はゼロですが、上記のスクリプトを使用すると、迷惑な豚を識別して削除して残りの作業を続行できます。
ついに!
これは問題を表す一般的な出力です。
比較的健康な状況は次のとおりです。
分布が均一になるほど良いです。おそらく平均を計算するのも役に立ちます。最大値と平均値の違いは問題があることを示します。
スクリーンショットには、バルクテストツールが実行されているドライブのみがリストされている他のバージョンのスクリプトからインポートされたため、sdaは表示されません。