Sqlite 硬件相关磁盘或内存损坏的可能性?

Sqlite 硬件相关磁盘或内存损坏的可能性?,sqlite,hardware,corruption,Sqlite,Hardware,Corruption,我有几百台电脑运行一个应用程序。在一台计算机上,我看到在我从SQLite中提取的一些字符串上有两个单个位被错误设置的实例。如果这是我的开发计算机,我会假设我有一个错误的地方,但肯定有一些安装在这一点上,我会开始看到罕见的硬件错误 这当然取决于我做了多少IO,但是当有机会看到这类事情时,有什么经验法则吗?例如,对于TCP数据包,确定“大约1600万到100亿个数据包中有1个”会发生无声的、未被检测到的损坏 不幸的是,在相关机器上运行内存/磁盘检查器的可能性不大。当我注意到奇怪的事情发生时,我的策略

我有几百台电脑运行一个应用程序。在一台计算机上,我看到在我从SQLite中提取的一些字符串上有两个单个位被错误设置的实例。如果这是我的开发计算机,我会假设我有一个错误的地方,但肯定有一些安装在这一点上,我会开始看到罕见的硬件错误

这当然取决于我做了多少IO,但是当有机会看到这类事情时,有什么经验法则吗?例如,对于TCP数据包,确定“大约1600万到100亿个数据包中有1个”会发生无声的、未被检测到的损坏


不幸的是,在相关机器上运行内存/磁盘检查器的可能性不大。

当我注意到奇怪的事情发生时,我的策略是:

  • 检查代码中是否存在错误
  • 检查所用库/工具(SQLite,此处)中是否存在错误
  • 检查编译器中是否存在bug
  • 然后,也只有在那时,才检查硬件故障
  • 在我10年的职业生涯中,99,99%的bug与软件相关


    希望这能有所帮助。

    如果有细微的错误,它随时都可能发生,而且可能来自多个来源,甚至是网络


    正如您可以看到在一台机器上发生的错误一样,您最好的选择是处理损坏,而不是依赖统计数据来告诉您什么时候可能会出错。虽然这些错误可能是由外部因素造成的,但如果您看到了多个错误,那么谨慎的做法是让memchecker在机器上运行,以检查其硬件是否存在故障。另一种选择是相信运气,你不会看到完全失败。

    会发生位错误。考虑用CRC或其他类型的错误检测/校正机制保护数据。它发生的几率取决于您拥有的硬件类型。例如,如果您有带ECC的内存,那么它的可能性会比不带ECC的内存小,但即使ECC内存也会坏掉,并且可能无法纠正错误。对于几百台计算机,我想说这种奇怪的硬件错误很可能每天都会发生 说 “最近的DRAM测试给出了差异很大的错误率,差异超过7个数量级,从10到10不等^−10至10^−17错误/位·h,大约每小时每GB内存一位错误到每世纪每GB内存一位错误。[7][11][12]

    即使我们使用最乐观的估计值,即每千兆位每世纪一个比特的错误,如果你有一个100台计算机的集群,每个计算机有2GB的RAM,这意味着你每年会看到两次比特错误。 (这只包括RAM位错误。您提到TCP包未检测到的损坏,并且您也可能考虑磁盘驱动器故障、意外电源线解锁、冷却风扇故障等)。
    更悲观的估计意味着您将更经常地看到位错误——正如Steve Baker所说,位错误是不可避免的。

    关闭该机器。在我目前的职位上(大约7年),我曾经见过一次由硬件内存错误导致的蓝屏。如果您在同一台机器上看到两次误码故障,很有可能您已经找到了罪魁祸首。在同一时期,我看到了数十个磁盘控制器故障/磁盘故障/注册表损坏的蓝屏。所以它们很少见,但确实发生过


    在网络方面,我们有一个案例,一家3d party供应商的WAN压缩设备错误地将我们的应用程序TCP数据包压缩在一起,然后在其上放置一个良好的CRC。至少可以说,这造成了巨大的破坏

    如果在定制的操作系统上工作,您还应该添加对驱动程序或IO控制器的检查。好建议!幸运的是,通过简单地切换测试硬件并查看故障是否移动,可以更容易地快速排除硬件故障。如果硬件差异很大,而您仍然在失败,很可能不是硬件。以我的经验,硬件、磁盘和RAM都有很大的故障。它不是99.99%。如果你在多台机器上看到你认为是位错误的东西,不要麻烦切换机器;)