残りのIOをブロックする誤動作するUSB​​フラッシュデバイスを検出します。

残りのIOをブロックする誤動作するUSB​​フラッシュデバイスを検出します。

私はf3カスタムBashスクリプトを使用して複数のUSBフラッシュドライブをテストしています。

私が直面している一般的な問題は、いくつかの故障したドライブがすべての通常のドライブのIOを使い果たし、テストプロセスが効果的に遅れることです。

たとえば、テスト用に50個のUSBドライブを残すと、1時間後に48個のUSBドライブが何もせず、2つのUSBドライブのLEDが点滅することがよくあります。これら2つのドライブを取り外すと、突然他のすべてのドライブテストが復元されます。

時には、24台のドライブが動作を停止し、残りのドライブが正しく動作しているように見える、より複雑な状況が発生します。 20分経っても進歩がないいくつかのドライブを除けば。プラグを抜くと、残りが復元され、テストが続行されます。

しかし、故障したドライブのテストを中止するだけで、残りのドライブを正常に戻すのに十分であることも発見しました。

どのドライブが他のドライブでこのファイル操作をブロックしているかを確認して、スクリプトがそのドライブを自動的に停止する方法を探しています。

atopiostat、 を探して差別化要素を探して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は表示されません。

おすすめ記事