有时将错误的字节写入磁盘。硬件有问题吗?

NjålArne Gjermundshaug

我已经使用C ++ 11(VS2013)编写了基于UDP的传输协议。它的速度非常快-而且在99.9%的时间内都可以正常工作。

在此处输入图片说明

但是我观察到几次将错误的字节写入磁盘(Samsung 250 GB SSD 850 EVO)-或至少看起来如此。

基本上,这是我传输6GB测试文件时发生的情况:

  1. 该文件被分成较小的UDP数据包-大小为64K。(网络层会破坏UDP数据报并将其重组为更大的包)。
  2. 客户端将数据包(udp)发送到服务器-有效负载使用AES256(OpenSSL)加密,并且包含数据+元数据。有效负载还包含整个有效负载的SHA256哈希-作为对UDP校验和的补充的额外完整性检查。
  3. 服务器接收数据包,将“ ACK”包发送回客户端,然后计算SHA256哈希。哈希值与客户的哈希值相同-一切都很好
  4. 然后,服务器将程序包的数据写入磁盘(由于巨大的性能差异,请使用fwrite而不是流)。服务器一次只处理一个程序包-每个文件指针都有一个互斥保护,可以防止另一个工作线程关闭该文件互锁,该工作线程关闭了10秒钟不活动的文件指针。
  5. 客户端收到UDP“ ACK”包,然后重新发送尚未确认的包(这意味着他们没有成功)。ACK包的传入速率控制客户端的发送速度(即拥塞控制/节流)。在服务器上接收到的程序包的顺序无关紧要,因为每个程序包都包含一个Position值(应在文件中写入数据的位置)。

传输完整个文件后,我在服务器和客户端上都对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
}

总结一下:

  • 字符*在服务器上的内存中正确-否则服务器SHA256哈希将失败-对吗?(与sha256发生哈希冲突的可能性极小)。
  • 写入磁盘时似乎发生了损坏。由于在发送6GB文件时大约有95.000个64k软件包写入磁盘-并且仅发生一次或两次(完全发生),因此这是一种罕见的现象

怎么会这样 是我的硬件(坏ram / disk)造成的吗?

我是否真的需要在写入后从磁盘读取数据,并进行memcmp等操作以确保100%确保将正确的字节写入磁盘?(哦,男孩-表现会如何……)

NjålArne Gjermundshaug

在我的本地PC上-事实证明这是RAM问题。通过运行memtest86发现。

尽管如此,我还是修改了在生产服务器上运行的软件的代码-使它从磁盘读取,以验证是否正确写入了字节。这些服务器每天在磁盘上写入大约10TB的数据-运行新代码一周后-该错误发生了一次。该软件通过编写并再次验证来纠正此问题-但仍然有趣的是它确实发生了。

560000000000000位中的1位被错误地写入磁盘。惊人的。

稍后,我可能会在此服务器上运行memtest86来查看这是否也是RAM问题-但由于已或多或少确保了文件完整性,并且服务器未显示任何硬件问题的迹象,因此我不再真正担心此事了。 。

因此-如果文件完整性对您来说非常重要(就像对我们一样)-那么不要100%信任您的硬件并验证读取/写入操作。异常可能是硬件问题的早期迹象。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

为什么我完成的种子(有时)没有写入磁盘?

来自分类Dev

将图像文件从阵列写入磁盘的问题:没有这样的文件或目录-使用'w'时

来自分类Dev

将图像文件从阵列写入磁盘的问题:没有这样的文件或目录-使用'w'时

来自分类Dev

NLog有时不写入文件

来自分类Dev

当写入二进制文件时,`std :: ofstream :: write`有时会写入比应有的字节更多的字节。

来自分类Dev

C:UART,ISR,循环FIFO缓冲区:有时以错误的顺序发送字节

来自分类Dev

为什么二进制文件上的grep -P有时匹配错误的字节?

来自分类Dev

每秒(或更少偶尔)将新文件写入磁盘会给硬件带来风险吗?

