我已经使用C ++ 11(VS2013)编写了基于UDP的传输协议。它的速度非常快-而且在99.9%的时间内都可以正常工作。
但是我观察到几次将错误的字节写入磁盘(Samsung 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 / disk)造成的吗?
我是否真的需要在写入后从磁盘读取数据,并进行memcmp等操作以确保100%确保将正确的字节写入磁盘?(哦,男孩-表现会如何……)
在我的本地PC上-事实证明这是RAM问题。通过运行memtest86发现。
尽管如此,我还是修改了在生产服务器上运行的软件的代码-使它从磁盘读取,以验证是否正确写入了字节。这些服务器每天在磁盘上写入大约10TB的数据-运行新代码一周后-该错误发生了一次。该软件通过编写并再次验证来纠正此问题-但仍然有趣的是它确实发生了。
560000000000000位中的1位被错误地写入磁盘。惊人的。
稍后,我可能会在此服务器上运行memtest86来查看这是否也是RAM问题-但由于已或多或少确保了文件完整性,并且服务器未显示任何硬件问题的迹象,因此我不再真正担心此事了。 。
因此-如果文件完整性对您来说非常重要(就像对我们一样)-那么不要100%信任您的硬件并验证读取/写入操作。异常可能是硬件问题的早期迹象。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句