繁体   English   中英

mcelog 缓存错误,如何在 Intel i7 CPU 上禁用 L3 缓存

[英]mcelog Cache Error, how to Disable L3 Cache on Intel i7 CPU

我不是程序员,而是从 DOS 开始就有经验的系统集成商

我买了一台二手的准系统 PC,它有一些小问题: 它有时会崩溃,它没有连接到 RAM

它在主机和顶部 CentOS 和 Windows VM 上运行 debian KVM (proxmox)

我在 debian 上的 mcelog 中有此错误

Hardware event. This is not a software error.
MCE 0
CPU 0 BANK 8 TSC 25f5e6ef72
MISC 12dc0 ADDR 372c9000007c2f6
TIME 1614950322 Fri Mar  5 14:18:42 2021
MCG status:
MCi status:
Corrected error
MCi_MISC register valid
MCi_ADDR register valid
Threshold based error status: green
MCA: corrected filtering (some unreported errors in same region)
**Generic CACHE Level-3 Generic Error**
STATUS 8c2000800001110b MCGSTATUS 0
MCGCAP c09 APICID 0 SOCKETID 0
MICROCODE ca
CPUID Vendor Intel Family 6 Model 142 Step 9

问题:

通常是否可以仅禁用 L3 缓存? CPU 否则可能会工作 我正在阅读关于 stackoverflow 的另一篇文章,其中缓存完全被禁用 L1L2L3 并且机器运行 X 速度太慢

我发现了这个技巧,我用这个禁用缓存吗?

x:~# cat /proc/mtrr
reg00: base=0x080000000 ( 2048MB), size= 2048MB, count=1: uncachable
reg01: base=0x07c000000 ( 1984MB), size=   64MB, count=1: uncachable
reg02: base=0x07b800000 ( 1976MB), size=    8MB, count=1: uncachable
x:~# echo disable=00 > /proc/mtrr
x:~# echo disable=01 > /proc/mtrr
x:~# echo disable=02 > /proc/mtrr
x:~# cat /proc/mtrr
x:~#

我很好奇,如果这是我第一个持久的 stackoverflow 帖子,也许未知会再次删除它,因为未知还没有了解言论自由:) 永远审查!

Intel CPU Family 6 Model 142 (0x8E) 指的是 7-9 代酷睿处理器。 所有这些处理器都有一个“包含 L3”缓存——任何 L1 或 L2 缓存中的所有行也必须缓存在 L3 中。 “禁用” L3 只有在存在阻止 L3 缓存数据的模式位时才能工作,同时仍允许 L3 目录执行其 function 来管理缓存一致性。

英特尔尚未公开披露如何仅禁用大多数处理器(包括 Core i7-7567U)上的 L3 缓存。 禁用 MTRR 确实有效地禁用了处理器上的所有三个缓存级别,因为所有访问都变成了 UC 类型(意味着不可缓存),下面讨论了一个可能的例外。

/proc/mtrr文件仅列出启用的可变范围 MTRR。 但是,它并没有向您显示所有的 MTRR。 任何其他可变范围 MTRR 都被禁用,您不必担心它们。 不过,固定范围的 MTRR 仍处于启用状态。 这些在物理地址空间的底部 1 MB 中指定 memory 类型的固定范围。 禁用/proc/mtrr列出的所有 MTRR 不会禁用或影响固定范围的 MTRR。 某些固定范围通常具有可缓存的 memory 类型。

根据相关的memory类型解析规则,一个物理的memory地址不在任何使能的MTRR范围内,其memory类型在IA32_MTRR_DEF_TYPE寄存器的最低8位中指定了memory类型。 这种类型在大多数或所有 x86 生产系统上都是 UC。 您可以通过执行sudo rdmsr -a 0x2ff并检查每个逻辑内核的 output 的最低 8 位来确定默认类型。 请注意,MTRR 实际上是每个物理内核的,但rdmsr没有提供任何开关来每个物理内核仅运行一个逻辑内核。

如果要禁用所有 MTRR,最好的方法是通过执行wrmsr -a 0x2ff 15 0x400将第 11 位设置为零,这会强制整个物理地址空间为 UC。 您不需要更改/proc/mtrr中的任何内容,最好保持原样。 -a选项在这里很重要,因为您通常希望 memory 类型不依赖于代码恰好在哪个内核上运行。

这种简单的方法仍然存在一些问题。 现代处理器包括特定于系统管理模式 (SMM) 中使用的 memory 范围的附加 MTRR。 这些 MTRR 只能在 SMM 中修改。 启用后,SMM 之外对其 MTRR 中配置的 memory 范围的任何访问都将被忽略。 在我的系统上,为 SMM 范围指定的 memory 类型是 WB,因此它是可缓存的。

[临时通知:再想一想,我不确定 IA32_MTRR_DEF_TYPE[11] 是否也控制 SMM 范围寄存器。 我将不得不与英特尔核实。 如果没有,那么在支持 SMM MTRR 的处理器(包括您的处理器)上,完全禁用缓存的唯一方法是将CR0.CD设置为 1。如果是,那么没问题。]

另一个问题是,我认为wrmsr -a 0x2ff 15 0x400不符合在系统的所有内核上一致地更改 MTRR 的推荐程序,因此我只会出于实验目的尝试它。 在生产系统上,您可能必须编写 kernel 模块才能按照手册中的说明正确执行此操作。

我认为在禁用 MTRR 之前不需要写回和使缓存无效,因为在缓存中也会查找 UC 访问。 但我目前无法从 Intel 或 AMD 手册中找到声明来确认这一点。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM