mcelog Cache Error,如何在Intel i7 CPU上禁用L3 Cache



我不是一个程序员,而是一个有经验的系统集成商,因为DOS

我买了一台二手Barebone PC,它有一些小问题:它有时会崩溃,这是没有连接到RAM

在主机和CentOS和Windows虚拟机上运行debian KVM (proxmox)

我在debian的日志中有这个错误

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的文章,其中缓存完全被禁用机器运行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中。"Disabling"只有当有一个模式位阻止L3缓存数据,同时仍然允许L3目录执行其管理缓存一致性的功能时,L3才能工作。

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

/proc/mtrr文件只列出已启用的可变范围mtrr。然而,它并没有显示所有的mtrr。任何其他可变范围的mtrr都是禁用的,您不必担心它们。但是,固定范围的mtrr仍然是启用的。它们指定物理地址空间底部1mb内固定范围的内存类型。禁用/proc/mtrr列出的所有mtrr不会禁用或影响固定范围的mtrr。对于某些固定范围来说,通常具有可缓存的内存类型。

根据相关的内存类型解析规则,不包含在任何已启用的MTRR范围内的物理内存地址具有IA32_MTRR_DEF_TYPEMSR寄存器最低8位指定的内存类型。这种类型是大多数或所有x86生产系统上的统一通信。您可以通过执行sudo rdmsr -a 0x2ff并检查每个逻辑核心的最低8位输出来确定默认类型。请注意,mtrr实际上是每个物理核心,但是rdmsr没有提供在每个物理核心上只运行一个逻辑核心的开关。

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

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

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

另一个问题是,我不认为wrmsr -a 0x2ff 15 0x400坚持在系统的所有核心上一致地更改mtrr的推荐过程,所以我只会为了实验目的而尝试它。在生产系统上,您可能需要编写一个内核模块才能按照手册中的描述正确地执行此操作。

我认为在禁用mtrr之前不需要回写并使缓存无效,因为UC访问也在缓存中查找。但我目前无法从英特尔或AMD的手册中找到声明来证实这一点。

最新更新