Linux 下用 cpuinfo 分析内存控制器的方法
核心思路
- 内存控制器在现代 x86_64 平台通常由 CPU 集成,其拓扑与 NUMA 节点一一对应。通过 lscpu 可直接读出 NUMA node(s),一般可视为内存控制器(或内存通道组)的数量;而 /proc/cpuinfo 提供每个逻辑 CPU 的 physical id、core id、siblings、cpu cores 等字段,可据此判断 Socket 数量 与 超线程,从而间接推断内存通道与内存控制器的布局。注意:/proc/cpuinfo 不直接显示内存频率、通道数、槽位等细节,这些需借助其他工具补充。
从 cpuinfo 推断内存控制器与通道布局
- 基本拓扑
- 物理 CPU 数量:cat /proc/cpuinfo | grep “physical id” | sort -u | wc -l
- 每颗物理 CPU 的核心数:cat /proc/cpuinfo | grep “cpu cores” | uniq
- 逻辑 CPU 数量:cat /proc/cpuinfo | grep “processor” | wc -l
- 超线程判断:若 siblings == cpu cores 则未启用超线程;若 siblings > cpu cores 则启用超线程(每个物理核心对应多个逻辑处理器)。这些字段仅用于 CPU 侧推断,内存控制器数量仍以 NUMA 节点为准。
- 与内存控制器的对应关系
- 内存控制器数量通常 ≈ NUMA node(s)(lscpu 输出),每个 NUMA 节点通常对应一组内存通道与本地内存。
- 在 双路(2×Socket) 常见平台中,若 NUMA node(s)=2,多为每路各集成 1 个内存控制器;若 NUMA node(s)=4,常见为每路 2 个内存控制器(即每路双通道/更多通道的拓扑)。最终仍以主板与 CPU 规格为准。
补充命令与字段解读
- 快速查看内存控制器与拓扑
- 查看 NUMA 与插槽:lscpu(关注 NUMA node(s)、Socket(s)、Thread(s) per core、Core(s) per socket、以及 NUMA node0/1 CPU(s) 的分布)。
- 查看内存硬件细节(型号、频率、槽位):sudo dmidecode -t memory(关注 Size、Type、Speed、Configured Clock Speed、Locator、Bank Locator 等)。
- 查看内存总体使用:cat /proc/meminfo 或 free。
- 关键字段含义
- physical id:物理插槽 ID(同一值属于同一颗物理 CPU)。
- core id:物理核心 ID(同一物理 CPU 内唯一)。
- cpu cores:每颗物理 CPU 的核心数。
- siblings:每颗物理 CPU 的逻辑处理器数(线程数)。
- 关系:总逻辑 CPU = 物理 CPU 数 × 每颗核心数 × 每核线程数。
示例分析
- 示例 A(2 路 24 核/路,HT 开启,NUMA=2)
- lscpu 输出:Socket(s)=2、Core(s) per socket=24、Thread(s) per core=2、NUMA node(s)=2
- 推断:物理 CPU 数 2;每路 24 核/48 线程;2 个 NUMA 节点 ≈ 2 个内存控制器(每路 1 个)。
- 示例 B(2 路 24 核/路,HT 开启,NUMA=4)
- lscpu 输出:Socket(s)=2、Core(s) per socket=24、Thread(s) per core=2、NUMA node(s)=4
- 推断:物理 CPU 数 2;每路 48 线程;4 个 NUMA 节点 ≈ 4 个内存控制器(每路 2 个,常见为每路双通道或更多通道的布局)。