3

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

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

不幸的是,不太可能在有问题的机器上运行内存/磁盘检查器。

4

5 回答 5

4

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

  1. 检查代码中是否存在错误
  2. 检查使用的库/工具中是否存在错误(SQLite,此处)
  3. 检查编译器中是否存在错误
  4. 然后,仅在那时,检查硬件故障

在我长达 10 年的职业生涯中,99.99% 的错误与软件相关。

希望这可以帮助。

于 2008-10-05T16:44:24.430 回答
2

会发生位错误。考虑使用 CRC 或其他类型的错误检测/纠正机制来保护您的数据。它发生的几率取决于你拥有什么样的硬件。如果您有带有 ECC 的内存,那么它比没有的可能性要小,但即使是 ECC 内存也会变坏并且可能无法纠正错误。对于数百台计算机,我会说奇怪的硬件错误很可能,很可能每天都会发生。

于 2008-10-05T16:48:25.250 回答
1

“维基百科:ECC 内存” 说“最近的 DRAM 测试给出了差异很大的错误率,差异超过 7 个数量级,范围从 10^-10 到 10^-17 错误/bit·h,大约一个位错误,每小时,每GB 内存到一个位错误,每世纪,每 GB 内存。[7][11][12]"

即使我们使用每千兆字节每世纪一个位错误的最乐观估计,如果您有一个由 100 台计算机组成的集群,每台计算机具有 2 GB 的 RAM,这意味着您每年会看到两次位错误。(这仅包括 RAM 位错误。您提到了 TCP 数据包未检测到损坏,您还可能考虑磁盘驱动器故障、电源线意外拔出、冷却风扇故障等)。更悲观的估计意味着您会更频繁地看到误码——正如史蒂夫贝克所说,误码是不可避免的。

于 2010-07-27T00:00:34.673 回答
0

有细微的错误,它可能随时发生,并且来自多个来源,即使是最不可能的。

正如您可以看到在单台机器上发生的错误,您最好的选择是处理损坏,而不是依靠统计数据来告诉您何时可能出现问题。虽然错误可能是由于外部因素造成的,但如果您看到不止一个错误,最好让该 memchecker 在机器上运行以检查其硬件没有故障。另一种选择是相信运气,你不会看到完全失败。

于 2008-10-05T16:47:54.063 回答
0

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

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

于 2011-06-10T11:35:11.333 回答