丹尼拉(Dayfing)
返回文章列表
4,473 字17 分钟

开发者 DDR5 内存指南:容量、频率、时序与 ECC

对于 2026 年的大多数开发工作,32 GB DDR5 是实际的下限;一旦日常工作中出现容器、本地 Kubernetes 集群或虚拟机,64 GB 就是舒适的默认值;而 96 到 128 GB 甚至更多,则适合同时运行多台虚拟机、处理大型数据集,或在 CPU 上卸载部分层来运行本地 LLM。请用两条相同的内存条而不是四条来凑出这个容量,并让内存运行在 CPU 的官方频率,或运行在你真正测试过的配置文件上。比较内存套条时看以纳秒计的延迟,而不是只看 CAS 数值;只有在平台从头到尾都支持并能上报错误时,才选择真正的 ECC。

按负载估算容量

内存压力来自同时运行的程序,所以要把彼此重叠的峰值加起来,而不是把平均值加起来。

编辑器、浏览器与语言服务器

IDE 本身很少成为问题。真正占用内存的是每个已打开项目的语言服务器和索引器,以及一个装满文档和你正在开发的应用的浏览器。仅就这类负载而言,32 GB 足以给构建过程和文件缓存留出空间,而文件缓存能让重复构建更快。

容器与 Docker 中的 Kubernetes

在 macOS 和 Windows 上,容器运行在一个有固定上限的 Linux 虚拟机里。macOS 上的 Docker Desktop 默认把内存上限设为主机内存的 50%;在 Windows 上,WSL 2 后端沿用 WSL 的 memory 设置,其默认值同样是 Windows 内存的 50%(WSL 配置说明)。在一台 32 GB 的笔记本上,这意味着所有容器、kind 节点和构建加起来只有大约 16 GB。并行运行的编码代理会成倍放大负载,因为每个 worktree 都可能启动自己的开发服务器、测试数据库和构建,正如智能体编程指南所描述的那样。

数据库与虚拟机

PostgreSQL 文档建议在专用服务器上把 shared_buffers 的起始值设为内存的 25%,但工作站并不是专用服务器。请按你实际查询的工作集来确定数据库缓冲区的大小。虚拟机则更简单:除非虚拟机管理程序使用了内存气球或动态内存,正在运行的客户机会一直占用大部分分配给它的内存。微软对 Windows 11 的最低要求是 4 GB,而一台在内部运行 IDE 的客户机需要多得多。同时运行两三台客户机,是开发者觉得 64 GB 不够用的常见原因。

在 CPU 上卸载部分层的本地 LLM

模型权重大约占用 parameters × bits per weight / 8 字节,因此一个 70B 模型在每个权重约 4.5 位的量化下,在计入 KV 缓存和运行时开销之前就需要大约 39 GB。放不进 GPU 的层驻留在系统内存中,每生成一个 token 都要读取一遍。容量决定模型能否加载,带宽则限制生成速度。GPU 和量化的选择在本地 LLM 硬件指南中有详细介绍。

购买前先测量自己的峰值

真正重要的数字,是你最繁重的正常工作日中的峰值。在 Linux 上,一边工作一边每 30 秒记录一次可用内存和内存压力:

#!/usr/bin/env bash
# Log memory headroom and pressure every 30 seconds (stop with Ctrl+C)
while true; do
  {
    printf '%s ' "$(date -Is)"
    awk '/^(MemTotal|MemAvailable|SwapTotal|SwapFree):/ {printf "%s %d ", $1, $2/1024}' /proc/meminfo
    awk '/^some/ {print "psi_some_" $2}' /proc/pressure/memory
  } >> "$HOME/mem-headroom.log"
  sleep 30
done

然后用总内存减去 MemAvailable 的最小值来计算峰值。由于 MemAvailable 把可回收的缓存算作空闲内存,这个结果就是应用程序真正需要的内存:

awk '{t=$3; a=$5; if (min == "" || a < min) min = a}
     END {printf "peak used: %d MiB of %d MiB\n", t - min, t}' "$HOME/mem-headroom.log"

内存压力和峰值同样重要。some avg10 表示在 10 秒平均窗口内,至少有一个任务在等待内存的时间占比。如果这个值持续不为零、swap 在不断增长,或者 journalctl -k 中出现 OOM killer 的记录,就说明机器的内存已经不够了。放在高速硬盘上的 swap 可以缓解问题,但无法替代内存;存储方面的选择请参阅 NVMe SSD 选购指南。

对于某条繁重的命令,例如一次完整构建,可以让它在单独的 cgroup 中运行,然后读取 memory.peak。这是内核为该 cgroup 及其后代记录的最大内存使用量,其中包含页缓存:

cat > peak-mem.sh <<'EOF'
#!/usr/bin/env bash
# Run a command and report the peak memory of its cgroup
"$@"
status=$?
cg="/sys/fs/cgroup$(cut -d: -f3 /proc/self/cgroup)"
echo "memory.peak: $(( $(cat "$cg/memory.peak") / 1048576 )) MiB" >&2
exit "$status"
EOF
chmod +x peak-mem.sh
systemd-run --user --scope --quiet ./peak-mem.sh make -j"$(nproc)"

容器和 kind 节点可以用 docker stats --no-stream 查看;在 macOS 上看“活动监视器”中的内存压力图;在 Windows 上看“任务管理器”中的已提交内存。在测得的峰值上留出余量,再向上取整到两条内存能够提供的容量。

通道,以及为什么两条通常比四条好

主流桌面平台,例如 AM5 上的 AMD Ryzen 9000 和 Intel Core Ultra 200S,都有两个 DDR5 通道。每条 DDR5 内存包含两个完全独立的子通道,每个子通道有 32 位数据宽度,因此双通道台式机每次传输 128 位数据。理论峰值带宽可以直接算出:

bandwidth (GB/s) = channels × 8 bytes × data rate (MT/s) / 1000

2 × 8 × 5600 / 1000 = 89.6 GB/s    dual-channel DDR5-5600
2 × 8 × 6400 / 1000 = 102.4 GB/s   dual-channel DDR5-6400

在同样两个通道上插四条内存,增加的是容量,而不是带宽。

每通道一条与每通道两条

插满四个插槽的主板会以每通道两条内存的方式工作,每多一条内存,同一组信号线上的负载就更重。AMD 为 Ryzen 9 9950X 公布的规格中,两条内存为 DDR5-5600,四条内存为 DDR5-3600,单 rank 和双 rank 都是如此(AMD Ryzen 9 9950X 规格)。Intel 的产品简介说明,最高频率针对每通道一条内存的配置,增加内存负载可能会降低频率(Intel Core Ultra 桌面处理器第二代简介)。

先确定总容量,再用两条内存来实现:64 GB 用 2 × 32 GB,96 GB 用 2 × 48 GB,128 GB 用 2 × 64 GB。只有当两条内存装不下所需容量时才插满四个插槽,并接受更低的频率和更长的内存训练时间。事后再加购第二套内存是导致系统不稳定的典型原因,因为这两套内存从未一起验证过。

频率、CAS 延迟与真实延迟

在 DDR5-6000 CL30 这个标注中,数据速率的单位是每秒百万次传输,而 CAS 延迟以时钟周期计。DDR 每个时钟周期传输两次数据,因此以纳秒计的首字延迟为:

true latency (ns) = CL × 2000 / data rate (MT/s)

DDR5-4800 CL40: 40 × 2000 / 4800 = 16.7 ns
DDR5-5600 CL46: 46 × 2000 / 5600 = 16.4 ns
DDR5-6000 CL30: 30 × 2000 / 6000 = 10.0 ns
DDR5-6400 CL32: 32 × 2000 / 6400 = 10.0 ns

更快的套条 CL 更高,并不自动意味着更差。CAS 只是众多时序中的一个,所以这个公式适合用来比较套条,而不是预测软件实际感受到的延迟。

对开发工作而言,优先级依次是容量、稳定性、带宽,最后才是延迟,因为一台开始使用 swap 的机器损失的性能远超任何时序调整所能挽回的。CPU 推理是例外:对于卸载到内存中的层,每秒 token 数不可能超过带宽除以每个 token 需要读取的权重字节数。如果内存中有 30 GB 的稠密权重,带宽为 89.6 GB/s,那么上限约为每秒 3 个 token。混合专家(mixture-of-experts)模型只读取被激活的专家,这会降低每个 token 的读取量,但不会降低所需的容量。

XMP 与 EXPO:标称频率就是超频

零售内存套条既保存主板默认使用的标准 JEDEC 时序,也保存厂商的配置文件。Intel XMP 3.0 最多支持五个配置文件,其中三个由厂商提供,两个可由用户改写;AMD EXPO 则提供针对 AM5 平台 Ryzen 调校的配置文件。两家厂商都把这称为超频。Intel 表示,超出规格使用 XMP 可能导致处理器失去保修(Intel XMP);AMD 则表示,让内存在 AMD 公布的规格之外运行会使 AMD 产品保修失效(AMD EXPO)。

内存厂商只在部分主板上验证过配置文件,而你的 CPU 中的内存控制器是另一个独立的个体。对于工作用机,建议按以下顺序操作:

  1. 先更新主板固件,因为内存训练代码会随版本变化。
  2. 启用配置文件后,等待首次启动完成。更换内存后的 DDR5 训练可能比正常启动慢得多。
  3. 在把真实工作交给这台机器之前,先完成下文所述的稳定性测试。
  4. 如果出现错误,把频率降一档或恢复 JEDEC 默认值,而不是凭感觉提高电压。

对于一台必须先保证正确、再追求速度的机器,运行在 CPU 官方频率上是完全合理的选择。

CUDIMM 与时钟驱动器

CUDIMM 是在内存条上带有时钟驱动器(CKD)的无缓冲内存。JEDEC 的 DDR5CKD01 标准定义了这种为 CUDIMM、CSODIMM 和 CAMM 模块重新驱动时钟信号的器件(JEDEC DDR5 时钟驱动器),它能在高速率下改善信号质量。

它是否有用取决于平台支持。Intel 的 Core Ultra 200S 产品简介列出的是每通道一条 CUDIMM 时的 DDR5-6400;Intel 在 2026 年 3 月发布 Core Ultra 200S Plus 时将其提高到 DDR5-7200,并在部分 Intel 800 系列芯片组主板上加入了对单条最高 128 GB 的四 rank CUDIMM 的早期支持。在其他平台上,请先查阅 CPU 规格和主板的内存兼容列表。CUDIMM 不是带寄存器的内存,除非产品说明明确写出,否则也没有旁路(side-band)ECC。

片上 ECC 不等于 ECC 内存

每颗 DDR5 芯片都有片上 ECC(on-die ECC),JEDEC 将其列为支持先进制程制造的功能之一(JEDEC DDR5 标准)。它只纠正 DRAM 阵列内部的错误,不保护内存条、插槽接口和总线,其纠正结果也不会上报给操作系统。普通 UDIMM 上标注的片上 ECC 描述的是 DDR5 本身,而不是 ECC 内存条。

旁路 ECC 会额外增加 DRAM 芯片,为每个子通道存储校验位。内存控制器在每次访问时进行校验,纠正编码能力范围内的错误,检测更严重的错误,并把这两类情况都报告给操作系统。这种上报才是真正的价值所在:某条内存上不断增长的已纠正错误计数是早期预警,而没有 ECC 的机器只会时不时地崩溃或悄悄损坏数据。

UDIMM、RDIMM 与防呆缺口

ECC UDIMM 是无缓冲内存,适用于平台支持 ECC 的消费级主板和入门级工作站。RDIMM 增加了寄存时钟驱动器,用于服务器和高端工作站平台。DDR5 的 UDIMM 与 RDIMM 防呆缺口位置不同,因此不能互换,也不能混插。

哪些平台支持真正的 ECC

只有 CPU、芯片组、固件和内存条都支持时,ECC 才能工作。截至 2026 年 9 月,情况如下:

  • AM5 上的 AMD Ryzen 9000:AMD 对 9950X 等型号标注的 ECC 支持为“Yes (Requires mobo support)”。请在主板手册中确认是否支持 ECC UDIMM,并核对具体的 CPU 型号,因为 AMD 各桌面产品系列并不相同。
  • AM5 上的 AMD EPYC 4005:面向同一插槽的服务器 CPU,支持最高 192 GB 的 DDR5 ECC 内存。
  • AMD Ryzen Threadripper PRO 9000 WX 系列:最多八通道 DDR5 RDIMM,ECC 默认启用。
  • Intel Core Ultra 200S:ECC 需要处理器和芯片组同时支持(Intel 关于 ECC 支持的文章)。Intel 标注 W880 支持 ECC,Z890 不支持。
  • W890 平台上的 Intel Xeon 600 工作站处理器:带 ECC 的寄存式 DDR5。

使用 ECC 内存首次开机后,请实际验证 ECC 已经启用,而不是想当然。

笔记本:板载 LPDDR5X 与 CAMM2

大多数轻薄笔记本使用焊接在主板上或封装在处理器上的 LPDDR5X。它速度快、功耗低,但容量在购买时就已固定,有些平台的上限还很低:Intel 为 Core Ultra 7 258V 标注的最大内存是 32 GB。请在购买时一次买到你以后本想升级到的容量。

另一端是位宽很大的设计。AMD Ryzen AI Max+ PRO 395 使用 256 位 LPDDR5X-8000 接口,最高 128 GB,按同样的公式计算为 32 字节 × 8000 MT/s = 256 GB/s 的理论带宽,是 DDR5-6400 双通道台式机的两倍半。这正是此类机器适合运行本地模型的原因,但它们没有任何可升级的部分。

