Ubuntu 内存错误,但 MemTest86+ 没有内存错误

Art*_*yom 8 ram data-corruption

我遇到了一些 btrfs 和 ext4 错误。在决定测试我的 RAM 后,我遇到了以下重复错误memtester。在运行了一段时间后,我总是会遇到类似的错误memtester。通常在一个小时内,但一次需要4-5个小时。

我的电脑的内存是焊接的。我有额外的空槽。BIOS 中没有禁用板载 RAM 的设置。

我跑了:

  • Memtest86+ 8 次(约 8 小时)
  • MemTest86 18 次(约 9 小时)
  • memtesterstressapptest在Fedora 27默认情况下,安装在USB记忆棒(约10小时)
  • memtesterstressapptestUbuntu 17.10 Live 默认(约 2 小时)
  • memtester以及stressapptest在 U 盘上的 Ubuntu 17.10(约 8 小时)
  • # debsums --changed 唯一改变的文件是一个主题的图像。

他们没有打印任何错误。

我正在使用带有默认内核的 Ubuntu 17.10(从 17.04 升级)。内核没有被污染。这是一台配备 Intel Haswell i3 的华硕笔记本电脑。

  • 还使用 Linux 4.14.13 和 4.15.0-rc3,rc4 主线进行了测试。
  • 还使用清除的英特尔微码包进行了测试。

Nouveau 被禁用或启用,错误是可重现的,没有加载 nvidia 二进制驱动程序。

将以下模块列入黑名单: mtd intel_spi_platform intel_spi因为它们不会在默认的 Fedora 27 安装中加载,而且它们似乎会使某些 Lenova 笔记本电脑变砖。错误并没有停止。

uname -a的输出

Linux hostname 4.13.0-19-generic #22-Ubuntu SMP Mon Dec 4 11:58:07 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux
Run Code Online (Sandbox Code Playgroud)

# lsmod的输出

https://paste.ubuntu.com/26222245/

Fedora 27 的# lsmod输出

https://paste.ubuntu.com/26226473/

现在的情况

我已经将我的 HDD 放入我认为性能良好的笔记本电脑(备用笔记本电脑)中,并在那里进行了测试。我得到了错误。现在我很确定这是一个软件问题。我从来没有能够在我的笔记本电脑上用新的 Ubuntu 或 Fedora 尝试很多小时来触发错误。

我该怎么办?

错误示例:

Loop 6:
  Stuck Address       : ok         
  Random Value        : ok
  Compare XOR         : ok
  Compare SUB         : ok
  Compare MUL         : ok
  Compare DIV         : ok
  Compare OR          : ok
  Compare AND         : ok
  Sequential Increment: ok
  Solid Bits          : ok         
  Block Sequential    : ok         
  Checkerboard        : ok         
  Bit Spread          : ok         
  Bit Flip            : testing 262
FAILURE: 0x00000000 != 0xfffffffeffffffff at offset 0x0ef94000.
FAILURE: 0x00000000 != 0x100000000 at offset 0x0ef94008.
FAILURE: 0x00000000 != 0xfffffffeffffffff at offset 0x0ef94010.
FAILURE: 0x00000000 != 0x100000000 at offset 0x0ef94018.
FAILURE: 0x00000000 != 0xfffffffeffffffff at offset 0x0ef94020.
FAILURE: 0x00000000 != 0x100000000 at offset 0x0ef94028.
FAILURE: 0x00000000 != 0xfffffffeffffffff at offset 0x0ef94030.
FAILURE: 0x00000000 != 0x100000000 at offset 0x0ef94038.
  Walking Ones        : ok         
  Walking Zeroes      : ok         
  8-bit Writes        : ok
  16-bit Writes       : ok
Run Code Online (Sandbox Code Playgroud)

两个 RAM 插槽已满的类似错误:

Loop 1:
  Stuck Address       : ok         
  Random Value        : ok
  Compare XOR         : ok
  Compare SUB         : ok
  Compare MUL         : ok
  Compare DIV         : ok
  Compare OR          : ok
  Compare AND         : ok
  Sequential Increment: ok
  Solid Bits          : ok         
  Block Sequential    : ok         
  Checkerboard        : ok         
  Bit Spread          : testing   4
FAILURE: 0x00000000 != 0x00000050 at offset 0x7da80000.
FAILURE: 0x00000000 != 0xffffffffffffffaf at offset 0x7da80008.
FAILURE: 0x00000000 != 0x00000050 at offset 0x7da80010.
FAILURE: 0x00000000 != 0xffffffffffffffaf at offset 0x7da80018.
FAILURE: 0x00000000 != 0x00000050 at offset 0x7da80020.
FAILURE: 0x00000000 != 0xffffffffffffffaf at offset 0x7da80028.
FAILURE: 0x00000000 != 0x00000050 at offset 0x7da80030.
FAILURE: 0x00000000 != 0xffffffffffffffaf at offset 0x7da80038.
  Bit Flip            : setting 141
Run Code Online (Sandbox Code Playgroud)

错误stressapptest

Report Error: miscompare : DIMM Unknown : 1 : 157s
Hardware Error: miscompare on CPU 2(0x2) at 0x7fcc0726e000(0xb0d18:DIMM Unknown): read:0x0000000000000000, reread:0x0000000000000000 expected:0x4a4a4a4a4a4a4a4a
Report Error: miscompare : DIMM Unknown : 1 : 157s
Hardware Error: miscompare on CPU 2(0x2) at 0x7fcc0726e008(0xb0d18:DIMM Unknown): read:0x0000000000000000, reread:0x0000000000000000 expected:0x4a4a4a4a4a4a4a4a
Report Error: miscompare : DIMM Unknown : 1 : 157s
Hardware Error: miscompare on CPU 2(0x2) at 0x7fcc0726e010(0xb0d18:DIMM Unknown): read:0x0000000000000000, reread:0x0000000000000000 expected:0x4a4a4a4a4a4a4a4a
Report Error: miscompare : DIMM Unknown : 1 : 157s
Hardware Error: miscompare on CPU 2(0x2) at 0x7fcc0726e018(0xb0d18:DIMM Unknown): read:0x0000000000000000, reread:0x0000000000000000 expected:0x4a4a4a4a4a4a4a4a
Report Error: miscompare : DIMM Unknown : 1 : 157s
Hardware Error: miscompare on CPU 2(0x2) at 0x7fcc0726e020(0xb0d18:DIMM Unknown): read:0x0000000000000000, reread:0x0000000000000000 expected:0x4a4a4a4a4a4a4a4a
Report Error: miscompare : DIMM Unknown : 1 : 157s
Hardware Error: miscompare on CPU 2(0x2) at 0x7fcc0726e028(0xb0d18:DIMM Unknown): read:0x0000000000000000, reread:0x0000000000000000 expected:0x4a4a4a4a4a4a4a4a
Report Error: miscompare : DIMM Unknown : 1 : 157s
Hardware Error: miscompare on CPU 2(0x2) at 0x7fcc0726e030(0xb0d18:DIMM Unknown): read:0x0000000000000000, reread:0x0000000000000000 expected:0x4a4a4a4a4a4a4a4a
Report Error: miscompare : DIMM Unknown : 1 : 157s
Hardware Error: miscompare on CPU 2(0x2) at 0x7fcc0726e038(0xb0d18:DIMM Unknown): read:0x0000000000000000, reread:0x0000000000000000 expected:0x4a4a4a4a4a4a4a4a
Run Code Online (Sandbox Code Playgroud)

我怀疑 Ubuntu 的配置与我的笔记本电脑的硬件相结合是导致这些错误的原因。几乎每次都是八包。

下面不重要的、松散相关的信息

