lscpu 命令详解与参数实测(Ubuntu 22.04)

lscpu 命令逐参数实测详解:默认全输出逐段解读(架构/拓扑/NUMA/缓存/虚拟化/漏洞缓解)、-p 与 -e 拓扑视图及自定义列、-b/-c 在线离线筛选、-x 十六进制掩码、-B 字节显示、-C 缓存明细、-s sysroot、-J JSON,并实证 CPU(s)=Thread×Core×Socket 换算与 /proc/cpuinfo、nproc 三方对照,全部回显在 Ubuntu 22.04(util-linux 2.37.2)实测通过。

Linux命令Linux系统UbuntuUbuntu 22.04命令行系统信息2026/10/15

lscpu 命令详解与参数实测(Ubuntu 22.04)

目标:全面掌握 lscpu 的每一个常用参数——默认全输出逐段解读、-p 可解析 CSV、-e 扩展视图、-b/-c 在线离线筛选、-x 十六进制掩码、-B 字节显示、-C 缓存明细、-s 自定义 sysroot、-J JSON 输出,并实证 CPU(s) = Thread × Core × Socket 拓扑换算,与 /proc/cpuinfo、nproc 三方对照,全部命令与回显已在 Ubuntu 22.04(util-linux 2.37.2)实测通过。

一、环境信息

  • 操作系统:Ubuntu 22.04.5 LTS(x86_64,内核 6.8.0-138-generic)
  • lscpu 版本:util-linux 2.37.2(lscpu --version 实测;Ubuntu 22.04 中 lscpu 由 util-linux 包提供,dpkg -S /usr/bin/lscpu 可验证)
  • util-linux 包版本:2.37.2-4ubuntu3.6(dpkg -l util-linux 实测)
  • lscpu 随 util-linux 基础工具集默认预装,无需额外安装
  • 实测机 CPU 形态:12 个逻辑 CPU(1 颗物理 CPU × 12 核 × 每核 1 线程,BIOS/固件视角),L1d 576 KiB / L1i 384 KiB / L2 24 MiB / L3 33 MiB,1 个 NUMA 节点
  • 演示数据目录:/root/demo/lscpu/(存放 -p 导出的拓扑 CSV)

二、命令概览

2.1 语法与测试数据准备

lscpu 的基本语法是 lscpu [options]:不带任何参数时,输出 CPU 架构的完整摘要——包括架构、运行模式、字节序、逻辑 CPU 数量、厂商与型号、每核线程数、缓存层次、NUMA 拓扑、虚拟化形态与 CPU 漏洞缓解状态。lscpu 的数据来源是内核 sysfs(/sys/devices/system/cpu/)与 /proc/cpuinfo,属于只读展示命令,不修改任何系统状态。

lscpu 不需要专门的演示数据,本篇使用 -p 把拓扑导出为 CSV 作为演示数据文件,供后续用 column 等工具二次加工:

mkdir -p /root/demo/lscpu
lscpu -p > /root/demo/lscpu/topology.csv

2.2 --help 全量输出

lscpu --help 列出全部参数与 -e/-p/-C 三种视图可用的列名(实测原样保留,可作为参数速查):

Usage:
 lscpu [options]

Display information about the CPU architecture.

Options:
 -a, --all               print both online and offline CPUs (default for -e)
 -b, --online            print online CPUs only (default for -p)
 -B, --bytes             print sizes in bytes rather than in human readable format
 -C, --caches[=<list>]   info about caches in extended readable format
 -c, --offline           print offline CPUs only
 -J, --json              use JSON for default or extended format
 -e, --extended[=<list>] print out an extended readable format
 -p, --parse[=<list>]    print out a parsable format
 -s, --sysroot <dir>     use specified directory as system root
 -x, --hex               print hexadecimal masks rather than lists of CPUs
 -y, --physical          print physical instead of logical IDs
     --output-all        print all available columns for -e, -p or -C

 -h, --help              display this help
 -V, --version           display version

Available output columns for -e or -p:
      BOGOMIPS  crude measurement of CPU speed
           CPU  logical CPU number
          CORE  logical core number
        SOCKET  logical socket number
       CLUSTER  logical cluster number
          NODE  logical NUMA node number
          BOOK  logical book number
         DRAWER  logical drawer number
         CACHE  shows how caches are shared between CPUs
  POLARIZATION  CPU dispatching mode on virtual hardware
       ADDRESS  physical address of a CPU
    CONFIGURED  shows if the hypervisor has allocated the CPU
        ONLINE  shows if Linux currently makes use of the CPU
           MHZ  shows the currently MHz of the CPU
        MAXMHZ  shows the maximum MHz of the CPU
        MINMHZ  shows the minimum MHz of the CPU

Available output columns for -C:
      ALL-SIZE  size of all system caches
         LEVEL  cache level
          NAME  cache name
      ONE-SIZE  size of one cache
          TYPE  cache type
          WAYS  ways of associativity
  ALLOC-POLICY  allocation policy
  WRITE-POLICY  write policy
      PHY-LINE  number of physical cache line per cache t
          SETS  number of sets in the cache; set lines has the same cache index
 COHERENCY-SIZE  minimum amount of data in bytes transferred from memory to cache