CAMM2 是可更换的替代方案。JEDEC 于 2023 年 12 月发布的 JESD318 标准定义了 DDR5 和 LPDDR5/5X 两种压缩连接内存模块(Compression Attached Memory Module),二者采用共同的连接器设计。是否提供取决于具体的笔记本型号,请在厂商规格中查找 CAMM2 或 LPCAMM2。带 SO-DIMM 插槽的笔记本仍然是最简单的升级途径。

用 memtest86+ 测试稳定性并在 Linux 中读取错误

每换一套新内存、每次更改配置文件、每次更新会改变内存训练的固件,都要重新测试。Memtest86+ 是一款免费、开源的独立内存测试工具。当前版本 v8.10 发布于 2026 年 5 月,同一个二进制文件可以在 UEFI 和传统 BIOS 下启动(memtest86+)。该二进制文件没有经过微软签名,因此测试期间需要关闭 Secure Boot,测试结束后再重新打开。完整跑完一轮即可测试全部内存,运行更久能提高信心。如果超频后的系统报错,先恢复默认设置重测,再逐条测试内存。它与 PassMark 的 MemTest86 是两个不同的项目。

新机器先用 JEDEC 默认值跑一轮,启用配置文件后再跑几轮,然后在操作系统内做一次负载测试:

sudo apt install stressapptest
# Test 75% of RAM for one hour with CPU-intensive copy threads
stressapptest -s 3600 -M "$(awk '/MemTotal/ {printf "%d", $2*0.75/1024}' /proc/meminfo)" -W

在启用 ECC 的机器上,Linux 通过 sysfs 中的 EDAC 计数器报告已纠正和未纠正的错误(内核 EDAC 文档):

ls /sys/devices/system/edac/mc/
sudo dmesg | grep -i -E 'edac|ecc'
grep -H . /sys/devices/system/edac/mc/mc*/ce_count /sys/devices/system/edac/mc/mc*/ue_count

sudo apt install rasdaemon
sudo ras-mc-ctl --status
sudo ras-mc-ctl --error-count

如果 /sys/devices/system/edac/mc/ 为空,说明内核没有适用于该内存控制器的 EDAC 驱动,或者 ECC 未启用,无论内存条标签怎么写都一样;dmidecode -t memory 显示的也只是固件的声明。任何未纠正错误都应视为硬件事故,而某条内存上持续增长的已纠正错误计数则是更换该内存条的理由。较新版本的 rasdaemon 把这些选项移到了子命令下,请以 ras-mc-ctl --help 为准。

按使用场景推荐的配置

以下只是起点,你实际测得的峰值优先于这些建议。

使用场景 容量 配置 说明
IDE、浏览器、少量容器 32 GB 2 × 16 GB 升级时需要同时更换两条
容器、Docker 中的 Kubernetes、并行代理 64 GB 2 × 32 GB 调高 Docker Desktop 或 WSL 的内存上限
多台虚拟机、大型数据库、单体仓库构建 96 到 128 GB 2 × 48 GB 或 2 × 64 GB 保持每通道一条
在 CPU 上卸载部分层的本地 LLM 128 GB 或更多 2 × 64 GB 或更宽的平台 卸载层的速度受带宽限制
无声数据损坏代价高昂 64 GB 或更多,带 ECC AM5 或 W880 上用 ECC UDIMM,Threadripper PRO 或 Xeon 上用 RDIMM 检查 EDAC 计数器
笔记本 32 GB,运行虚拟机选 64 GB LPDDR5X、SO-DIMM 或 LPCAMM2 若为板载内存,购买时一次到位

在双通道台式机上超过 128 GB,就意味着要用四条内存并接受更低的官方频率,而 Threadripper 或 Xeon 可以避免这种取舍。

下单前的实用检查清单

  1. 在一个有代表性的星期里记录内存使用和内存压力,并留出余量。
  2. 用一套包含两条相同内存的套装买齐全部容量。
  3. 查阅 CPU 的内存规格表和主板的内存兼容列表,确认具体类型:UDIMM、CUDIMM、ECC UDIMM 还是 RDIMM。
  4. 按以纳秒计的真实延迟和频率比较套条。
  5. 更新固件;只有准备好测试时才启用 XMP 或 EXPO,并等待内存训练完成。
  6. 分别在默认设置和启用配置文件后运行 memtest86+,然后在系统内做负载测试。
  7. 对于 ECC,先确认平台支持,再在 Linux 中检查 EDAC 计数器。
  8. 对于板载内存的笔记本,购买时就按其使用寿命末期的需求选择容量。
  9. 几个月后重新检查内存压力,尤其是在增加了虚拟机、集群或本地模型之后。

更多文章