cmp 명령을 완료하는 데 걸리는 시간이 왜 이렇게 다양합니까?

cmp 명령을 완료하는 데 걸리는 시간이 왜 이렇게 다양합니까?

cmp명령을 사용하여 SD 카드에 저장된 1GB 파일과 메인 메모리에 저장된 참조 1GB 파일을 비교합니다. 개별 cmp명령의 완료 시간은 17초에서 3.5분까지 매우 다양했습니다.

파일은 동일할 것으로 예상되며 지금까지 모든 경우에 동일했습니다. SD 카드에 있는 100개의 1GB 파일을 메인 메모리에 저장된 참조 1GB 파일과 비교하는 기능(아래 참조)을 실행합니다. 일반적으로 cmp루프의 모든 100은 스크립트 기간 동안 빠르거나(20초 미만) 느린 경향이 있습니다.

출력에 따르면 top시간이 오래 걸릴수록 지속 시간이 늘어나는 프로세스는 관찰되지 않습니다.

명령 완료 시간이 cmp변경되는 원인은 무엇입니까?

또한 명령이 합리적인 시간(25초 미만) 내에 완료되도록 하려면 어떻게 해야 합니까?

이는 임베디드 애플리케이션의 Yocto 배포에서 발생합니다.

function check_files() {
    for filename in /mnt/Android/data/File_*;
    do
        echo "Checking $filename"
        result=$(cmp -l /data/1GB_File.bin $filename)
        resultlength=${#result}
        if [ $resultlength -gt 0 ]; then
            date >> /data/errors.txt
            echo $filename >> /data/errors.txt
            echo $result >> /data/errors.txt
            echo "==========" >> /data/errors.txt
        fi
    done
}

답변1

접근 방식을 다시 설계하는 것이 좋습니다. 귀하의 방법은 /data/1GB_File.bin계속해서 읽혀질 것입니다 /mnt/Android/data/File_*.

"디스크 캐싱"은 일반적으로 디스크 I/O 속도를 높이는 데 도움이 되지만, 파일 크기가 1GB이고 루프의 2~N번째 횟수에서 캐시된 데이터( /data/1GB_File.bin)와 새 데이터( 캐시됨) 데이터 요청이 인터리브됩니다. 그러나 데이터(디스크 블록 크기의 메모리 청크)는 "가장 최근에 사용된"("오래된 것부터") 알고리즘을 통해 캐시에서 제거되므로 이는 캐시된 데이터를 강제하는 새로운 데이터와 이전에 캐시된 데이터 읽기(변경 사항 변경) 사이의 경쟁입니다. LRU 목록의 위치). 또한 일반적인 시스템 활동에서는 디스크 캐시를 사용합니다.

디스크 캐시가 "일반 시스템 사용량"에 2 x 1GB를 더한 것보다 크지 않으면 항상 경합과 그에 따른 타이밍 변화에 직면하게 됩니다.

각 파일의 체크섬과 표준을 계산합니다. 각 파일은 한 번만 읽어야 합니다. 체크섬과 비교해보세요.

읽기 man md5sum, 다음과 같은 일을 하세요테스트되지 않은:

check_files() {
    md5sum /mnt/Android/data/File_* >data.tmp
    md5dum /data/1GB_File.bin >standard.tmp
    #
    # extract the "correct" checksum 
    golden="$(cut -d" "   f1 standard.tmp)"
    #
    # do any of the suspect files not 
    # have the golden checksum?
    grep -v "$golden" data.tmp >bad.tmp
    if [[ $? -eq 0 ]]; then
        (date;cat bad.tmp;echo "==========" )>> /data/errors.txt
    fi
    #uncomment the `rm` line when you're sure it works
    # can test with adding any other filename
    # to the first `md5sum` line.
    #rm -f standard.tmp data.tmp bad.tmp 2>/dev/null
    # why not return a status from this function?
}
  
 

관련 정보