linux lscpu命令

提示:lscpu命令用于显示CPU架构信息,包括CPU型号、核心数、线程数、缓存大小、指令集等详细信息。

命令简介

lscpu 是Linux系统中用于显示CPU架构信息的命令。它从/proc/cpuinfo/sys/devices/system/cpu/等系统文件中收集信息,并以易读的格式显示CPU的详细规格。对于系统管理员、开发人员和性能调优人员来说,lscpu是了解系统硬件能力的重要工具。

命令语法

lscpu [选项]

常用选项

选项 说明
-a, --all 显示所有CPU信息,包括在线和离线的CPU
-b, --online 只显示在线的CPU信息
-c, --offline 只显示离线的CPU信息
-e, --extended [=列表] 以扩展格式显示CPU信息,可指定显示的列
-p, --parse [=列表] 以易于解析的格式输出,可指定显示的列
-s, --sysroot 目录 为收集数据指定一个系统根目录
-x, --hex 以十六进制显示CPU掩码
-y, --physical 显示物理ID信息
-J, --json 以JSON格式输出
-h, --help 显示帮助信息
-V, --version 显示版本信息

输出字段详解

字段 说明 示例值
Architecture CPU架构类型 x86_64, aarch64, armv7l
CPU op-mode(s) CPU支持的操作模式 32-bit, 64-bit
Byte Order 字节顺序 Little Endian
CPU(s) 逻辑CPU核心总数 8
On-line CPU(s) list 在线CPU列表 0-7
Thread(s) per core 每个物理核心的线程数(超线程) 2
Core(s) per socket 每个插槽(CPU)的物理核心数 4
Socket(s) CPU插槽数(物理CPU数量) 1
NUMA node(s) NUMA节点数 1
Vendor ID CPU制造商ID GenuineIntel, AuthenticAMD
CPU family CPU家族 6 (Intel), 23 (AMD Zen)
Model CPU型号 158 (i7-8700K), 113 (Ryzen 7)
Model name CPU型号名称 Intel(R) Core(TM) i7-8700K CPU @ 3.70GHz
Stepping 步进版本(修订版本) 10
CPU MHz CPU当前频率 3699.998
CPU max MHz CPU最大频率 4900.0000
CPU min MHz CPU最小频率 800.0000
BogoMIPS 粗略的MIPS值(用于校准延迟循环) 7399.99
Virtualization 虚拟化技术支持 VT-x, AMD-V
L1d cache 一级数据缓存大小 32K
L1i cache 一级指令缓存大小 32K
L2 cache 二级缓存大小 256K
L3 cache 三级缓存大小 12288K
NUMA node0 CPU(s) NUMA节点0的CPU列表 0-7
Flags CPU支持的指令集和特性 fpu vme de pse tsc msr pae mce cx8 apic ...

使用示例

示例1:基本使用

显示CPU架构的基本信息:

# 显示CPU架构信息
lscpu

# 示例输出:
# Architecture:            x86_64
# CPU op-mode(s):        32-bit, 64-bit
# Byte Order:            Little Endian
# CPU(s):                8
# On-line CPU(s) list:   0-7
# Thread(s) per core:    2
# Core(s) per socket:    4
# Socket(s):             1
# NUMA node(s):          1
# Vendor ID:             GenuineIntel
# CPU family:            6
# Model:                 158
# Model name:            Intel(R) Core(TM) i7-8700K CPU @ 3.70GHz
# Stepping:              10
# CPU MHz:               3699.998
# CPU max MHz:           4900.0000
# CPU min MHz:           800.0000
# BogoMIPS:              7399.99
# Virtualization:        VT-x
# L1d cache:             32K
# L1i cache:             32K
# L2 cache:              256K
# L3 cache:              12288K
# NUMA node0 CPU(s):     0-7

示例2:扩展格式显示

以扩展格式显示详细的CPU信息:

# 以扩展表格格式显示所有信息
lscpu -e

# 指定显示的列
lscpu -e=CPU,NODE,SOCKET,CORE,L1d,L1i,L2,L3

# 示例输出:
# CPU NODE SOCKET CORE L1d:L1i:L2:L3
# 0   0    0      0    0:0:0:0
# 1   0    0      0    0:0:0:0
# 2   0    0      1    1:1:1:0
# 3   0    0      1    1:1:1:0
# 4   0    0      2    2:2:2:0
# 5   0    0      2    2:2:2:0
# 6   0    0      3    3:3:3:0
# 7   0    0      3    3:3:3:0

示例3:易于解析的格式

以易于脚本解析的格式输出:

# 以易于解析的格式输出
lscpu -p

# 指定需要显示的列
lscpu -p=cpu,core,socket,node

