AMD Ryzen - Arch Linux 中文维基

跳转到内容

# AMD Ryzen

来自 Arch Linux 中文维基
翻译状态：

- 本文（或部分内容）译自 Ryzen，最近一次同步于 2025-04-10，若英文版本有所更改，则您可以帮助同步与翻译更改的内容。
- 您可以在 ArchWiki 的对应页面找到本文翻译的原始修订历史。
- 本文可能与英文原文存在出入。

Ryzen 是 Advanced Micro Devices (AMD) 制造的微处理器品牌。本文涵盖了不同代 CPU 的系统配置和故障排除信息。

这篇文章的某些内容需要扩充。

原因：添加关于 `amd_pstate` 的内容，或至少链接到 CPU frequency scaling#Scaling drivers。 (在 Talk:AMD Ryzen 中讨论)

相关文章

- 性能优化
- 性能优化/启动过程
- 内核
- 微码

## 启用微码支持

安装 amd-ucode包 包以启用微码更新，并在微码页面的帮助下启用它。这些更新提供了对系统稳定性至关重要的 Bug 修复。尽管它是专有产权的，仍然强烈建议使用。

## 微调 Ryzen

### 监视电压、电源和温度

lm_sensors包 可以开箱即用来监视温度。但是电量消耗及电压等更详细的信息需要 zenpower3-dkmsAUR。也有图形用户界面的工具，如 zenmonitorAUR 和对于 Zen 3 CPU 的 zenmonitor3-gitAUR。

### 电源管理、降压和超频

- RyzenAdj — RyzenAdj 是一个用来调节 Ryzen 移动处理器电源管理设置的命令行工具。

  https://github.com/FlyGoat/RyzenAdj || ryzenadj-gitAUR

- amdctl — amdctl 是一个 AMD CPU 的降、超（升）频率和电压的命令行工具，目前支持 AMD CPU 的 10h, 11h, 12h, 15h, 16h, 17h 和 19h 家族。

  https://github.com/kevinlekiller/amdctl/ || amdctlAUR

- ZenStates-Linux — ZenStates 是一个调节时钟频率和电压的命令行工具。一个详细的设置例子可以在 Level1Techs 论坛 找到。

  https://github.com/r4m0n/ZenStates-Linux || zenstates-gitAUR

- ryzen_smu — Ryzen SMU 是一个 Linux 内核驱动程序，它可以让用户访问某些 AMD Ryzen 处理器的 SMU（系统管理单元）。这 是一个给 5800x3D 降压的例子。

  https://gitlab.com/leogx9r/ryzen_smu || ryzen_smu-dkms-gitAUR

### AMD 3D V-Cache 调度器 (多CCD CPU)

在具有非对称CCD设计的CPU（比如7950X3D, 9950X3D），一个CCD具有3D V-Cache （更大的L3，有利于游戏性能）而另一个则具有更高的频率。 `amd_x3d_vcache` 驱动（6.13以上内核）对外通过sysfs提供对调度器的微调。

首先，在主板的UEFI固件设置中将CPPC Dynamic Preferred Cores设定为 `Driver` （对于微星主板： `OC -> Advanced CPU Configuration -> AMD CBS -> CPPC Dynamic Preferred Cores`），否则sysfs的调节不会起作用。

推荐的设置是将系统置为 `frequency` 模式（即默认），系统和后台应用将偏好非X3D的CCD，并将游戏绑定到X3D核心:

    # echo frequency > /sys/bus/platform/drivers/amd_x3d_vcache/AMDI0101:00/amd_x3d_mode

在`frequency` 模式，X3D 核心有最低的优先级，可以以此判断哪些是X3D核心：

    $ grep -r  /sys/devices/system/cpu/cpu*/cpufreq/amd_pstate_prefcore_ranking

例如9950X3D的cpu0–7和 cpu16–23为X3D核心。对于Linux 原生游戏，可以通过Steam启动选项将他们绑定到这些核心：

    taskset -c 0-7,16-23 %command%

对于通过Proton/Wine 运行的游戏, 使用 `WINE_CPU_TOPOLOGY` 代替：

    WINE_CPU_TOPOLOGY=16:0,1,2,3,4,5,6,7,16,17,18,19,20,21,22,23 %command%

格式为 `<``线程数>:<逗号分隔的CPU列表>`。

## 编译内核

关于启用 Ryzen 支持，参考 Gentoo:Ryzen#Kernel。官方支持的内核中已默认包含了所需的配置。

## 疑难解答

### 随机重启