For more details see lscpu(1).

💡 说明:lscpu 的参数分三类——输出格式切换(默认人读格式 / -e 扩展表 / -p CSV / -C 缓存表 / -J JSON)、范围筛选(-a 全部 / -b 仅在线 / -c 仅离线,三者只能配合 -e/-p 使用)、显示控制(-x 十六进制掩码、-B 字节数、-y 物理 ID、-s 指定 sysroot)。帮助尾段给出 -e/-p 可用的 16 个列名与 -C 可用的 11 个列名,本文 3.2~3.11 逐一实测。

2.3 版本信息

$ lscpu --version
lscpu from util-linux 2.37.2
$ dpkg -S /usr/bin/lscpu
util-linux: /usr/bin/lscpu

💡 提示:Ubuntu 22.04 的 lscpu 由 util-linux 包提供(2.37.2)。同属 procps 包的 ps、top 等工具与 lscpu 无关,排查 lscpu 版本问题时不要找错包。

三、参数逐项实测

3.1 默认输出:逐段解读

不带参数运行 lscpu,一次性给出 CPU 的架构、拓扑、缓存、NUMA、虚拟化与安全缓解信息(实测全文):

$ lscpu
Architecture:                            x86_64
CPU op-mode(s):                          32-bit, 64-bit
Address sizes:                           45 bits physical, 48 bits virtual
Byte Order:                              Little Endian
CPU(s):                                  12
On-line CPU(s) list:                     0-11
Vendor ID:                               GenuineIntel
Model name:                              Intel(R) Core(TM) i7-14700KF
CPU family:                              6
Model:                                   183
Thread(s) per core:                      1
Core(s) per socket:                      12
Socket(s):                               1
Stepping:                                1
BogoMIPS:                                6835.20
Flags:                                   fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ss ht syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon rep_good nopl xtopology tsc_reliable nonstop_tsc cpuid tsc_known_freq pni pclmulqdq ssse3 fma cx16 pcid sse4_1 sse4_2 x2apic movbe popcnt aes xsave avx f16c rdrand hypervisor lahf_lm abm 3dnowprefetch pti ssbd ibrs ibpb stibp fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid rdseed adx smap clflushopt clwb sha_ni xsaveopt xsavec xgetbv1 xsaves avx_vnni arat umip gfni vaes vpclmulqdq rdpid movdiri movdir64b fsrm md_clear serialize flush_l1d arch_capabilities
Hypervisor vendor:                       VMware
Virtualization type:                     full
L1d cache:                               576 KiB (12 instances)
L1i cache:                               384 KiB (12 instances)
L2 cache:                                24 MiB (12 instances)
L3 cache:                                33 MiB (1 instance)
NUMA node(s):                            1
NUMA node0 CPU(s):                       0-11
Vulnerability Gather data sampling:      Not affected
Vulnerability Indirect target selection: Mitigation; Aligned branch/return thunks
Vulnerability Itlb multihit:             Not affected
Vulnerability L1tf:                      Mitigation; PTE Inversion
Vulnerability Mds:                       Mitigation; Clear CPU buffers; SMT Host state unknown
Vulnerability Meltdown:                  Mitigation; PTI
Vulnerability Mmio stale data:           Unknown: No mitigations
Vulnerability Reg file data sampling:    Vulnerable: No microcode
Vulnerability Retbleed:                  Mitigation; IBRS
Vulnerability Spec rstack overflow:      Not affected
Vulnerability Spec store bypass:         Mitigation; Speculative Store Bypass disabled via prctl
Vulnerability Spectre v1:                Mitigation; usercopy/swapgs barriers and __user pointer sanitization
Vulnerability Spectre v2:                Mitigation; IBRS; IBPB conditional; STIBP disabled; RSB filling; PBRSB-eIBRS Not affected; BHI SW loop, KVM SW loop
Vulnerability Srbds:                     Not affected
Vulnerability Tsa:                       Not affected
Vulnerability Tsx async abort:           Not affected
Vulnerability Vmscape:                   Not affected

