Linux CPUInfo 缓存信息解读
一 核心概念与层级
- 现代处理器采用多级缓存:L1、L2、L3。
- L1 最靠近核心、速度最快,通常分为 L1d(数据) 与 L1i(指令),常见每核约 32–64 KB。
- L2 容量更大、速度次之,通常为每核私有,约 256 KB–1 MB。
- L3 容量最大、速度更慢,通常为多核共享,约 几 MB 到几十 MB。
- 缓存以**缓存行(Cache Line)**为单位管理,x86/ARM 常见为 64 字节,对数据布局与访问模式影响很大。
- 缓存一致性在多核间通常通过如 MESI 等协议维护,减少互相失效带来的性能波动。
二 在 Linux 中查看缓存信息的常用方式
- 查看整体与每级缓存概览
- 使用 lscpu:可直接显示 L1d/L1i、L2、L3 各级大小,便于快速核对。
- 使用 cat /proc/cpuinfo:关注字段 cache size(总缓存大小,通常对应 L3)、以及 clflush size / cache_alignment(常见为 64,即缓存行字节数)。
- 查看各级缓存的详细参数(索引、类型、大小、组相联度、行大小)
- 进入 /sys/devices/system/cpu/cpu0/cache/,每个 indexX 目录代表一级缓存:
- 读 level、type、size 了解层级与容量;
- 读 number_of_sets、ways_of_associativity、coherency_line_size 了解组数、路数、行大小;
- 可用公式验证:行大小 = size / (number_of_sets × ways_of_associativity)。
- 其他补充
- dmesg | grep cache 可查看内核探测到的缓存信息;
- dmidecode -t cache 可查看 DMI/SMBIOS 记录的缓存描述(部分平台更详细)。
三 读懂 /proc/cpuinfo 中的关键字段
- cache size:处理器可见的总缓存容量,常见为 L3 大小;不同架构/内核可能表现不同,需结合 lscpu 或 sysfs 核对。
- clflush size / cache_alignment:通常为 64,表示缓存行字节数与内存访问对齐粒度。
- 注意:L1d/L1i、L2 在 /proc/cpuinfo 中不一定单列显示,需借助 lscpu 或 /sys 接口查看。
四 一个可复现的示例
- 查看 L1d/L1i、L2、L3:
- lscpu 输出示例:
- L1d cache: 32K
- L1i cache: 32K
- L2 cache: 256K
- L3 cache: 8192K
- 查看 L1d 的详细参数并计算行大小:
- cat /sys/devices/system/cpu/cpu0/cache/index0/{level,type,size,number_of_sets,ways_of_associativity,coherency_line_size}
- 若输出为:level=1, type=Data, size=32K, number_of_sets=64, ways_of_associativity=8, coherency_line_size=64,
- 则行大小 = 32×1024 / (64×8) = 64 bytes(与 coherency_line_size 一致)。
五 常见误区与排查建议
- 误区一:把 cache size 当作 L1/L2 大小。多数情况下它反映的是 L3(或“总缓存”),应以 lscpu 或 /sys 为准。
- 误区二:忽视 共享/私有 属性。L3 通常为多核共享,L1/L2 多为每核私有(具体以 CPU 架构为准)。
- 误区三:缓存行不是 32 字节。x86/ARM 常见为 64 字节,对结构体对齐、数组步长、数据热区布局影响显著。
- 排查建议:当 /proc/cpuinfo 信息不足时,优先用 lscpu 与 /sys/devices/system/cpu/cpu0/cache/ 交叉核对,必要时再用 dmidecode -t cache 补充。