来自分类Dev

仅有时抛出NullReferenceException吗?

来自分类Dev

〜是$ HOME,但是有时吗?

来自分类Dev

grub错误:引导具有硬件RAID5和gpt的12.04服务器时磁盘空间不足

来自分类Dev

我可以将单字节写入没有临时变量的文件吗?

来自分类Dev

HTML-错误的字母(有时)

来自分类Dev

AJAX <select>值错误(有时)

来自分类Dev

空指针异常错误...有时

来自分类Dev

游戏有时出现错误#1009

来自分类Dev

Mongo的Cursor.nextObject有时错误地返回Null吗?

来自分类Dev

有时Visual Studio IDE0032建议可能是错误的做法吗?

来自分类Dev

GCD风格的Singleton引发编译错误...有时吗?

来自分类Dev

Mongo的Cursor.nextObject有时错误地返回Null吗?

来自分类Dev

是否可以将所有256个字节的值写入文本文件而没有任何问题?

来自分类Dev

带有Hibernate的Oracle JDBC的问题...有时

来自分类Dev

在Ubuntu和Windows中,触摸板有时会滞后。硬件问题?

来自分类Dev

将错误的字节写入文件

来自分类Dev

为什么简单的即插即用硬件有时包括驱动程序?

来自分类Dev

node.js请求| 有时是意外的令牌错误,有时不是

来自分类Dev

有硬件诊断工具吗?

来自分类Dev

在Microsoft Excel 2010中使用“ HLOOKUP”时遇到问题。有时公式会生成错误

来自分类Dev

使用Windows EFS加密备份磁盘:(有时)目标上没有加密

Related 相关文章

  1. 1

    为什么我完成的种子(有时)没有写入磁盘?

  2. 2

    将图像文件从阵列写入磁盘的问题:没有这样的文件或目录-使用'w'时

  3. 3

    将图像文件从阵列写入磁盘的问题:没有这样的文件或目录-使用'w'时

  4. 4

    NLog有时不写入文件

  5. 5

    当写入二进制文件时,`std :: ofstream :: write`有时会写入比应有的字节更多的字节。

  6. 6

    C:UART,ISR,循环FIFO缓冲区:有时以错误的顺序发送字节

  7. 7

    为什么二进制文件上的grep -P有时匹配错误的字节?

  8. 8

    每秒(或更少偶尔)将新文件写入磁盘会给硬件带来风险吗?

  9. 9

    仅有时抛出NullReferenceException吗?

  10. 10

    〜是$ HOME,但是有时吗?

  11. 11

    grub错误:引导具有硬件RAID5和gpt的12.04服务器时磁盘空间不足

  12. 12

    我可以将单字节写入没有临时变量的文件吗?

  13. 13

    HTML-错误的字母(有时)

  14. 14

    AJAX <select>值错误(有时)

  15. 15

    空指针异常错误...有时

  16. 16

    游戏有时出现错误#1009

  17. 17

    Mongo的Cursor.nextObject有时错误地返回Null吗?

  18. 18

    有时Visual Studio IDE0032建议可能是错误的做法吗?

  19. 19

    GCD风格的Singleton引发编译错误...有时吗?

  20. 20

    Mongo的Cursor.nextObject有时错误地返回Null吗?

  21. 21

    是否可以将所有256个字节的值写入文本文件而没有任何问题?

  22. 22

    带有Hibernate的Oracle JDBC的问题...有时

  23. 23

    在Ubuntu和Windows中,触摸板有时会滞后。硬件问题?

  24. 24

    将错误的字节写入文件

  25. 25

    为什么简单的即插即用硬件有时包括驱动程序?

  26. 26

    node.js请求| 有时是意外的令牌错误,有时不是

  27. 27

    有硬件诊断工具吗?

  28. 28

    在Microsoft Excel 2010中使用“ HLOOKUP”时遇到问题。有时公式会生成错误

  29. 29

    使用Windows EFS加密备份磁盘:(有时)目标上没有加密

热门标签

归档