逐段解读:

  • Architecture / CPU op-mode(s) / Byte Order:架构 x86_64;同时支持 32 位与 64 位运行模式;字节序为小端(Little Endian,低位字节存低地址,x86 家族的固定特征)。
  • Address sizes:物理地址 45 位(可寻址 32 TiB 内存)、虚拟地址 48 位,由 CPUID 指令报告。
  • CPU(s) / On-line CPU(s) list:逻辑 CPU 总数 12,当前全部在线(编号 0-11)。注意 CPU(s) 统计的是逻辑 CPU(硬件线程),不是物理核数。
  • Vendor ID / Model name / family / Model / Stepping:厂商 GenuineIntel,型号 i7-14700KF,family 6、Model 183、Stepping 1 共同构成 CPU 的精确标识,微码(microcode)更新按这三个值匹配。
  • Thread(s) per core / Core(s) per socket / Socket(s):拓扑三要素。本机每核 1 线程、每颗 CPU 12 核、共 1 颗 CPU。
  • BogoMIPS:内核启动时估算的粗略速度指标,只能做粗略参考,不能当性能基准。
  • Flags:CPU 支持的指令集与特性标志。ht 表示支持超线程,hypervisor 表示运行在 hypervisor 之上,avx2/aes/sha_ni 等是加解密与向量化计算常用的指令集扩展,编译优化与软件选型(如 OpenSSL 引擎选择)时会参考。
  • Hypervisor vendor / Virtualization type:宿主虚拟化平台为 VMware,虚拟化类型 full(完整虚拟化)。
  • L1d / L1i / L2 / L3 cache:四级缓存。L1d(数据)576 KiB、L1i(指令)384 KiB 均为每核独享的 12 个实例;L2 24 MiB(12 实例,每核独享 2 MiB);L3 33 MiB 为全 CPU 共享的 1 个实例。instances 括号里的数字就是缓存在拓扑中的份数。
  • NUMA node(s) / NUMA node0 CPU(s):1 个 NUMA 节点,全部 CPU 都归属 node0。多路服务器会看到多个节点,此时把进程与内存绑定到同一节点能显著降低跨节点访存延迟。
  • Vulnerability 系列:CPU 硬件漏洞(Meltdown、Spectre、MDS、Retbleed 等)的当前缓解状态,Mitigation 表示已启用缓解、Not affected 表示不受影响、Vulnerable 表示存在风险未缓解。安全巡检时这一段值得逐行核对。

💡 提示:本机默认输出没有 CPU MHz、CPU max MHz、CPU min MHz 三行——这三行依赖内核 cpufreq 子系统的 sysfs 接口,本机未暴露 cpufreq 信息。想看频率时可用 -e=cpu,mhz,maxmhz,minmhz 显式取列(见 3.3),其中 MAX/MIN 列同样显示 -,只有标称频率可读。

3.2 -p:可解析 CSV 格式

-p(--parse)输出面向程序解析的 CSV:以 # 开头的是注释行(说明列含义),其余每行一个逻辑 CPU。不带列清单时输出默认列集:

$ lscpu -p
# The following is the parsable format, which can be fed to other
# programs. Each different item in every column has an unique ID
# starting usually from zero.
# CPU,Core,Socket,Node,,L1d,L1i,L2,L3
0,0,0,0,,0,0,0,0
1,1,0,0,,1,1,1,0
2,2,0,0,,2,2,2,0
3,3,0,0,,3,3,3,0
4,4,0,0,,4,4,4,0
5,5,0,0,,5,5,5,0
6,6,0,0,,6,6,6,0
7,7,0,0,,7,7,7,0
8,8,0,0,,8,8,8,0
9,9,0,0,,9,9,9,0
10,10,0,0,,10,10,10,0
11,11,0,0,,11,11,11,0

逐列解读:CPU(逻辑 CPU 编号)、Core(核编号)、Socket(CPU 插槽编号)、Node(NUMA 节点编号)之后有一列空位(保留列),最后四列 L1d、L1i、L2、L3 给出该 CPU 对应的缓存实例编号,编号相同即共享同一缓存。本机每行的 Core 与 CPU 编号一一相等、四列缓存编号也全部相同,说明 12 个逻辑 CPU 各占一个物理核、缓存无共享。

-p 支持用 = 追加自定义列清单(列名大小写不敏感):

$ lscpu -p=cpu,core,socket,online
# The following is the parsable format, which can be fed to other
# programs. Each different item in every column has an unique ID
# starting usually from zero.
# CPU,Core,Socket,Online
0,0,0,Y
1,1,0,Y
2,2,0,Y
3,3,0,Y
4,4,0,Y
5,5,0,Y
6,6,0,Y
7,7,0,Y
8,8,0,Y
9,9,0,Y
10,10,0,Y
11,11,0,Y

Online 列取值 Y/N,比 -e 视图的 yes/no 更适合脚本判断。统计逻辑 CPU 数量时用 grep -vc '^#' 过滤注释行:

$ lscpu -p | grep -vc '^#'
12

💡 要点:写运维脚本解析拓扑时优先用 -p 而不是 -e——-e 是对齐列宽的表格,-p 是纯 CSV,awk -F, 直接可切。注释行务必用 grep -v '^#' 过滤。

3.3 -e:扩展可读视图与 -e= 自定义列

-e(--extended)输出对齐的表格视图,默认列集为 CPU、NODE、SOCKET、CORE、L1d:L1i:L2:L3(共享缓存编号组)、ONLINE:

$ lscpu -e
CPU NODE SOCKET CORE L1d:L1i:L2:L3 ONLINE
  0    0      0    0 0:0:0:0          yes
  1    0      0    1 1:1:1:0          yes
  2    0      0    2 2:2:2:0          yes
  3    0      0    3 3:3:3:0          yes
  4    0      0    4 4:4:4:0          yes
  5    0      0    5 5:5:5:0          yes
  6    0      0    6 6:6:6:0          yes
  7    0      0    7 7:7:7:0          yes
  8    0      0    8 8:8:8:0          yes
  9    0      0    9 9:9:9:0          yes
 10    0      0   10 10:10:10:0       yes
 11    0      0   11 11:11:11:0       yes

-e= 后跟空列清单时不输出任何内容(实测,便于脚本判断空集):

$ lscpu -e=

-e= 跟上合法列名清单即可定制视图,列顺序按指定顺序输出:

$ lscpu -e=cpu,node,core,socket,online
CPU NODE CORE SOCKET ONLINE
  0    0    0      0    yes
  1    0    1      0    yes
  2    0    2      0    yes
  3    0    3      0    yes
  4    0    4      0    yes
  5    0    5      0    yes
  6    0    6      0    yes
  7    0    7      0    yes
  8    0    8      0    yes
  9    0    9      0    yes
 10    0   10      0    yes
 11    0   11      0    yes

用频率列可以绕开"默认输出没有 MHz 行"的问题——MHZ 取自 /proc/cpuinfo 的标称频率,MAXMHZ/MINMHZ 依赖 cpufreq,本机不可用故显示 -:

$ lscpu -e=cpu,mhz,maxmhz,minmhz
CPU      MHZ MAXMHZ MINMHZ
  0 3417.600      -      -
  1 3417.600      -      -
  2 3417.600      -      -
  3 3417.600      -      -
  4 3417.600      -      -
  5 3417.600      -      -
  6 3417.600      -      -
  7 3417.600      -      -
  8 3417.600      -      -
  9 3417.600      -      -
 10 3417.600      -      -
 11 3417.600      -      -

列名写错会直接报错并指出是哪一列:

$ lscpu -e=cpu,node,core,socket,online,maxmhzmhz
lscpu: unknown column: maxmhzmhz

💡 要点:合法列名以 --help 中 "Available output columns for -e or -p" 清单为准(MHZ/MAXMHZ/MINMHZ,不存在 maxmhzmhz)。-e= 与 -p= 语法相同,仅输出形态不同。

3.4 -b / -c:只看在线 / 只看离线 CPU

-b(--online)与 -c(--offline)用于按 CPU 在线状态筛选。注意:这两个参数不能单独使用,必须配合 -e 或 -p,单独给出会报错(实测):

$ lscpu -b
lscpu: options --all, --online and --offline may only be used with options --extended or --parse.

$ lscpu -c
lscpu: options --all, --online and --offline may only be used with options --extended or --parse.

本机 12 个 CPU 全部在线,-b -e 与默认 -e 输出一致:

$ lscpu -b -e
CPU NODE SOCKET CORE L1d:L1i:L2:L3 ONLINE
  0    0      0    0 0:0:0:0          yes
  1    0      0    1 1:1:1:0          yes
  2    0      0    2 2:2:2:0          yes
  3    0      0    3 3:3:3:0          yes
  4    0      0    4 4:4:4:0          yes
  5    0      0    5 5:5:5:0          yes
  6    0      0    6 6:6:6:0          yes
  7    0      0    7 7:7:7:0          yes
  8    0      0    8 8:8:8:0          yes
  9    0      0    9 9:9:9:0          yes
 10    0      0   10 10:10:10:0       yes
 11    0      0   11 11:11:11:0       yes

离线筛选 -c -e 因离线 CPU 为空而输出空表:

$ lscpu -c -e

💡 提示:CPU 在线/离线由内核热插拔状态决定(/sys/devices/system/cpu/cpuN/online)。生产环境用 echo 0 > /sys/devices/system/cpu/cpu11/online 下线一颗 CPU 后,lscpu -c -e 就会列出 cpu11,可用于验证热移除是否生效。

3.5 -x:十六进制掩码显示

-x(--hex)把默认输出中的 CPU 列表改成位掩码形式。对照 3.1,变化的两行是 On-line CPU(s) list 与 NUMA node0 CPU(s)——0-11 变成掩码 fff(12 个位全 1):

$ lscpu -x | grep -E 'CPU\(s\)|On-line|NUMA'
CPU(s):                                  12
On-line CPU(s) mask:                     fff
NUMA node(s):                            1
NUMA node0 CPU(s):                       fff

掩码在 CPU 数量大时比长列表紧凑,也便于和 cpuset、taskset 的位掩码直接对照。-x 对 -e 视图无影响:

$ lscpu -x -e
CPU NODE SOCKET CORE L1d:L1i:L2:L3 ONLINE
  0    0      0    0 0:0:0:0          yes
  1    0      0    1 1:1:1:0          yes
  2    0      0    2 2:2:2:0          yes
  3    0      0    3 3:3:3:0          yes
  4    0      0    4 4:4:4:0          yes
  5    0      0    5 5:5:5:0          yes
  6    0      0    6 6:6:6:0          yes
  7    0      0    7 7:7:7:0          yes
  8    0      0    8 8:8:8:0          yes
  9    0      0    9 9:9:9:0          yes
 10    0      0   10 10:10:10:0       yes
 11    0      0   11 11:11:11:0       yes

