今天的分析更加详细。首先发现每次实验,出错的文件都不一样,所以应该不是临界条件的问题。下表总结了出错的位置,原始数据是数据的正确格式,第一次备份和第二次备份分别代表两次连续备份,我恢复出两次备份的数据与原始数据进行比较,发现错误都是某个字符发生了变化:
文件名 | 原始数据 | 第一次备份 | 第二次备份 |
linux-2.6.34.1.tar | ; | ; | ? |
linux-2.6.34.5.tar | a | a | e |
linux-2.6.35.1.tar | (space) | (space) | $ |
linux-2.6.35.2.tar | u | u | w |
linux-2.6.35.3.tar | c i | c i | g k |
linux-2.6.35.5.tar | s | s | S |
linux-2.6.36.0.tar | i | i | m |
linux-2.6.36.1.tar | x r | x r | | v |
linux-2.6.36.2.tar | l | | | l |
linux-2.6.37.2.tar | (space) | (space) | $ |
linux-2.6.37.3.tar | e | e | g |
linux-2.6.38.0.tar | s | s | w |
linux-2.6.38.5.tar | , | $ | , |
linux-2.6.38.7.tar | 1 | 1 | 5 |
linux-2.6.39.1.tar | a | a | e |
linux-2.6.39.2.tar | 1 | 1 | 5 |
linux-3.0.11.tar | (space) | (space) | $ |
linux-3.0.13.tar | C | C | G |
linux-3.0.20.tar | 0 | 0 | 4 |
linux-3.0.22.tar | (space) | (space) | $ |
linux-3.0.26.tar | > | > | 6 |
linux-3.0.28.tar | a | a | e |
linux-3.0.4.tar | (space) | (space) | $ |
linux-3.0.5.tar | s a | s a | w c |
linux-3.0.9.tar | ; | ; | ? |
linux-3.1.2.tar | E | E | D |
linux-3.1.5.tar | l | l | | |
linux-3.2.10.tar | _ | _ | W |
linux-3.2.13.tar | a | a | e |
linux-3.2.16.tar | d | d | l |
linux-3.2.2.tar | C | C | G |
linux-3.2.4.tar | (space) | (space) | $ |
linux-3.2.6.tar | p | p | r |
linux-3.3.5.tar | c | c | g |
表中红色的文件,指的是第一次备份发生错误,而第二次备份没有错误。共37个错误中,有32个是因为第二次备份错误。进一步分析这些字符的ASCII码,如下表:
字符变化 | ASCII码变化 | 二进制变化 | 次数 |
;->? | 3B,3F | 0010,1011 0010,1111 | 2 |
a->e | 61,65 | 0110,0001 0110,0101 | 4 |
(space)->$ | 20, 24 | 0010,0000 0010,0100 | 6 |
u->w | 75, 77 | 0111,0101 0111,0111 | 1 |
c->g | 63, 67 | 0110,0011 0110,0111 | 2 |
i->k | 69, 6B | 0110,1001 0110,1011 | 1 |
s->S | 73, 53 | 0111,0011 0101,0011 | 1 |
i->m | 69, 6D | 0110,1001 0110,1101 | 1 |
x->| | 78, 7C | 0111,1000 0111,1100 | 1 |
r->v | 72, 76 | 0111,0010 0111,0110 | 1 |
l->| | 6C, 7C | 0110,1100 0111,1100 | 2 |
e->g | 65, 67 | 0110,0101 0110,0111 | 1 |
s->w | 73, 77 | 0111,0011 0111,0111 | 2 |
,->$ | 2C, 24 | 0010,1100 0010,0100 | 1 |
1->5 | 31, 35 | 0011,0001 0011,0101 | 2 |
C->G | 43, 47 | 0100,0011 0100,0111 | 2 |
o->4 | 30, 34 | 0011,0000 0011,0100 | 1 |
>->6 | 3E, 36 | 0011,1110 0011,0110 | 1 |
a->c | 61, 63 | 0110,0001 0110,0011 | 1 |
E->D | 45, 44 | 0100,0101 0100,0100 | 1 |
_->W | 5F, 57 | 0101,1111 0101,0111 | 1 |
d->l | 64, 6C | 0110,0100 0110,1100 | 1 |
p->r | 70, 72 | 0111,0000 0111,0010 | 1 |
所有字符的变化都是因为一个bit发生了反转,由此几乎可以肯定不是原型系统的bug。综合几点因素考虑:
- 所有的错误都是bit反转;
- 第二备份的反转的概率比第一次要高得多
- 备份较小数据量不会发生反转;
得到以下结论:磁盘上的数据是正确的,读取少量数据也是正确的,但是读取大量数据则可能出现bit反转,而连续读取相同区域的数据,bit反转变得更加严重。
在另一台服务器的测试也结束了,没有出错,基本可以肯定这台服务器的磁盘有一点小故障了。
磁盘也不是那么可靠。