原型,磁盘还是内存

这几天一直在找bug。

我的测试数据集是116个linux源码的打包文件(未压缩),116个文件差不多50GB的数据。原型系统是完美重删,应该可以发现所有的重复数据。但是我连续备份两次数据集(分别称为job1和job2),发现总会漏掉很小一部分(50GB的数据量,漏掉若干KB,大概就是几个数据块)的重复数据。到底是哪里出现了问题?

在检查了几遍原型的逻辑后,没有发现错误,对几个小数据集的测试也显示完全正确(重删率和恢复出的数据都是对的);将哈希表和SHA1全部改用成熟的Gnome Library和openssl后,问题依旧;重复试验,出问题的文件会变化,说明和数据集本身无关。

于是开始使用md5sum和diff分析恢复后的数据。
  • job1和job2都能完成恢复操作;
  • 比较恢复数据和原始数据,发现有几个.tar文件的两个md5不同;
  • 这几个出错.tar文件都能成功拆开;
  • 将.tar拆开获得源代码,使用md5sum发现每一个出错.tar文件,其实都只有其中某一个源代码文件(*.c)出错;
  • 使用diff工具比较前后.c文件,发现都是某一行的某一个字符发生变化,如下图,Power变成了Powdr,其它还有)变成了(。
  • 'e'(101)和'd'(100),'('(72)和')'(73)的ASCII码都只差1位,只有一个bit不同。
 

分析到这,我困惑了。如果是程序的bug,出现的错误应该更加离谱,比如整个块(平均8KB)出现在错误的位置,要多么凑巧才能出现这种单字符变化呢?现在,我更愿意相信这是磁盘或者内存的硬件错误:当数据量较大时,读磁盘或者内存拷贝出现位变异。

posted on 2013-09-10 16:22  OpenNaive  阅读(202)  评论(0)    收藏  举报

导航