💡 要点:0xfff = 12 个二进制 1,与 taskset -pc 0 报告的掩码同构。CPU 超过 32 颗时掩码按 32 位一组逗号分隔(低位组在右)。

3.6 -B:缓存大小以字节显示

-B(--bytes)把缓存容量从人类可读单位(KiB/MiB)改成原始字节数,方便程序直接比较:

$ lscpu -B | grep -E 'L1d|L1i|L2|L3'
L1d cache:                               589824 (12 instances)
L1i cache:                               393216 (12 instances)
L2 cache:                                25165824 (12 instances)
L3 cache:                                34603008 (1 instance)

与 3.1 默认输出对照:576 KiB = 589824 字节、384 KiB = 393216 字节、24 MiB = 25165824 字节、33 MiB = 34603008 字节,数值完全一致,仅单位不同。

💡 要点:监控脚本要对缓存做阈值判断时用 -B 拿到纯数字,省去单位换算;人工阅读用默认的 KiB/MiB 更直观。

3.7 -C:缓存明细表

-C(--caches)以表格形式列出各级缓存的完整参数,比默认输出里的四行摘要信息量大得多:

$ lscpu -C
NAME ONE-SIZE ALL-SIZE WAYS TYPE        LEVEL  SETS PHY-LINE COHERENCY-SIZE
L1d       48K     576K   12 Data            1    64        1             64
L1i       32K     384K    8 Instruction     1    64        1             64
L2         2M      24M   16 Unified         2  2048        1             64
L3        33M      33M   11 Unified         3 49152        1             64

逐列解读:NAME(缓存名)、ONE-SIZE(单个缓存实例容量)、ALL-SIZE(同类缓存总量)、WAYS(相联度)、TYPE(Data/Instruction/Unified)、LEVEL(1/2/3 级)、SETS(组数)、PHY-LINE(物理缓存行数)、COHERENCY-SIZE(缓存行 64 字节)。以 L1d 为例:单实例 48K、共 12 份、12 路相联、64 组、缓存行 64 字节——48K = 64 组 × 12 路 × 64 字节/行,缓存几何参数完全对得上。

💡 要点:做缓存行对齐(避免伪共享,false sharing)时最关心 COHERENCY-SIZE 一列——64 字节的缓存行意味着并发数据结构应按 64 字节边界隔离。

3.8 -s:指定 sysroot 读取别的系统的 CPU 信息

-s(--sysroot)把 <目录>/sys/devices/system/cpu 当作数据源,用于收集另一套系统(如挂载的救援盘、系统镜像)的 CPU 信息。指向本机根目录时输出与默认一致:

$ lscpu -s /
Architecture:                            x86_64
CPU op-mode(s):                          32-bit, 64-bit
Address sizes:                           45 bits physical, 48 bits virtual
Byte Order:                              Little Endian
CPU(s):                                  12
On-line CPU(s) list:                     0-11
Vendor ID:                               GenuineIntel
Model name:                              Intel(R) Core(TM) i7-14700KF
CPU family:                              6
Model:                                   183
Thread(s) per core:                      1
Core(s) per socket:                      12
Socket(s):                               1
Stepping:                                1
BogoMIPS:                                6835.20
Flags:                                   fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ss ht syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon rep_good nopl xtopology tsc_reliable nonstop_tsc cpuid tsc_known_freq pni pclmulqdq ssse3 fma cx16 pcid sse4_1 sse4_2 x2apic movbe popcnt aes xsave avx f16c rdrand hypervisor lahf_lm abm 3dnowprefetch pti ssbd ibrs ibpb stibp fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid rdseed adx smap clflushopt clwb sha_ni xsaveopt xsavec xgetbv1 xsaves avx_vnni arat umip gfni vaes vpclmulqdq rdpid movdiri movdir64b fsrm md_clear serialize flush_l1d arch_capabilities
L1d cache:                               576 KiB (12 instances)
L1i cache:                               384 KiB (12 instances)
L2 cache:                                24 MiB (12 instances)
L3 cache:                                33 MiB (1 instance)
NUMA node(s):                            1
NUMA node0 CPU(s):                       0-11
Vulnerability Gather data sampling:      Not affected
Vulnerability Indirect target selection: Mitigation; Aligned branch/return thunks
Vulnerability Itlb multihit:             Not affected
Vulnerability L1tf:                      Mitigation; PTE Inversion
Vulnerability Mds:                       Mitigation; Clear CPU buffers; SMT Host state unknown
Vulnerability Meltdown:                  Mitigation; PTI
Vulnerability Mmio stale data:           Unknown: No mitigations
Vulnerability Reg file data sampling:    Vulnerable: No microcode
Vulnerability Retbleed:                  Mitigation; IBRS
Vulnerability Spec rstack overflow:      Not affected
Vulnerability Spec store bypass:         Mitigation; Speculative Store Bypass disabled via prctl
Vulnerability Spectre v1:                Mitigation; usercopy/swapgs barriers and __user pointer sanitization
Vulnerability Spectre v2:                Mitigation; IBRS; IBPB conditional; STIBP disabled; RSB filling; PBRSB-eIBRS Not affected; BHI SW loop, KVM SW loop
Vulnerability Srbds:                     Not affected
Vulnerability Tsa:                       Not affected
Vulnerability Tsx async abort:           Not affected
Vulnerability Vmscape:                   Not affected