如果你遇到了随机重启的问题，请参考 Gentoo:Ryzen#Random_reboots_with_mce_events。Ryzen 5000 系列，特别是 5950X 和 5900X 这两款高端型号，在 Linux 下似乎有一些轻微的不稳定问题，可能与 5.11+ 的内核有关，如这个内核 bug 所示。根据网上的报告，似乎 Windows 默认会让 CPU 运行在更高的电压和更低的峰值频率，而 Linux 内核则相反，这取决于你的硅片抽签结果，可能会导致一些随机的应用程序崩溃或硬件错误，从而导致重启。你可以通过 dmesg 日志来识别这些问题，例如：

    kernel: mce: [Hardware Error]: Machine check events logged
    kernel: mce: [Hardware Error]: CPU 22: Machine Check: 0 Bank 1: bc800800060c0859
    kernel: mce: [Hardware Error]: TSC 0 ADDR 7ea8f5b00 MISC d012000000000000 IPID 100b000000000
    kernel: mce: [Hardware Error]: PROCESSOR 2:a20f10 TIME 1636645367 SOCKET 0 APIC d microcode a201016

CPU ID 和处理器编号可能会不同。要解决这个问题，你需要给你的 CPU 提供更高的电压，以便它在高频运行时保持稳定。最简单的方法是使用 AMD 曲线优化器，这是一个可以通过你的主板 UEFI 访问的功能。进入 UEFI 并设置一个正向的 4 点偏移，这会增加你的 CPU 在高负载时的电压。这会限制超频的潜力，因为需要更好的散热，但它会运行得更稳定。更多细节请查看这个论坛帖子。当我对我的 5950X 这样做时，我的处理器稳定了，频率和电压的范围也更接近 Windows 下的情况。

### 系统挂起

在类似 #随机重启的情况下，系统可能会在重负载或特定的低负载下挂起，即使在应用了修复措施后也是如此。重置按钮或强制关机不起作用，外设电源关闭，视频输出可能会停止，拔掉电源是唯一的方法。

将频率降低到非超频标准并增加 CPU 或 RAM 的电压可能会有所帮助，但可能无法解决问题。一个潜在的解决方法是更新 UEFI（也被误称为“BIOS 更新”），然后应用 PBO+4 曲线以提高高频下的稳定性。根据硅片抽签结果，某些 CPU 可能需要 +6 或更高的偏移量。

### 屏幕撕裂（APU）

如果你正在使用 Xorg 并遇到了屏幕撕裂的问题，请查看：AMDGPU#无撕裂渲染。

### 软锁冻结

这个 bug 已经很有名了，目前正在 bugzilla 和 launchpad 上讨论。虽然解决方案并不是在所有情况下都一样，但这个帮助了一些用户。把这个命令 `echo rcu_nocbs=0-$(($(nproc)-1))` 的输出作为一个内核参数添加，其中命令 `nproc` 只是打印出你的 CPU 的线程数。要应用这个选项，你需要一个带 `CONFIG_RCU_NOCB_CPU` 选项编译过的内核（比如 linux包）。

导致冻结的另一个原因是电源管理中的 c-states。最大的省电状态 c6 可能会导致问题。在一些情况下，添加内核参数 `processor.max_cstate=5` 会有帮助，但其他用户报告说这个选项没有应用，c6 状态仍然被进入。对他们来说，这个包 disable-c6-systemdAUR 会有帮助。在使用它之前，需要运行 `modprobe msr` 来激活那个内核模块。

一些带有 Ryzen CPU 的笔记本电脑，比如 HP Envy x360 15-bq100na，可能会遇到 CPU 软锁定，导致系统冻结。可以通过添加内核参数 `idle=nomwait` 来避免。

在一些情况下，内核参数 `pci=nomsi` 可以修复问题。

在其他一些情况下，问题只是硬件不好，保修换一个新的 CPU 可能就能解决你的问题。

### 关机、重启、挂起时卡住

注意：通过更新 UEFI（也被误称为“BIOS 更新”）获取的较新 AGESA 固件可能已经修复了这个问题。

这似乎与 C6 c-state 有关，它在 Linux 中似乎并不受到很好的支持（如果有的话）。

要解决这个问题，进入 UEFI 设置并搜索一个标记为类似于“电源空闲控制”的选项。将其值更改为“典型空闲电流”。请注意，这些名称取决于主板制造商对它们的命名，因此在您的特定情况下可能会有所不同。

其他不太理想的解决方案包括在 UEFI 设置中禁用 c-states 或在内核命令行参数中添加 `processor.max_cstate=1`。

## 另见

- Gentoo:Ryzen

分类：​

- CPU

AMD Ryzen
添加话题