남은 IO를 차단하는 오작동하는 USB 플래시 장치를 감지합니다.

남은 IO를 차단하는 오작동하는 USB 플래시 장치를 감지합니다.

저는 f3사용자 정의 Bash 스크립트를 사용하여 다수의 USB 플래시 드라이브를 테스트하고 있습니다.

제가 직면하는 일반적인 문제는 몇 개의 결함이 있는 드라이브로 인해 모든 정상 드라이브의 IO가 고갈되어 테스트 프로세스가 효과적으로 지연된다는 것입니다.

예를 들어, 테스트를 위해 50개의 USB 드라이브를 남겨두면 한 시간 후에 48개의 USB 드라이브가 아무 작업도 수행하지 않고 2개의 USB 드라이브의 LED가 깜박이는 경우가 종종 있습니다. 이 두 드라이브를 제거하면 갑자기 다른 모든 드라이브 테스트가 복원됩니다.

때로는 24개의 드라이브가 작동을 멈추고 나머지 드라이브는 제대로 작동하는 것처럼 보이는 좀 더 복잡한 상황이 발생합니다. 20분이 지나도 진전이 없는 몇몇 드라이브를 제외하면. 플러그를 뽑으면 나머지가 복원되고 테스트가 계속됩니다.

그러나 결함이 있는 드라이브에 대한 테스트를 중단하는 것만으로도 나머지 드라이브를 정상으로 되돌리기에 충분하다는 사실도 발견했습니다.

어떤 드라이브가 다른 드라이브에서 이 파일 작업을 차단하는지 확인하여 스크립트에서 해당 드라이브를 자동으로 중지할 수 있는 방법을 찾고 있습니다.

atop, iostat, 을 찾아보고 차별화 요소를 찾아 htop보았지만 dmesg아무것도 보이지 않습니다. 커널 디버그 인터페이스(Kernel Debug Interface )라는 것이 있다는 것을 발견했습니다 usbmon. 비록 레벨이 너무 낮아서 어떻게 사용하는지 잘 모르겠습니다. 원시 USB 패킷에는 아무 것도 알려주지 않습니다.

어떤 드라이브가 오작동하는지 확인하는 데 사용할 수 있는 다른 도구가 있습니까?

나는 드라이브를 테스트하기 위해 사용 f3write하고 프로그래밍합니다. f3read프로그램 f3write은 1GB 파일을 생성한 f3read다음 파일을 읽어 프로세스 중에 발생한 데이터 손상을 식별합니다.

또한 이것은 이상하지만 드라이브가 제대로 작동하지 않는 경우 나머지 "정상" 드라이브가 현재 파일에 대한 작업을 수행합니다. 예를 들어, 1GB 파일을 쓰거나 읽을 수 있지만 오작동하는 드라이브가 제거될 때까지 새 파일이 생성되지 않습니다. 이는 "IO 호그" 드라이브가 있으면 새 파일을 여는 것이 불가능해지는 것과 같습니다.

그들을 구별하려면 어떻게 해야 합니까?

답변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에서 보고한 드라이브 읽기/쓰기 속도가 아닙니다. 이러한 판독값은 오작동하는 드라이브에 대해 올바르지 않습니다. 일반적으로 모든 판독값은 0이지만 위의 스크립트를 사용하면 성가신 돼지를 식별하고 제거하여 나머지 작업을 계속할 수 있습니다.

마침내!

이는 문제를 나타내는 일반적인 출력입니다.

여기에 이미지 설명을 입력하세요.

비교적 건강한 상황은 다음과 같습니다.

여기에 이미지 설명을 입력하세요.

분포가 균일할수록 좋습니다. 아마도 평균을 계산하는 것도 도움이 될 것입니다. 최대값과 평균값의 차이는 문제가 있음을 나타낼 수 있습니다.

스크린샷에는 대량 테스트 도구가 실행 중인 드라이브만 나열하는 다른 버전의 스크립트에서 가져왔기 때문에 sda가 표시되지 않습니다.

관련 정보