💡 提示:与 3.1 逐行对照,仅 Hypervisor vendor 与 Virtualization type 两行未输出——这两行来自虚拟化探测,sysroot 模式下不启用;其余字段完全一致。sysroot 目录下不存在 sysfs 结构时直接报错退出:

$ lscpu -s /nonexistent-dir
lscpu: failed to determine number of CPUs: /sys/devices/system/cpu/possible: No such file or directory

3.9 -J:JSON 格式输出

-J(--json)把默认摘要输出为 JSON 数组,每个字段是一个 {"field": ..., "data": ...} 对象,可直接交给 jq 等工具消费(实测输出节选,首尾结构一致):

$ lscpu -J
{
   "lscpu": [
      {
         "field": "Architecture:",
         "data": "x86_64"
      },{
         "field": "CPU op-mode(s):",
         "data": "32-bit, 64-bit"
      },{
         "field": "Address sizes:",
         "data": "45 bits physical, 48 bits virtual"
      },{
         "field": "Byte Order:",
         "data": "Little Endian"
      },{
         "field": "CPU(s):",
         "data": "12"
      },{
         "field": "On-line CPU(s) list:",
         "data": "0-11"
      },{
         "field": "Vendor ID:",
         "data": "GenuineIntel"
      },{
         "field": "Model name:",
         "data": "Intel(R) Core(TM) i7-14700KF"
      },{
         "field": "CPU family:",
         "data": "6"
      },{
         "field": "Model:",
         "data": "183"
      },{
         "field": "Thread(s) per core:",
         "data": "1"
      },{
         "field": "Core(s) per socket:",
         "data": "12"
      },{
         "field": "Socket(s):",
         "data": "1"
      },{
         "field": "Stepping:",
         "data": "1"
      },{
         "field": "BogoMIPS:",
         "data": "6835.20"
      },{
         "field": "Flags:",
         "data": "fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ss ht syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon rep_good nopl xtopology tsc_reliable nonstop_tsc cpuid tsc_known_freq pni pclmulqdq ssse3 fma cx16 pcid sse4_1 sse4_2 x2apic movbe popcnt aes xsave avx f16c rdrand hypervisor lahf_lm abm 3dnowprefetch pti ssbd ibrs ibpb stibp fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid rdseed adx smap clflushopt clwb sha_ni xsaveopt xsavec xgetbv1 xsaves avx_vnni arat umip gfni vaes vpclmulqdq rdpid movdiri movdir64b fsrm md_clear serialize flush_l1d arch_capabilities"
      }
   ]
}

💡 说明:实测输出节选——JSON 结构与默认文本完全对应,后面还依次包含 Hypervisor vendor、Virtualization type、四行缓存、NUMA 与全部 Vulnerability 字段,此处截断。-J 也可与 -e 联用输出 JSON 表格。

3.10 -y:物理 ID 视角

-y(--physical)让 -e/-p 输出物理 ID 而非内核逻辑 ID。本机每核一线程、逻辑编号与物理编号一致,因此输出与 3.3 的 -e 相同:

$ lscpu -y -e
CPU NODE SOCKET CORE L1d:L1i:L2:L3 ONLINE
  0    0      0    0 0:0:0:0          yes
  1    0      0    1 1:1:1:0          yes
  2    0      0    2 2:2:2:0          yes
  3    0      0    3 3:3:3:0          yes
  4    0      0    4 4:4:4:0          yes
  5    0      0    5 5:5:5:0          yes
  6    0      0    6 6:6:6:0          yes
  7    0      0    7 7:7:7:0          yes
  8    0      0    8 8:8:8:0          yes
  9    0      0    9 9:9:9:0          yes
 10    0      0   10 10:10:10:0       yes
 11    0      0   11 11:11:11:0       yes

💡 要点:在开启超线程且 CPU 编号交错分布的机器上(如 2 颗 8 核 16 线程的 CPU,物理核 0 的两个线程是 cpu0 和 cpu8),-y 会把同核的两个线程映射到同一个物理核编号,与 /sys/devices/system/cpu/cpuN/topology/core_id 直接对应,是核对 SMT 绑定关系的依据。

3.11 --output-all:输出全部列

--output-all 一次性输出 -e/-p/-C 视图可用的全部列(列宽很大,实测节选首尾):

