噓!

噓!

据消息人士透露,内存错误是非常可能事件:

  • 有人说一台只有 4 GB RAM 的计算机在运行 3 天内发生 DRAM 错误的概率高达 95%,
  • 其他人说32% 的服务器在一个月内至少出现一次错误,其中 8% 的 DIMM 存在故障。

与这些恐怖相反,在我使用个人电脑的十多年里,我看到了完全不同的情况没有任何内存错误。

我承认我从未特别关注过这个问题。不过,我曾多次冒险memtest86运行了几个小时,也从未发现任何错误。

我认为以下一些因素会加剧记忆问题:

  • 我用最“大宗商品”的零件组装我的电脑:主流预算主板和次便宜的内存。
  • 另外,我通常会充分利用现有的技术,例如,在 32 位操作系统时代,我使用 4 GB 的 RAM,而在当前的台式机 CPU 和较新的 64 位操作系统中,我使用 32 GB 的 RAM。
  • 由于大量虚拟机全年无休地运行大大小小的任务,因此内存使用量相当大。

但尽管如此,没有发现与内存相关的问题!

怎么样?

答案1

噓!

该死,我试图将其塞进评论中,但格式不够,所以我不得不将其放在答案中。

统计数据

你没看到它的原因是你看到它的几率很低,更重要的是,你没在看。您注意到记忆错误的几率是根据以下几率计算出来的:

  • 宇宙射线撞击地球
  • 射线击中你的位置
  • 射线不会被其他任何东西阻挡或吸收
  • 射线击中你的电脑
  • 射线击中你的内存
  • 射线在 RAM 中翻转一点
  • 当前分配的内存块中的位
  • 使用的内存为:
    • 通过类似程序测试memtest86+
      • 已测试恰逢其时检测错误(例如,程序写入内存然后读回并进行比较的微秒之间)
    • 分配给可执行代码块,在这种情况下:
      • 更改的位显著修改了代码,足以对代码产生巨大影响
      • 剧烈的冲击导致它崩溃
      • 崩溃的程序实际上是明显崩溃的,而不是简单地消失
      • 该计划是你关注和关心的事情
      • 你不能简单地把它当作一个有缺陷的程序丢弃

当然,如果我们谈论的是瞬态、间歇性错误,例如来自宇宙射线和其他电子设备的干扰。如果 RAM 模块确实有缺陷,那么您几乎肯定会在某个时候看到问题(尽管如此,可以想象,如果您从未在任何时候用完所有物理 RAM,并且缺陷恰好很小并且完全局限于您从未使用过的部分,那么您可能不会看到错误)。

出现暂时性错误的几率确实可能出奇的高,但你可能多年来一直看到内存错误,但只是因为上面列出的两个项目而没有注意到它们:可执行代码和错误忽略。

例子

如果改变的位恰好落在某个数据中,那么您甚至可能不会注意到它,因为它很容易被淹没。

例如,如果在一段文本数据中某个位被翻转了,那么您可能会注意到The end.变成了Tje end.,但是您不会注意到 因为单个位被翻转了h而被 替换了j(如果愿意,请随意确认),您更可能只是假设您的手指按错了键,因为它们恰好相邻,然后直接修复错误。

更糟糕的是,如果翻转的位恰好是图片、音频或视频文件的一部分,您可能根本注意不到任何事情。如果它恰好在正确的位置,那么它可能会导致明显的变化,例如图片的宽度或高度不正确,或者歌曲中出现轻微的爆音,或者视频中出现一点损坏,导致解码过程中出现短暂的块状。但是,考虑到媒体文件的庞大规模,单个位恰好位于正确位置的可能性极低。更有可能的是它会稍微改变单个像素的颜色(例如,从深红色变为略深的红色),您可能永远不会注意到。它可能会改变歌曲波形的单个峰值,使其幅度略低,您可能永远不会注意到。它可能会改变视频单个帧中的单个像素,您可能不能注意。

警告

可怕的事实是,这种未被发现的、短暂的错误确实会悄悄出现,不被人注意。这就是为什么我一直非常关心关于使用闪存介质进行备份,因为有时他们会腐败,如果您没有注意到,损坏可能会潜入您的备份并最终永久存在。此外,测试损坏可能很困难,因为预计会发生更改,因此您必须手动检查每个更改,这对于二进制文件来说将是一场噩梦。

带走

我想,如果有好的一面的话,那就是正如我在列表中所说的那样,这种变化必须发生在真正重要的数据部分。对于大多数人来说,它发生在需要保存的重要、不可替代的数据中的几率往往非常低。

你可以使用 memtest 之类的程序来检查你的 RAM 是否有缺陷。如果它通过了检查,那么你只需要担心“十亿分之一的几率”(如果需要的话,我会把确切的计算留给别人)一点点重要的数据被破坏,否则这里或那里的一点“位腐烂”通常不会造成太大的影响,除了可能使程序崩溃并导致你咒骂开发人员(尽管如此,如果它不再发生这种情况......)

答案2

虽然早期的个人计算机(如 IBM PC)包含奇偶校验位来检测内存错误,但大多数现代系统却没有。结果是错误不会被捕获为内存错误,而有时反而会导致其他问题,如数据损坏和奇怪的崩溃。

  • 带奇偶校验的内存-检测错误
  • 带 ECC 的内存 - 检测并纠正错误
  • 内存两者皆无 - 错误无法被检测到

相关内容