本帖最后由 chungexcy 于 2016-1-17 04:11 编辑
17日更新:
首先非常非常感谢回复我,帮我分析和建议,以及测试的坛友。
经过一天的努力,包括我和几位坛友都在尝试复现,但均没能成功。我后面尝试在定制版ssd和机械盘上分别重做了整个操作,包括提到的两次复制问题,均未出错。
ggxuelei的分析有一定的道理,有可能我之前碰上了坏块导致数据丢失。这样来看,很有可能就只是我这个ssd的个例。
SE用什么软件做的?标准的SE只重建FTL,做增强SE才会在重建FTL之外再把所有NAND闪存擦除一遍。现在我怀疑有一种极端的可能,就是刷400G固件之后,可能会把出厂开卡时已经屏蔽的原始坏块还原出来。这次做的只是一个固件升级,而且在最后升级完的时候还有个Error提示(太快看不清楚具体错误信息),刷完之后还要SE才能初始化(容量变了,FTL估计也有大幅变动),所以仅仅是猜测,可能有坏块在刷400G固件后没有被处理掉。
如果有坏块,SSD内部做磨损均衡的时候有可能会搬运盘上已有数据,这样就有可能导致盘上没有被操作系统访问的数据发生错误。但这些理论上的猜测估计是不好复现出来的,只要坏块被替换掉了,后边不出问题了,也就找不出原因了
然而,问题被发现了是曾经发生的事实,未能主动复现也是事实。我虽然不能解释原因,但我也不会否定这个现象。我现在先把盘当成正常完好的来使用,有问题我基本会发现的。如果之后复现了,再开新帖吧。
16日更新:
出问题的工程包下载,一共10GB,需要的可以下载。链接:http://pan.baidu.com/s/1gepjI87 密码:p7l9
memtest没有问题,已过400%,我在检查是否有其他原因。
===================================
继昨天信誓旦旦的测试过我的400GB性能“稳定”以后,我开始把这个400盘作为数据处理盘来用。
今天就发现了两个非常严重的数据安全问题。
静态数据出错!!!写入数据丢失!!!
之前 @水银灯 的512GB,在esata和其他平台下,发现文件和文件夹丢失,大家都不以为意,这也包括我。好了,现在相似的问题发生在我身上了。。。
(P.S.之后,整个打包的文件夹,我上传完成以后会公开下载,大约今晚或者明早。)
一、静态数据出错
1. 先描述问题。
简单来说,一个正确的文件在某一时间点,被验证过是正确的;然后过一段时间再去访问,发现文件部分丢失。而文件系统记录的修改时间,依然最后一次修改时间(我这里是创建时间),这个时间点是在被验证的时间以前。即在被验证到再次被访问的这段期间,文件底层损坏,而上层文件系统对此一无所知。
2. 然后我说明一下这段时间的具体行为
首先我在用waifu2x-caffe这个图片处理软件,对一系列图片进行批量处理,源文件夹的每一个文件作为输入,计算后,把结果的图片存入目标文件夹中。看过我的第一帖的坛友,可能还对这个软件有印象。
根据这张图,我的整个处理流程顺序是 1x-> 2x -> 2xn1 (?) -> 2xn1ps -> 2xn1ps2x -> 2xn1ps2xn1
例如,1x中的每个图片处理后,放在2x中;2x中的每个图片处理后,放在2xn1中。。。以此类推。
每个文件夹下,都类似这样存放生成的同名图片。
其中截图看不到2xn1,[有可能是我不小心在整理文件夹名的时候删了(当时我还是比较小心,这一点可能性不大),也有可能忘记了这一步(事实上按照时间轴来看,会空出做这部的时间),甚至文件夹直接丢失?(也说不好)]。由于我找不到这一步,我打算用一小部分重做看看,这才发现了这个大问题,之前好的文件居然损坏了。
(注:后面我在其他硬盘中重做了一遍流程,对比了最终输出md5是一样的。也就是说这一步确实做了,想了想应该我不小心PS批处理时忘记复制一个新的2xn1ps文件夹,而是直接用了这个文件夹。所以这里应该是没有问题的。之前自动生成的文件夹命名有点乱就没注意。不过多亏我的不小心才给了机会暴露了这个问题)
3. 错误示例
证明一下1x中的这些图片本来是好的:8, 14, 15, 16, 18。
这是08号图片,左边作为输入,计算后输出到右边文件夹中,保存同名文件。
很明显,输入文件现在发现部分数据丢失。而输出文件确实正确的。也就是说当时处理那会儿,左边的源是没有问题的。而在后面的某个时间点,文件部分出错丢失。根据系统记录的修改日期,这个出错是文件系统不知道的。我后面会讲到可能引发问题的情境。
其他的14、15、16、18也出现了同样的问题。下面简单截图证明一下,然后我们跳过,说下一个问题。
二、写入数据丢失
1. 那么我是如何发现刚才的问题的呢?
由于我找不到中间的某个2xn1步骤,我决定拿一小部分数据直接从头跑一遍,对比一下。
我把1x中的03-53,复制到new\1x中,然后用waifu2x,运算输出到new\2x。在点击开始运算之前,我把new\1x文件夹拖入waifu2x的输入框,这里有一步读一遍所有图片的过程,不会写入新数据。这里提到这点,是因为我认为可能是这个复制过程,造成了这次错误。
当时是这样的:
然后我点击start,不一会儿发现下面的输出框提示源图片读取错误,而且不止一个。我立刻点击了cancel,这个软件会在处理完当前图片并保存后,停止继续处理下一张。
从后面生成的文件来看,这时处理了编号03-21的图片。
然后我当时以为是这软件真的出错了。又点击运行,发现依然有错误就立刻停止了,这时编号03-12的图片被新的输出覆盖(删除原来的图片,写入新的图片)。
所以这张截图中,03-12的时间偏晚,是第二次的结果,而13-21是第一次生成的。而之前复制过来,结果出错的8, 14, 15, 16, 18,就是之前报读取错误的几张图片,waifu2x直接跳过,new\2x中也就没有输出。
2. 发现的新问题
本来我以为问题只有静态数据静默出错,结果后面一检查,发现这里的输出也是有问题的。其中出错的,仅在第二次覆盖写入这部分中找到。发生错误的编号为06、09、11、12。全部在第二次覆盖写入时发生。而之前的直接创建文件是正常的(13-21)。
写入出错分析以06为例:
左边是我复制过去的new\1x\03-53,中间是重来那次new\2x中的错误写入;最右边是后面我又再次跑了一遍,存放在新的文件夹内new\2x_test。
可以看出,文件大小完全一样,也就是系统检测到写入发生了,而且写入了正确的数据。但底层数据出错。
其他 09、11、12 也是如此。而且几乎完全丢失。
3. 我的分析和猜想
首先我的计算速度是3.8s一张,也即是说每不到4s,就会覆盖一张以前的图片,图片大小 6-9MB 左右。
对于第一个“静默文件出错”,大家也许已经注意到,原来的1x中的错误图片刚好在03-21中;而在原来1x文件夹中,之外的的其他图片均未找到错误,即使是22-53这些已被复制过来的图片,也没有发生错误。
因此,我认为有两种可能:
一是本来这5个文件就是有问题的,被复制过来了。但为什么刚好出现在我第一次运算的03-21范围中?
二是可能出现了什么原因,在waifu2x读取复制的图片时,同时影响了被复制的对象,导致原来的1x中的文件出现了一模一样的错误。这样假设就能符合为什么问题仅出现在了03-21中。
假设2的导致的结果,能很好的符合观测结果的出现概率。
而对于第二个“写入错误”,我估计是文件删除造成的底层数据发生了冲突,而正在写入的数据,系统认为已经写入,但实际上并没有真正写到闪存中。
4. 问题重现
然而底层数据冲突,也不一定是这个原因,因为这个问题后面被我重现了,但方式有变。我强调一句,重现是后面无意中发现的,我主动尝试之后都没检查出问题。
之前截图中,被化划掉的new2文件夹,是后面我的一个测试。同样把原来1x中的的101-150复制过去,然后运行waifu2x。根据时间来看,我只运行了一次。
结果,再次发生写入问题,104、105写入出错。右边是对比几小时前,我的正常流程的正确中间结果。
以上基本就是我发现的有规律性的两个问题。
补充:
在第一次发现new文件夹的错误以后,我以为是内存缓存原因,重启过电脑。
关机时间在发现问题后的5分钟。
然后new2的问题发生在重启后的尝试。memtest也是这次开机之内完成的。后面再次关机开箱检查了接线那些,觉得没什么问题。
三、 问题总结
我不认为这是软件问题。waifu2x-caffe是一个圈子内广受欢迎开源软件,已经有14个发行,而且现在依然在更新。而且,我已经在这个环境下,已经处理了超过200GB的数据,没有一张图片是出错的。存储设备有其他ssd,也有移动hdd。再说这个软件的用户也还大有人在。所以我基本可以肯定,这就是ssd自身设计的问题。
现在公布的都是掉电下,原有的数据是安全的。但我现在不掉电,数据能在特定情况下损坏。不知道之前的固件测试是不是光注意掉电问题,而忽略了数据本身的准确性检测,也是否有涉及到我这里提及到的问题。
还有一点我敢确定:就是我的任何一个中间环节,从图片被生成写入,到30分钟左右后再次被下一轮调用,这期间是没有出过任何错误的。因为我的整个流程是环环相扣的,否则我的489张的最终结果,肯定不会全部都正确。
四、最后的一个奇葩问题。
在我从未单独操作的2xn1ps文件夹中,07号图片后面不知为何损坏了,而且不是之前的没有数据变黑的问题,出错非常诡异。
而它的下家确是好的,说明当时这张图是完好的,这张的系统缩略图有的。包括之前1x中出错的5张图片,系统缩略图也是有的。
我猜想有可能是刚才的其他错误,导致nand写入溢出到这个文件的某一部分,导致整个文件的解码歪了。
|