我使用C ++ 11(VS2013)编写了基于UDP的传输协议。它的速度非常快 - 99.9%的时间都很棒。
但是我已经观察过几次将错误的字节写入磁盘(三星250 GB SSD 850 EVO) - 或者至少看起来如此。
这基本上是我转移6GB测试文件时会发生的事情:
在传输完整个文件之后,我在服务器和客户端上对6GB文件执行完整的SHA256哈希,但令我恐惧的是,我在最近几天观察到两次散列不相同(进行大约20次测试转移时)。
在比较Beyond Compare中的文件后,我经常发现服务器端有一位或两位(在6 GB文件中)。
服务器代码 - 在验证DataPackage哈希后调用
void WriteToFile(long long position, unsigned char * data, int lengthOfData){
boost::lock_guard<std::mutex> guard(filePointerMutex);
//Open if required
if (filePointer == nullptr){
_wfopen_s(&filePointer, (U("\\\\?\\") + AbsoluteFilePathAndName).c_str(), L"wb");
}
//Seek
fsetpos(filePointer, &position);
//Write - not checking the result of the fwrite operation - should I?
fwrite(data, sizeof(unsigned char), lengthOfData, filePointer);
//Flush
fflush(filePointer);
//A separate worker thread is closing all stale filehandles
//(and setting filePointer to NULLPTR). This isn't invoked until 10 secs
//after the file has been transferred anyways - so shouldn't matter
}
总结一下:
这怎么可能发生?我的硬件(坏ram /磁盘)是否应该归咎于此?
我是否真的需要在写完后从磁盘读取,并且例如memcmp是为了100%确保将正确的字节写入磁盘? (哦,小男孩 - 这将是什么样的表演......)
答案 0 :(得分:4)
在我的本地电脑上 - 原来这是一个RAM问题。通过运行memtest86找到。
尽管如此 - 我修改了在我们的生产服务器上运行的软件的代码 - 使其从磁盘读取以验证事实上是否写入了正确的字节。这些服务器每天向磁盘写入大约10TB - 在运行新代码一周后 - 错误发生一次。该软件通过再次编写和验证来纠正这一点 - 但看到它确实发生了仍然很有趣。
560000000000000位中的1位被写入磁盘错误。惊人的。
我可能稍后会在这台服务器上运行memtest86以查看这是否也是一个RAM问题 - 但我不再非常关注这一点,因为文件完整性或多或少得到了保证,并且服务器没有显示任何迹象否则会出现硬件问题。
所以 - 如果文件完整性对您来说非常重要(就像我们这样) - 那么就不要100%信任您的硬件并验证读/写操作。异常可能是硬件问题的早期迹象。