$ lscpu --output-all
Architecture:                            x86_64
CPU op-mode(s):                          32-bit, 64-bit
Address sizes:                           45 bits physical, 48 bits virtual
Byte Order:                              Little Endian
CPU(s):                                  12
(中略:与默认输出相同的全部字段,直至最后的 Vulnerability 系列)
Vulnerability Tsa:                       Not affected
Vulnerability Tsx async abort:           Not affected
Vulnerability Vmscape:                   Not affected

💡 说明:不带 -e/-p/-C 时 --output-all 等价于默认摘要的全量字段;与 -e --output-all 联用则输出 16 个拓扑列。逐字段含义以 --help 列名清单为准。

3.12 三方对照:lscpu 与 /proc/cpuinfo、nproc

三个工具都能回答"这台机器有几个逻辑 CPU",但数据源与口径不同,实测逐一对照:

$ grep -c processor /proc/cpuinfo
12

$ nproc
12

$ nproc --all
12

$ lscpu -p | grep -vc '^#'
12

再实证拓扑换算 CPU(s) = Thread(s) per core × Core(s) per socket × Socket(s):

$ lscpu | grep -E '^(CPU\(s\)|Thread|Core|Socket)'
CPU(s):                                  12
Thread(s) per core:                      1
Core(s) per socket:                      12
Socket(s):                               1

$ echo "逻辑CPU数(Thread x Core x Socket 换算) = $(( $(lscpu | awk -F: '/Thread/{gsub(/ /,"",$2);print $2}') * $(lscpu | awk -F: '/^Core/{gsub(/ /,"",$2);print $2}') * $(lscpu | awk -F: '/Socket/{gsub(/ /,"",$2);print $2}') ))"
逻辑CPU数(Thread x Core x Socket 换算) = 12

1 × 12 × 1 = 12,与 CPU(s): 12 完全吻合。

💡 技术拓展:三个工具的定位差异对比——

工具数据源输出粒度典型用途
lscpusysfs + /proc/cpuinfo汇总 + 每核拓扑看架构全貌、NUMA/缓存、在线离线状态
/proc/cpuinfo内核 procfs每个 CPU 一段老脚本兼容、直接看每核频率与 flags
nprocsched_getaffinity一个数字脚本里取"当前可用的 CPU 数"

关键差异在 nproc:它统计的是当前进程可用的 CPU 数(受 CPU 亲和性掩码影响)——用 taskset -c 0 nproc 会得到 1,而 lscpu 仍显示 12;nproc --all 才忽略亲和性统计全部在线 CPU。确定 CPU 基数选 lscpu,确定"这个进程能用几核"选 nproc。

四、实战示例

4.1 巡检脚本:一键输出 CPU 关键指标

巡检时通常只关心逻辑核数、型号与 NUMA 形态,用 grep 从默认输出提取:

$ lscpu | grep -E '^(Architecture|Byte Order|Model name|CPU\(s\)|Thread|Core|Socket|NUMA|Virtualization|Hypervisor)'
Architecture:                            x86_64
Byte Order:                              Little Endian
CPU(s):                                  12
Model name:                              Intel(R) Core(TM) i7-14700KF
Thread(s) per core:                      1
Core(s) per socket:                      12
Socket(s):                               1
Hypervisor vendor:                       VMware
Virtualization type:                     full
NUMA node(s):                            1
NUMA node0 CPU(s):                       0-11

4.2 把拓扑 CSV 落盘并格式化查看

-p 导出 CSV 后用 column 对齐,人工核对拓扑一目了然(演示数据见 /root/demo/lscpu/topology.csv):

$ lscpu -p > /root/demo/lscpu/topology.csv && head -18 /root/demo/lscpu/topology.csv
# The following is the parsable format, which can be fed to other
# programs. Each different item in every column has an unique ID
# starting usually from zero.
# CPU,Core,Socket,Node,,L1d,L1i,L2,L3
0,0,0,0,,0,0,0,0
1,1,0,0,,1,1,1,0
2,2,0,0,,2,2,2,0
3,3,0,0,,3,3,3,0
4,4,0,0,,4,4,4,0
5,5,0,0,,5,5,5,0
6,6,0,0,,6,6,6,0
7,7,0,0,,7,7,7,0
8,8,0,0,,8,8,8,0
9,9,0,0,,9,9,9,0
10,10,0,0,,10,10,10,0
11,11,0,0,,11,11,11,0

$ column -s, -t < /root/demo/lscpu/topology.csv | grep -v '^#'
0                                                                 0                           0       0       0    0    0   0
1                                                                 1                           0       0       1    1    1   0
2                                                                 2                           0       0       2    2    2   0
3                                                                 3                           0       0       3    3    3   0
4                                                                 4                           0       0       4    4    4   0
5                                                                 5                           0       0       5    5    5   0
6                                                                 6                           0       0       6    6    6   0
7                                                                 7                           0       0       7    7    7   0
8                                                                 8                           0       0       8    8    8   0
9                                                                 9                           0       0       9    9    9   0
10                                                                10                          0       0       10   10   10  0
11                                                                11                          0       0       11   11   11  0

4.3 按缓存共享关系推导绑核策略

