为什么完成 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?
}
  
 

相关内容