假如你是idc运维,现在新买了一批服务器,领导让你统计一下CPU配置信息,你会如何做呢?我刚开始那会儿,对着黑乎乎的终端界面,连个CPU有几个核都搞不清楚的日子。
其实查看CPU信息这个事儿,说简单也简单,说复杂也复杂。简单是因为Linux给我们提供了很多现成的工具和命令,复杂是因为CPU的信息实在太多了,物理CPU、逻辑CPU、超线程、缓存等等,一不小心就容易搞混。
今天就来聊聊Linux下查看CPU信息的各种方法,保证看完之后你也能成为CPU信息查看的"老司机"。
说到查看CPU信息,第一个想到的肯定是/proc/cpuinfo
这个文件。这个文件可以说是CPU信息的"户口本",里面记录了CPU的各种详细信息。
cat /proc/cpuinfo
image-20250920193157585
执行这个命令后,你会看到一大堆信息刷屏,每个CPU核心都会有一段详细的描述。刚开始看可能会觉得眼花缭乱,但其实里面的信息都挺有用的。
比如说processor
字段,这个表示的是逻辑CPU的编号,从0开始计数。physical id
表示物理CPU的ID,core id
表示CPU核心的ID,cpu cores
表示该物理CPU有多少个核心。
有时候我们不需要看这么详细的信息,只想知道CPU的型号,可以这样:
cat /proc/cpuinfo | grep "model name" | head -1
这样就能看到CPU的具体型号了,比如Intel(R) Xeon(R) CPU E5-2680 v4之类的。
想知道有多少个逻辑CPU?
cat /proc/cpuinfo | grep processor | wc -l
想知道有多少个物理CPU?
cat /proc/cpuinfo | grep "physical id" | sort | uniq | wc -l
每个物理CPU有多少个核心?
cat /proc/cpuinfo | grep "cpu cores" | head -1
image-20250920193243023
不过说实话,这种方法虽然信息全面,但是看起来确实有点累,特别是在CPU核心比较多的服务器上。
如果你觉得/proc/cpuinfo
的信息太冗长,那lscpu
命令绝对是你的菜。这个命令会把CPU信息整理得非常清晰,一目了然。
lscpu
image-20250920193301469
执行后你会看到类似这样的输出:
[root@webtest ~]# lscpu
架构: x86_64
CPU 运行模式: 32-bit, 64-bit
字节序: Little Endian
CPU: 4
在线 CPU 列表: 0-3
每个核的线程数: 1
每个座的核数: 2
座: 2
NUMA 节点: 1
厂商 ID: GenuineIntel
BIOS Vendor ID: GenuineIntel
CPU 系列: 6
型号: 191
型号名称: 13th Gen Intel(R) Core(TM) i5-13400F
BIOS Model name: 13th Gen Intel(R) Core(TM) i5-13400F
步进: 2
CPU MHz: 2496.001
BogoMIPS: 4992.00
虚拟化: VT-x
超管理器厂商: VMware
虚拟化类型: 完全
L1d 缓存: 48K
L1i 缓存: 32K
L2 缓存: 1280K
L3 缓存: 20480K
NUMA 节点0 CPU: 0-3
标记: 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 pni pclmulqdq vmx ssse3 fma cx16 sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand hypervisor lahf_lm abm 3dnowprefetch ssbd ibrs ibpb stibp ibrs_enhanced tpr_shadow vnmi ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid rdseed adx smap clflushopt clwb sha_ni xsaveopt xsavec xgetbv1 xsaves arat umip pku ospke gfni vaes vpclmulqdq rdpid movdiri movdir64b fsrm md_clear flush_l1d arch_capabilities
这个输出就清晰多了,CPU架构、总CPU数、每个核心的线程数、每个插槽的核心数等等,一眼就能看明白。
我特别喜欢这个命令的一点是,它会直接告诉你Thread(s) per core,这样你就能很容易判断CPU是否支持超线程技术。如果这个值是2,说明支持超线程;如果是1,就不支持。
有时候我们只是想快速知道系统有多少个CPU核心,用来调整一些程序的并发参数,这时候nproc
命令就派上用场了。(我这是虚拟机里 的环境哈)
nproc
image-20250920194806189
这个命令会直接输出可用的处理器数量,简单粗暴。不过要注意,这里显示的是逻辑CPU的数量,如果CPU支持超线程,显示的数量会是物理核心数的两倍。
如果你想获取物理CPU核心数,可以加上--all
参数:
nproc --all
dmidecode
这个命令可能知道的人不多,但它确实是个好东西。它能够读取系统的DMI(Desktop Management Interface)信息,包括CPU的详细硬件信息。
dmidecode -t processor
image-20250920195012229
这个命令会显示CPU的详细硬件信息,包括插槽信息、电压、外部时钟频率等等,这些信息在/proc/cpuinfo
中可能看不到。
有一次我遇到一个奇怪的问题,服务器的性能表现和预期不符,用常规的命令查看CPU信息都显示正常,最后用dmidecode
才发现CPU的运行电压有问题。虽然这种情况比较少见,但关键时刻这个命令还是很有用的。
不过需要注意的是,dmidecode
需要root权限才能运行,而且在虚拟机环境下可能获取不到准确的信息。
虽然top
和htop
主要是用来查看系统进程和资源使用情况的,但它们也能显示CPU的一些基本信息。
在top
命令的输出中,第一行会显示系统的基本信息,包括CPU核心数。按数字键1可以显示每个CPU核心的使用情况,这样你就能知道系统有多少个逻辑CPU了。
htop
的界面更加友好,顶部会以图形化的方式显示每个CPU核心的使用情况,一眼就能看出系统有多少个CPU核心。
这两个命令的优势是能够实时显示CPU的使用情况,在排查性能问题的时候特别有用。比如你可以看到某个CPU核心的使用率特别高,或者所有CPU核心的使用率都很平均等等。
top:
image-20250920195103840
htop:
image-20250920195042436
CPU的缓存信息对性能调优来说也很重要,特别是在做一些对内存访问敏感的应用时。
lscpu | grep -i cache
这个命令会显示L1、L2、L3缓存的大小信息。不同级别的缓存速度和容量都不一样,了解这些信息有助于我们更好地优化程序性能。
还可以通过/sys
文件系统来查看更详细的缓存信息:
ls /sys/devices/system/cpu/cpu0/cache/
这个目录下会有index0、index1、index2等子目录,分别对应不同级别的缓存。
现代CPU都支持动态调频技术,根据负载情况自动调整运行频率。我们可以通过以下命令查看CPU的频率信息:
cat /proc/cpuinfo | grep "cpu MHz"
image-20250920195152509
这个命令会显示每个CPU核心当前的运行频率。不过这个频率是实时变化的,你多执行几次可能会看到不同的结果。
想查看CPU支持的频率范围和当前的调速器策略,可以用:
cpufreq-info
如果系统没有安装这个命令,可以通过包管理器安装cpufrequtils包。
还可以通过/sys
文件系统查看:
cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_min_freq
cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_max_freq
这些信息在做性能调优的时候很有用,比如你可以设置CPU始终运行在最高频率,或者根据负载自动调整。
在实际工作中,我总结了一些查看CPU信息的小技巧,分享给大家。
想快速了解CPU的基本情况,我一般会用这个组合命令:
echo "CPU型号: $(cat /proc/cpuinfo | grep "model name" | head -1 | cut -d: -f2)"
echo "物理CPU数: $(cat /proc/cpuinfo | grep "physical id" | sort | uniq | wc -l)"
echo "逻辑CPU数: $(nproc)"
echo "CPU核心数: $(cat /proc/cpuinfo | grep "cpu cores" | head -1 | cut -d: -f2)"
这样一次性就能看到最关心的几个信息。
如果要写脚本自动获取CPU信息,建议优先使用lscpu
命令,因为它的输出格式比较规整,便于解析:
# 获取CPU架构
lscpu | grep "Architecture" | awk '{print $2}'
# 获取CPU型号
lscpu | grep "Model name" | cut -d: -f2 | sed 's/^ *//'
# 获取逻辑CPU数
lscpu | grep "^CPU(s):" | awk '{print $2}'
在虚拟化环境中,CPU信息可能会有一些特殊性。比如在Docker容器中,看到的CPU信息实际上是宿主机的信息,但可用的CPU资源可能受到限制。在这种情况下,可以通过cgroup来查看实际可用的CPU资源:
cat /sys/fs/cgroup/cpu/cpu.cfs_quota_us
cat /sys/fs/cgroup/cpu/cpu.cfs_period_us
#!/bin/sh
# CPU信息统计脚本
# 作者: 运维躬行录
# 功能: 全面统计Linux系统CPU信息
echo "=========================================="
echo " CPU信息统计报告"
echo "=========================================="
echo "统计时间: $(date '+%Y-%m-%d %H:%M:%S')"
echo "主机名称: $(hostname)"
echo "系统版本: $(cat /etc/os-release | grep PRETTY_NAME | cut -d'"' -f2 2>/dev/null || uname -s)"
echo ""
# 基本CPU信息
echo "【基本信息】"
if command -v lscpu >/dev/null 2>&1; then
CPU_MODEL=$(lscpu | grep "Model name" | cut -d: -f2 | sed 's/^ *//')
CPU_ARCH=$(lscpu | grep "Architecture" | awk "{print $2}")
CPU_VENDOR=$(lscpu | grep "Vendor ID" | cut -d: -f2 | sed 's/^ *//')
echo "CPU型号: $CPU_MODEL"
echo "CPU架构: $CPU_ARCH"
echo "CPU厂商: $CPU_VENDOR"
else
CPU_MODEL=$(cat /proc/cpuinfo | grep "model name" | head -1 | cut -d: -f2 | sed 's/^ *//')
echo "CPU型号: $CPU_MODEL"
echo "CPU架构: $(uname -m)"
fi
echo ""
# CPU数量统计
echo "【数量统计】"
PHYSICAL_CPU=$(cat /proc/cpuinfo | grep "physical id" | sort | uniq | wc -l)
LOGICAL_CPU=$(nproc)
CPU_CORES=$(cat /proc/cpuinfo | grep "cpu cores" | head -1 | cut -d: -f2 | sed 's/^ *//')
# 处理某些系统可能没有cpu cores字段的情况
if [ -z "$CPU_CORES" ] || [ "$CPU_CORES" = "" ]; then
CPU_CORES=$(cat /proc/cpuinfo | grep "core id" | sort | uniq | wc -l)
if [ "$CPU_CORES" -eq 0 ]; then
CPU_CORES=$LOGICAL_CPU
fi
fi
# 处理物理CPU为0的情况(某些虚拟机环境)
if [ "$PHYSICAL_CPU" -eq 0 ]; then
PHYSICAL_CPU=1
fi
echo "物理CPU数量: $PHYSICAL_CPU 个"
echo "逻辑CPU数量: $LOGICAL_CPU 个"
echo "每个CPU核心数: $CPU_CORES 个"
# 判断是否支持超线程
TOTAL_CORES=$((PHYSICAL_CPU * CPU_CORES))
if [ $LOGICAL_CPU -gt $TOTAL_CORES ]; then
THREADS_PER_CORE=$((LOGICAL_CPU / TOTAL_CORES))
echo "超线程支持: 是 (每核心 $THREADS_PER_CORE 线程)"
else
echo "超线程支持: 否"
fi
echo ""
# CPU频率信息
echo "【频率信息】"
if [ -f /proc/cpuinfo ]; then
FREQ_LIST=$(cat /proc/cpuinfo | grep "cpu MHz" | awk "{print $4}")
if [ ! -z "$FREQ_LIST" ]; then
MIN_FREQ=$(echo "$FREQ_LIST" | sort -n | head -1)
MAX_FREQ=$(echo "$FREQ_LIST" | sort -n | tail -1)
AVG_FREQ=$(echo "$FREQ_LIST" | awk '{sum+=$1; count++} END {printf "%.2f", sum/count}')
echo "当前最低频率: ${MIN_FREQ} MHz"
echo "当前最高频率: ${MAX_FREQ} MHz"
echo "当前平均频率: ${AVG_FREQ} MHz"
fi
fi
# 尝试获取CPU基础频率和最大频率
if command -v lscpu >/dev/null 2>&1; then
BASE_FREQ=$(lscpu | grep "CPU MHz" | awk "{print $3}")
MAX_BOOST_FREQ=$(lscpu | grep "CPU max MHz" | awk "{print $4}")
MIN_BOOST_FREQ=$(lscpu | grep "CPU min MHz" | awk "{print $4}")
[ ! -z "$BASE_FREQ" ] && echo "CPU基础频率: ${BASE_FREQ} MHz"
[ ! -z "$MAX_BOOST_FREQ" ] && echo "CPU最大频率: ${MAX_BOOST_FREQ} MHz"
[ ! -z "$MIN_BOOST_FREQ" ] && echo "CPU最小频率: ${MIN_BOOST_FREQ} MHz"
fi
echo ""
# 缓存信息
echo "【缓存信息】"
if command -v lscpu >/dev/null 2>&1; then
L1D_CACHE=$(lscpu | grep "L1d cache" | awk "{print $3}")
L1I_CACHE=$(lscpu | grep "L1i cache" | awk "{print $3}")
L2_CACHE=$(lscpu | grep "L2 cache" | awk "{print $3}")
L3_CACHE=$(lscpu | grep "L3 cache" | awk "{print $3}")
[ ! -z "$L1D_CACHE" ] && echo "L1数据缓存: $L1D_CACHE"
[ ! -z "$L1I_CACHE" ] && echo "L1指令缓存: $L1I_CACHE"
[ ! -z "$L2_CACHE" ] && echo "L2缓存: $L2_CACHE"
[ ! -z "$L3_CACHE" ] && echo "L3缓存: $L3_CACHE"
else
echo "无法获取缓存信息 (lscpu命令不可用)"
fi
echo ""
# CPU特性
echo "【CPU特性】"
if [ -f /proc/cpuinfo ]; then
CPU_FLAGS=$(cat /proc/cpuinfo | grep "flags" | head -1 | cut -d: -f2)
# 检查一些重要特性
echo -n "虚拟化支持: "
if echo $CPU_FLAGS | grep -q "vmx\|svm"; then
if echo $CPU_FLAGS | grep -q "vmx"; then
echo "是 (Intel VT-x)"
else
echo "是 (AMD-V)"
fi
else
echo "否"
fi
echo -n "AES加速: "
if echo $CPU_FLAGS | grep -q "aes"; then
echo "是"
else
echo "否"
fi
echo -n "SSE4支持: "
if echo $CPU_FLAGS | grep -q "sse4"; then
echo "是"
else
echo "否"
fi
echo -n "AVX支持: "
if echo $CPU_FLAGS | grep -q "avx"; then
echo "是"
else
echo "否"
fi
echo -n "AVX2支持: "
if echo $CPU_FLAGS | grep -q "avx2"; then
echo "是"
else
echo "否"
fi
fi
echo ""
# 当前CPU使用情况
echo "【当前状态】"
if command -v uptime >/dev/null 2>&1; then
UPTIME_INFO=$(uptime)
echo "系统负载: $UPTIME_INFO"
fi
# CPU温度信息(如果可用)
if command -v sensors >/dev/null 2>&1; then
echo ""
echo "【温度信息】"
sensors 2>/dev/null | grep -E "Core|CPU|temp" | head -5
elif [ -d /sys/class/thermal ]; then
echo ""
echo "【温度信息】"
for thermal in /sys/class/thermal/thermal_zone*/temp; do
if [ -r "$thermal" ]; then
temp=$(cat "$thermal")
zone=$(basename $(dirname "$thermal"))
temp_c=$((temp / 1000))
echo "$zone: ${temp_c}°C"
fi
done 2>/dev/null | head -5
fi
# CPU调速器信息
if [ -f /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor ]; then
echo ""
echo "【调速器信息】"
GOVERNOR=$(cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor 2>/dev/null)
[ ! -z "$GOVERNOR" ] && echo "当前调速器: $GOVERNOR"
if [ -f /sys/devices/system/cpu/cpu0/cpufreq/scaling_available_governors ]; then
AVAILABLE_GOV=$(cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_available_governors 2>/dev/null)
[ ! -z "$AVAILABLE_GOV" ] && echo "可用调速器: $AVAILABLE_GOV"
fi
fi
# 虚拟化环境检测
echo ""
echo "【环境检测】"
if [ -f /proc/1/cgroup ] && grep -q docker /proc/1/cgroup; then
echo "运行环境: Docker容器"
elif [ -f /.dockerenv ]; then
echo "运行环境: Docker容器"
elif command -v systemd-detect-virt >/dev/null 2>&1; then
VIRT_TYPE=$(systemd-detect-virt 2>/dev/null)
if [ "$VIRT_TYPE" != "none" ]; then
echo "运行环境: 虚拟机 ($VIRT_TYPE)"
else
echo "运行环境: 物理机"
fi
elif [ -f /proc/cpuinfo ] && grep -q "hypervisor" /proc/cpuinfo; then
echo "运行环境: 虚拟机"
else
echo "运行环境: 物理机"
fi
echo ""
echo "=========================================="
echo " 统计完成"
echo "=========================================="
查看CPU信息这个事儿,方法确实挺多的。/proc/cpuinfo
信息最全面但比较冗长,lscpu
简洁明了适合日常使用,nproc
快速获取核心数,dmidecode
能看到硬件层面的详细信息,top
和htop
则能实时监控CPU状态。
在实际工作中,我建议根据不同的场景选择合适的方法。日常查看用lscpu
,写脚本用nproc
,排查硬件问题用dmidecode
,性能监控用htop
。掌握了这些方法,以后再遇到CPU相关的问题就不会手忙脚乱了。
说到底,工具只是手段,关键还是要理解CPU的基本概念,比如物理CPU、逻辑CPU、超线程、缓存(如何需要的话也可以出一篇来讲一讲!!)等等。只有理解了这些概念,才能更好地使用这些工具,也才能在遇到问题时快速定位和解决。
如果这篇文章对你有帮助,别忘了点赞转发支持一下!想了解更多运维实战经验和技术干货,记得关注微信公众号@运维躬行录,领取学习大礼包!!!我会持续分享更多接地气的运维知识和踩坑经验。让我们一起在运维这条路上互相学习,共同进步!
公众号:运维躬行录
个人博客:躬行笔记