lscpu命令直接显示L1d、L1i、L2、L3缓存大小,如“L1d cache: 48K”“L1i cache: 32K”“L2 cache: 1280K”“L3 cache: 20480K”,单位均为KB,其中L1d/L1i分离表示数据/指令缓存,L3为全核共享总容量。

lscpu 输出里怎么看 L1d、L1i、L2、L3 缓存大小
lscpu 是最直接、最可靠的方式,它从内核缓存拓扑中提取结构化信息,不依赖 BIOS 或用户态解析逻辑。
执行 lscpu 后,你会看到类似这样的行:
L1d cache: 48K L1i cache: 32K L2 cache: 1280K L3 cache: 20480K
注意几点:
-
L1d和L1i是分离的:L1d 是数据缓存(data),L1i 是指令缓存(instruction),现代 x86 CPU 基本都采用哈佛架构变体,所以分开列出 -
L2 cache通常是每个核心私有(per-core)或每簇共享(per-cluster),lscpu不体现归属关系,只报总量/单个单元大小;实际拓扑需结合likwid-topology或cpupower info -e -
L3 cache是所有核心共享的(inclusive 或 non-inclusive),值为总容量,不是每个核心一份 - 单位固定为 K(KB),不会出现 M 或 B —— 即使是 30MB 的 L3,也显示为
30720K
/proc/cpuinfo 的 cache size 字段容易误读
很多人习惯用 grep "cache size" /proc/cpuinfo,但这个字段在不同 CPU 架构和内核版本中含义不一致:
- 在老款 Intel(如 Core 2)或部分 ARM 上,
cache size指的是 L2 缓存大小 - 在较新 Intel/AMD(如 Skylake 及以后),它通常指 L3 缓存大小,且是**每个逻辑 CPU 显示一次**,数值相同,不代表“每个核心都有这么大一份”
- 它**完全不包含 L1d/L1i 分离信息**,也没有 L2 精确值(有时干脆为空)
- 如果你看到
cache size : 6144 KB,这几乎肯定是 L3 总量,不是 L2
所以仅靠 cache size 无法完整还原缓存层级 —— 它是个历史遗留字段,语义模糊,不建议作为唯一依据。
需要区分 per-core 还是 shared?用 likwid-topology
当你要确认某级缓存是每个核心独占、每两个核心共享,还是全核共用时,lscpu 和 /proc/cpuinfo 都不够细。这时候得上 likwid-topology(需提前安装 likwid 包):
Zynq‑7000 / Zynq UltraScale+ 硬件调试技能。适用于 Xilinx Zynq(Cortex‑A9/A53 + FPGA)Linux 环境,调试 I2C、I2S、UART、GPIO 等外设。包括设备树配置、内核驱动、用户空间调试工具、交叉编译和常见问题排查,支持 PetaLinux 开发。
运行 likwid-topology -t,关键输出类似:
+--------------+----------+-----------+------------+ | Level | #Elements| Size (KiB)| #Elements/ | | | | | Socket | +--------------+----------+-----------+------------+ | L1 Data | 24 | 32 | 1 | | L1 Instr. | 24 | 32 | 1 | | L2 | 24 | 512 | 1 | | L3 | 2 | 30720 | 1 | +--------------+----------+-----------+------------+
这里能看出:
- L1d/L1i 是 per-core(24 个 core → 24 个 L1d 单元)
- L2 是 per-core(同上)
- L3 是 per-socket(2 个 socket 共享 30MB,即每个 socket 有自己 30MB L3)
这种粒度对调优 NUMA 绑核、性能建模非常关键,但普通运维查配置一般不需要走到这步。
BIOS 层面的缓存信息可能不准
像 dmidecode -t processor 或 cpuid 这类工具,会尝试从固件或 CPUID 指令中读取缓存描述,但存在几个现实问题:
- 某些 OEM BIOS 会把 L3 缓存大小填错(比如写成 0 或默认值),尤其在虚拟机中更常见
-
cpuid输出的 cache descriptor 是原始十六进制位域,普通人很难直接 decode 出 L1d/L1i 大小 -
dmidecode中的Max Speed、Current Speed和缓存无关,别被字段名误导 - 虚拟化环境下(VMware/KVM),
dmidecode和cpuid可能返回的是 hypervisor 模拟的值,而非物理硬件真实值
所以除非你在做固件验证或底层驱动开发,否则不要优先信任这些命令的缓存输出。
真正稳定、可脚本化的方案只有两个:lscpu 看基础层级大小,likwid-topology 看归属关系。其它方式要么信息残缺,要么环境依赖太强。

