# 示例输出:
# # The following is the parsable format, which can be fed to other
# # programs. Each different item in every column has an unique ID
# # starting from zero.
# # CPU,Core,Socket,Node
# 0,0,0,0
# 1,0,0,0
# 2,1,0,0
# 3,1,0,0
# 4,2,0,0
# 5,2,0,0
# 6,3,0,0
# 7,3,0,0

示例4:显示所有CPU信息

显示所有CPU信息,包括离线的CPU:

# 显示所有CPU信息(包括在线和离线)
lscpu -a

# 只显示在线CPU信息
lscpu -b

# 只显示离线CPU信息(通常为空,除非有CPU被禁用)
lscpu -c

示例5:JSON格式输出

以JSON格式输出CPU信息,便于编程处理:

# 以JSON格式输出
lscpu -J

# 示例输出(简化):
# {
#   "lscpu": [
#     {
#       "field": "Architecture",
#       "data": "x86_64"
#     },
#     {
#       "field": "CPU op-mode(s)",
#       "data": "32-bit, 64-bit"
#     },
#     ...
#   ]
# }

# 结合jq工具处理JSON输出
lscpu -J | jq '.lscpu[] | select(.field == "Model name") | .data'

示例6:显示物理布局信息

显示CPU的物理布局信息:

# 显示物理ID信息
lscpu -y

# 显示十六进制格式的CPU掩码
lscpu -x

# 查看CPU拓扑结构
lscpu --topology

# 查看CPU缓存信息
lscpu --cache

# 查看所有扩展信息
lscpu --extended

示例7:在脚本中使用lscpu

在脚本中提取特定的CPU信息:

#!/bin/bash

# 获取CPU核心总数
CPU_COUNT=$(lscpu | grep "^CPU(s):" | awk '{print $2}')
echo "CPU核心总数: $CPU_COUNT"

# 获取物理核心数
PHYSICAL_CORES=$(lscpu | grep "Core(s) per socket" | awk '{print $4}')
SOCKETS=$(lscpu | grep "Socket(s)" | awk '{print $2}')
PHYSICAL_CORE_COUNT=$((PHYSICAL_CORES * SOCKETS))
echo "物理核心数: $PHYSICAL_CORE_COUNT"

# 获取线程数
THREADS_PER_CORE=$(lscpu | grep "Thread(s) per core" | awk '{print $4}')
echo "每个物理核心的线程数: $THREADS_PER_CORE"

# 检查是否启用超线程
if [ "$THREADS_PER_CORE" -gt 1 ]; then
    echo "超线程已启用"
else
    echo "超线程未启用"
fi

# 获取CPU型号
CPU_MODEL=$(lscpu | grep "Model name" | cut -d: -f2 | sed 's/^[ \t]*//')
echo "CPU型号: $CPU_MODEL"

# 获取CPU最大频率
CPU_MAX_MHZ=$(lscpu | grep "CPU max MHz" | awk '{print $4}')
echo "CPU最大频率: ${CPU_MAX_MHZ}MHz"

# 获取支持的指令集
CPU_FLAGS=$(lscpu | grep "Flags" | cut -d: -f2 | sed 's/^[ \t]*//')
echo "支持的指令集数量: $(echo $CPU_FLAGS | wc -w)"

# 检查是否支持虚拟化
if echo "$CPU_FLAGS" | grep -q "vmx\|svm"; then
    echo "CPU支持硬件虚拟化"
else
    echo "CPU不支持硬件虚拟化"
fi

# 检查是否支持AVX指令集
if echo "$CPU_FLAGS" | grep -q "avx"; then
    echo "CPU支持AVX指令集"
fi

CPU拓扑结构解读

理解lscpu输出的拓扑结构:

# 对于典型的超线程CPU(如8核16线程):
# CPU(s):                16           ← 逻辑CPU总数(线程数)
# Thread(s) per core:    2            ← 每个物理核心有2个线程
# Core(s) per socket:    8            ← 每个插槽有8个物理核心
# Socket(s):             1            ← 有1个物理CPU插槽
#
# 计算公式:
# 逻辑CPU数 = Socket(s) × Core(s) per socket × Thread(s) per core
#          = 1 × 8 × 2 = 16

# 对于双路服务器(2个CPU,每个14核28线程):
# CPU(s):                56           ← 逻辑CPU总数
# Thread(s) per core:    2            ← 超线程
# Core(s) per socket:    14           ← 每个CPU有14个物理核心
# Socket(s):             2            ← 2个物理CPU
#
# 逻辑CPU数 = 2 × 14 × 2 = 56

NUMA架构信息

对于NUMA(非统一内存访问)系统:

# 查看NUMA信息
numactl --hardware