关于 btrfs 错误;我使用的是 17.04。我在 btrfs 的 irc 上问过。有人告诉我这可能是硬件错误或内存管理错误。btrfs 的元数据页面的一部分被零填充,就像我现在遇到的那样。我确实只运行了几遍 memtester,切换到 ext4 并将责任归咎于 nvidia 二进制驱动程序。

我使用的命令及其参数:

# stressapptest -M 10000 -s 1800
Run Code Online (Sandbox Code Playgroud)

10000 是我可以测试的可用内存。我通过free -m-s`得到它是秒。

# memtester 4096
Run Code Online (Sandbox Code Playgroud)

笔记本电脑的 CPU 有 2 个内核,所以我通常会启动两个实例。4096 是当前可用内存的一半free -m

Win*_*nix 1

已删除的答案已接近

此问答中的答案已被删除:

您是否已经尝试重新安装 ubuntu,因为这听起来像是操作系统级别的内存管理故障

我的答案是相似的,因为它涉及非常低级的内存管理;内核级别的KASLR 。

KASLR 的作用

KASLR代表内核地址空间布局随机化。​​ 我从来没有听过它大声说出来,但在我心里我把它读成“Casler”。想想机器里友好的幽灵。KASLR 是一种安全措施,用于随机化内核模块所在的内存位置。从理论上讲,当您不能依赖始终位于同一内存位置的同一位代码时,内核就更难破解。

KASLR 操作可以被视为与内存测试器相反,内存测试器重复读取和写入相同的内存位置,期望不会发生任何变化。这些是对立的,它吸引了我(注意到习语),对 KASLR 和内存错误进行谷歌搜索。一个看似不相关的问题可能值得在github上发布一条链接到此问答的消息。原因是他们认为他们是唯一受到移动内存地址影响的人(如果我正确地阅读了他们的线程)。前三个点击来自RedHat,我不愿意链接到他们,因为他们的网站是谷歌搜索机器人上的部分帖子,然后他们让你付费阅读。

当 KASLR 将内核“内容”加载到内存映射的中间时,存在一些已知的问题,而这是不应该执行的。不幸的是,我不记得上周找到的包含在今晚答案中的链接。该链接有一个补丁/解决方法,用于指示 KASLR 不使用特定的内存位置。

在确认 KASLR 和内存位置的已知问题后,我在问题下评论以禁用它 KASLR 并重新运行内存测试。回复说它似乎成功了,所以我发布了这个答案。

如何禁用 KASLR

尽管我已经使用 grub 内核命令行选项“kaslr”好几年了,但至少从版本4.12开始它就成为内核默认选项。要消除加载 KASLR,请编辑/etc/default/grub并更改此行:

GRUB_CMDLINE_LINUX_DEFAULT="quiet splash nokaslr"
Run Code Online (Sandbox Code Playgroud)

除了“安静”和“飞溅”之外,您可能还有其他选择。重要的一步是添加“nokaslr”并保留其他选项。

然后保存文件并运行:

sudo update-grub
Run Code Online (Sandbox Code Playgroud)

当然,禁用 KASLR 的另一种方法是在未自动包含 KASLR 时,在 Ubuntu 16.04.1 下简单地使用较旧的内核(例如 4.4.0)。


Mik*_*nen 0

这个问题听起来很像 RAM 的随机位损坏。根据我的经验,MemTest86 对于硬件测试来说“太简单了”。它会发现内存确实很差,但轻微的问题往往会被忽视。

如果您想知道您的内存是否良好,请尝试在自检/折磨模式下运行Prime95 ,并配置为使用尽可能多的 RAM。

另一个好的测试是运行双面划锤测试几个小时。

我相信,如果 Prime95 和双面 Rowhammer 无法发现您的内存有任何问题,它可能会正常工作。然而,即使你的记忆力稍差(曾经做过这些,但从长远来看,数据已损坏),简单地运行 MemTest86、编译程序、安装操作系统、玩游戏似乎也能工作。