L3 是 12 个逻辑 CPU 共享的(3.7 中 L3 只有 1 个实例),而 L2 是否共享要看 -p 的 L2 列(第 8 列)。用 sort -u 检查 L2 实例编号的去重结果:

$ lscpu -p | grep -v '^#' | awk -F, '{print $8}' | sort -u
0
1
10
11
2
3
4
5
6
7
8
9

去重后仍有 12 个编号,说明每个逻辑 CPU 的 L2 编号互不相同、L2 无共享,直接按 CPU 编号对半分(0-5 / 6-11)用 taskset 绑核即可;若某机器上去重结果少于逻辑 CPU 数(如两个 CPU 的 L2 编号同为 4),说明它们是同核超线程兄弟,绑核时应把它们算作同一物理核预算。

4.4 校验安全基线:漏洞缓解状态汇总

安全巡检时把非 Not affected 的条目筛出来逐项复核(该过滤保留 Mitigation/Unknown/Vulnerable 全部行):

$ lscpu | grep -i vulnerability | grep -v 'Not affected'
Vulnerability Indirect target selection: Mitigation; Aligned branch/return thunks
Vulnerability L1tf:                      Mitigation; PTE Inversion
Vulnerability Mds:                       Mitigation; Clear CPU buffers; SMT Host state unknown
Vulnerability Meltdown:                  Mitigation; PTI
Vulnerability Mmio stale data:           Unknown: No mitigations
Vulnerability Reg file data sampling:    Vulnerable: No microcode
Vulnerability Retbleed:                  Mitigation; IBRS
Vulnerability Spec store bypass:         Mitigation; Speculative Store Bypass disabled via prctl
Vulnerability Spectre v1:                Mitigation; usercopy/swapgs barriers and __user pointer sanitization

实测本机大多数条目已 Mitigation;需要跟进的是 Vulnerable: No microcode 一行(尚未收到对应微码更新)与 Unknown: No mitigations 一行。出现此类条目时跟进内核与微码(intel-microcode 包)更新即可。

4.5 JSON 供监控平台采集

-J 输出的 JSON 是 "field"/"data" 键值对结构,交给 jq 按字段名取值比文本 grep 更稳。实测 JSON 头部结构如下:

$ lscpu -J | head -8
{
   "lscpu": [
      {
         "field": "Architecture:",
         "data": "x86_64"
      },{
         "field": "CPU op-mode(s):",
         "data": "32-bit, 64-bit"
      },{
         "field": "Address sizes:",
         "data": "45 bits physical, 48 bits virtual"
      },{
         "field": "Byte Order:",
         "data": "Little Endian"
      }
   ]
}

五、注意事项与常见问题

Q1:为什么我的 lscpu 默认输出里没有 CPU MHz / CPU max MHz / CPU min MHz 这几行? 这三行依赖内核 cpufreq 子系统(/sys/devices/system/cpu/cpu*/cpufreq/)。实测机未暴露 cpufreq 接口,因此默认输出没有频率字段;此时可用 lscpu -e=cpu,mhz,maxmhz,minmhz 显式取列,MHZ 列读 /proc/cpuinfo 的标称频率,MAX/MIN 列显示 -。带 cpufreq 的裸金属服务器上三列都会有实值。

Q2:lscpu 单独执行 -b 或 -c 报错怎么办? 这是预期行为而非 bug:--all/--online/--offline 是筛选器,必须依附于 -e 或 -p 视图。正确用法是 lscpu -b -e、lscpu -c -p 等组合形式(实测报错原文见 3.4)。

Q3:lscpu 的 CPU(s) 数和 nproc 数不一致是错的吗? 不是,两者口径不同。lscpu 统计系统全部在线 CPU;nproc 统计当前进程 CPU 亲和性掩码内的 CPU 数。用 taskset -c 0 nproc 得 1、nproc --all 得 12、lscpu 得 12 是同一台机器的正常现象(实测见 3.12)。

Q4:lscpu 显示的 Thread(s) per core 是 1,是超线程没开吗? 本实测机固件把 12 个逻辑 CPU 呈现为 12 个单线程核,因此每核 1 线程。判断超线程是否生效看两点:Flags 中是否有 ht(CPU 支持超线程)与 Thread(s) per core(内核实际看到的每核线程数)。Flags 有 ht 但每核线程数为 1,说明是固件/平台配置把 SMT 关闭或按单线程呈现,属正常配置差异。

Q5:lscpu 的数据从哪来?为什么和 BIOS 标的不一样? lscpu 读取内核 sysfs(/sys/devices/system/cpu/)与 /proc/cpuinfo,反映的是内核视角的拓扑。虚拟化环境中 hypervisor 呈现什么,内核就看到什么(实测机 Hypervisor vendor 为 VMware,拓扑即 vCPU 的呈现形态);裸金属上则与 BIOS/主板插槽布局一致。BIOS 标签与 lscpu 输出不一致时,以内核视角为准做软件配置(绑核、NUMA 绑定)。

六、参考链接