# 查看CPU与NUMA节点的映射
lscpu | grep -A1 "NUMA node"

# 对于多NUMA节点系统,输出可能如下:
# NUMA node(s):          2
# NUMA node0 CPU(s):     0-7,16-23
# NUMA node1 CPU(s):     8-15,24-31

# 这意味着:
# - 系统有2个NUMA节点
# - NUMA节点0包含CPU 0-7和16-23(共16个逻辑CPU)
# - NUMA节点1包含CPU 8-15和24-31(共16个逻辑CPU)

缓存层次结构

理解CPU缓存层次:

# 典型的现代CPU缓存层次:
# L1d cache: 32K   ← 一级数据缓存(每个核心独立)
# L1i cache: 32K   ← 一级指令缓存(每个核心独立)
# L2 cache:  256K  ← 二级缓存(通常每个核心独立或共享)
# L3 cache:  12288K ← 三级缓存(通常所有核心共享)

# 查看详细的缓存信息
cat /sys/devices/system/cpu/cpu0/cache/index*/size
cat /sys/devices/system/cpu/cpu0/cache/index*/level
cat /sys/devices/system/cpu/cpu0/cache/index*/type

# 缓存速度:L1 > L2 > L3 > 内存
# 缓存容量:L1 < L2 < L3 < 内存

CPU指令集标志详解

常见的CPU指令集标志及其含义:

标志 全称 说明
fpu Floating Point Unit 浮点运算单元
vme Virtual Mode Extensions 虚拟模式扩展
avx Advanced Vector Extensions 高级向量扩展(256位SIMD)
avx2 AVX2 Extensions AVX2扩展(整数256位SIMD)
avx512f AVX-512 Foundation AVX-512基础指令集
sse Streaming SIMD Extensions 流式SIMD扩展
sse2 SSE2 第二代SSE指令集
ssse3 Supplemental SSE3 补充SSE3指令集
vmx Virtual Machine Extensions Intel虚拟化技术(VT-x)
svm Secure Virtual Machine AMD虚拟化技术(AMD-V)
aes AES-NI AES加密指令集
tsc Time Stamp Counter 时间戳计数器
rdrand Random Number Generator 硬件随机数生成器
rdseed RDSEED Instruction 随机种子指令
smep Supervisor Mode Execution Protection 内核模式执行保护
smap Supervisor Mode Access Protection 内核模式访问保护

注意事项

  1. lscpu显示的是逻辑CPU数量,不是物理核心数。要计算物理核心数,使用公式:Socket(s) × Core(s) per socket
  2. CPU频率(CPU MHz)是实时频率,可能因节能技术(如Intel SpeedStep、AMD Cool'n'Quiet)而变化
  3. BogoMIPS值不准确,仅用于内核引导时的延迟循环校准,不应作为性能指标
  4. 某些虚拟化环境(如容器)可能无法显示完整的CPU信息
  5. 不同架构(x86、ARM、PowerPC)的lscpu输出格式可能略有不同
  6. 对于离线CPU(可能因热管理或错误被禁用),需要使用-a选项才能看到
  7. lscpu信息来自系统文件,这些文件在系统启动时生成,重启后可能变化
  8. 在多处理器系统中,不同CPU可能具有不同的特性(异构系统)

故障排查

# 1. lscpu命令不存在
# 检查是否安装
which lscpu
# 安装(如果需要)
# Ubuntu/Debian: sudo apt-get install util-linux
# RHEL/CentOS: sudo yum install util-linux

# 2. 信息不完整或错误
# 直接查看原始数据文件
cat /proc/cpuinfo
ls /sys/devices/system/cpu/

# 3. 检查CPU热插拔状态
cat /sys/devices/system/cpu/cpu0/online  # 1表示在线,0表示离线

# 4. 验证CPU频率
cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_cur_freq
cat /sys/devices/system/cpu/cpu0/cpufreq/cpuinfo_max_freq

# 5. 检查CPU微码更新
dmesg | grep microcode

# 6. 查看CPU拓扑的另一种方式
find /sys/devices/system/cpu/ -type f -name "topology" -exec cat {} \;

# 7. 获取更详细的CPU信息
dmidecode -t processor

相关命令

  • cat /proc/cpuinfo - 查看原始的CPU信息
  • nproc - 显示可用的处理单元数量
  • uptime - 显示系统负载,与CPU使用相关
  • top - 显示CPU使用情况的进程
  • htop - top的增强版,显示CPU使用情况
  • mpstat - 显示每个CPU的统计信息
  • sar - 系统活动报告,包含CPU使用率
  • dmidecode - 获取DMI/BIOS信息,包括CPU详情
  • lshw - 列出硬件信息,包括CPU
  • cpuid - 显示详细的CPU识别信息