我使用该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?
}