lscpu 中 L1d cache、L1i cache、L2 cache、L3 cache 字段分别对应每个核心的 L1 数据缓存、L1 指令缓存、私有 L2 缓存和共享 L3 缓存容量,数值为单核或全芯片总值(L3 为总容量),非累加关系。

lscpu 输出里哪些字段对应 L1/L2/L3 缓存大小
lscpu 不直接标出 “L1i”“L1d”“L2”“L3” 这类术语,而是用 L1d cache、L1i cache、L2 cache、L3 cache 字段呈现。这些值是**每个逻辑核心(或每个核芯)独占/共享的缓存容量**,不是整颗 CPU 的总和。
注意:L1d 是数据缓存,L1i 是指令缓存;多数现代 x86 CPU 采用分离式设计,所以两者数值常不同(如 L1d cache: 32K, L1i cache: 32K)。L2 cache 通常是每个物理核心私有,L3 cache 则是所有核心共享(也叫“last-level cache”)。
常见误读点:
- 看到
L3 cache: 36M就以为整颗 CPU 只有 36MB —— 实际就是总 L3 容量,没错;但别把它和 L1/L2 相加,层级之间不线性叠加 -
Cache line size是缓存块大小(通常 64 字节),影响内存访问对齐效率,不是缓存容量 - 某些 ARM 或老款 CPU 可能不显示
L1i字段,或合并为L1 cache,此时需查手册确认是否统一
如何从 lscpu 推断 CPU 物理拓扑(Socket / Core / Thread)
lscpu 中最关键的拓扑字段是:Socket(s)、Core(s) per socket、Thread(s) per core 和 CPU(s)。它们满足关系:CPU(s) = Socket(s) × Core(s) per socket × Thread(s) per core。
例如输出为:
CPU(s): 64 Socket(s): 2 Core(s) per socket: 16 Thread(s) per core: 2
说明:2 路服务器,每路 16 核,开启超线程 → 每核 2 线程 → 共 64 个逻辑 CPU。
容易踩的坑:
-
Core(s) per socket是“每个插槽的物理核心数”,不是“每个线程的核心数”——别和Thread(s) per core搞反 - 在虚拟机中运行
lscpu时,Socket(s)可能被虚拟化层伪造(如 QEMU 把 16 核虚拟成 2×8),此时数值反映的是 vCPU 分配策略,非真实硬件 -
NUMA node(s)字段若大于 1,说明存在 NUMA 域,L3 cache通常按 NUMA node 划分(如 AMD EPYC 的 CCD 结构),这时L3 cache值代表每个 NUMA node 内的容量
为什么 lscpu 不显示缓存关联度(associativity)和延迟?
lscpu 依赖内核通过 CPUID 指令读取的静态拓扑信息,而缓存的组相联度(如 8-way set associative)、行数、预取行为、实际访问延迟等属于微架构细节,Linux 内核默认不暴露,lscpu 也就无从显示。
如果你需要这些:
- 查 Intel/AMD 官方文档(如 Intel SDM Vol. 3B 的 “Cache and TLB Characteristics” 表)—— 最权威,但得手动匹配 CPU 型号(
CPU family+Model字段) - 用
cpupower info -e(需 root)看部分扩展信息,但支持有限 - 跑 microbenchmark(如
cachebench或自己用clflush+rdtsc)测延迟,但这已超出lscpu能力范围
简单说:lscpu 告诉你“有多大”和“怎么分”,不告诉你“怎么组织”和“跑多快”。
对比 lscpu 和 /sys/devices/system/cpu/ 下的原始数据
lscpu 是对 /sys/devices/system/cpu/ 和 /proc/cpuinfo 的聚合展示,但后者更细、更底层。比如:
-
/sys/devices/system/cpu/cpu0/topology/core_siblings_list显示与 cpu0 同属一个物理核心的所有逻辑 CPU 编号 -
/sys/devices/system/cpu/cpu0/cache/index*/下有完整缓存层级目录(index0=L1d,index1=L1i,index2=L2…),含level、coherency_line_size、number_of_sets、ways_of_associativity等字段 - 这些 sysfs 条目才是获取关联度、缓存行数等信息的真实来源,
lscpu只做了简化摘要
所以当你要写调度器适配逻辑、做 NUMA 绑核或分析 cache thrashing,别只信 lscpu 输出——得下钻到 /sys/devices/system/cpu/cpu*/cache/ 里翻原始数据。


















