《Linux性能探案录:SRE的命令行“X光”技术》
系列第一篇:top
与vmstat
带你看懂CPU的“七十二变”
“案发现场”:
深夜,你被告警电话唤醒。业务方报告说,核心应用响应极其缓慢,几乎处于不可用状态。你睡眼惺忪地登录服务器,熟练地敲下你运维生涯中学会的第一个命令:top
。
屏幕上跳动的数据却让你陷入了沉思:%Cpu(s)
那一栏显示,%us
(用户空间)和 %sy
(内核空间)加起来还不到30%,而%id
(空闲)高达70%以上。
你感到无比困惑:“CPU明明如此‘空闲’,服务器为什么会慢得像拖拉机?”
这个场景,是所有运维工程师和SRE的“必经之劫”。它揭示了一个残酷的真相:只看CPU的总体使用率,就像只根据一个人的体温来判断他是否健康一样,是远远不够的。 CPU的“健康状况”,隐藏在那些常常被我们忽略的状态细节里。
一、CPU的“七十二变”:解密top
里的状态码
要成为一名合格的性能侦探,我们必须先学会精准地解读top
(或更友好的htop
)命令中,关于CPU状态的那一行。
输入:
top
输出(关注 %Cpu(s)
这一行):
top - 01:30:00 up 10 days, 4:15, 1 user, load average: 1.15, 1.30, 1.35
Tasks: 190 total, 1 running, 189 sleeping, 0 stopped, 0 zombie
%Cpu(s): 15.5 us, 5.2 sy, 0.0 ni, 78.5 id, 0.5 wa, 0.0 hi, 0.3 si, 0.0 st
结果分析与注释(像读心电图一样读懂它):
us
(user space): 用户态CPU时间百分比
- 含义: CPU正在执行你的应用程序代码(如Nginx、MySQL、Java程序)所花费的时间。
- 比喻: 公司的研发员工,正在专心写代码、做产品。
- 解读: 这个值高,说明是你的应用程序本身消耗了大量CPU,需要去优化代码逻辑。
sy
(system space/kernel space): 内核态CPU时间百分比
- 含义: CPU正在执行操作系统内核代码所花费的时间,通常是响应应用程序的“系统调用(syscall)”,比如读写文件、收发网络包。
- 比喻: 公司的行政和后勤部门,正在为研发员工提供支持服务(如收发快递、预定会议室)。
- 解读: 这个值持续过高,说明应用程序可能在进行大量的I/O操作或频繁的系统调用,需要检查程序与系统的交互方式。
id
(idle): 空闲CPU时间百分比
- 含义: CPU完全处于空闲状态的时间。
- 比喻: 员工正在休息,无事可做。
- 解读: 我们开篇案例中,这个值很高,迷惑了我们。但请记住:
id
高,不代表系统没有瓶颈!
wa
(wait I/O): 等待I/O的CPU时间百分比
- 含义: CPU处于空闲状态,但它不是没事干,而是在等待磁盘或网络I/O操作完成。
- 比喻: 研发员工想写代码,但他需要的“设计文档”(数据)还在从遥远的仓库(磁盘)运来的路上,他只能坐在工位上“发呆式”等待。
- 解读: 这是性能分析中最重要的指标之一! 如果
id
很低,但wa
很高,说明CPU本身没问题,瓶颈在硬盘或网络上。解决了开篇的那个谜题!
si
(softirq): 处理软中断的CPU时间百分比
- 含义: CPU正在处理“软中断”请求。最常见的软中断就是网络数据包的收发。
- 比喻: 公司的前台,正在不断地接听电话、签收快递。
- 解读: 在高网络吞吐量的服务器上(如负载均衡、Web服务器),这个值较高是正常的。但如果异常飙高,可能意味着网络流量过大或存在驱动问题。
二、诊断升级:用vmstat
看清系统动态
top
提供的是一个“快照”,而vmstat
则像一台“摄像机”,能让我们看到系统各项指标的实时变化。
输入:
# '1' 表示每秒刷新一次
vmstat 1
输出:
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
1 0 0 129480 24536 892340 0 0 4 40 150 200 15 5 79 1 0
2 0 0 129400 24536 892360 0 0 0 112 1800 3500 20 10 65 5 0
0 1 0 129320 24544 892380 0 0 2048 60 2500 5000 10 15 50 25 0
0 1 0 129240 24544 892400 0 0 4096 80 3000 8000 5 10 30 55 0
结果分析与注释(我们重点关注两列):
system
-\>cs
(context switch): 上下文切换次数
- 含义: 操作系统每秒钟在不同进程之间切换执行权的次数。
- 比喻: 一个员工手头有好几个项目,他不停地在项目A、项目B、项目C之间切换思路。
- 解读: 频繁的上下文切换本身会消耗大量CPU时间。如果这个值持续非常高(成千上万甚至更高),而
us
和sy
都不算高,说明CPU的时间可能都浪费在“切换”上了,而不是在“干活”。这通常意味着系统中有大量活跃的线程或进程。
cpu
-\>wa
(wait I/O): 等待I/O的CPU时间百分比
- 含义: 与
top
中的wa
完全相同,但vmstat
的实时滚动输出让我们能更直观地看到它的变化趋势。 - 实操: 当你在服务器上执行一个大文件拷贝命令时,同时打开另一个终端运行
vmstat 1
,你会清晰地看到wa
这一列的数值瞬间飙升,而id
急剧下降。这个简单的实验,能让你对I/O等待有最直观的体感。
本章总结:从侦探新手到初级探员
今天,我们完成了从一个只会看CPU总使用率的新手,到能读懂CPU多种工作状态的初级探案员的转变。
- 核心世界观: CPU“空闲”不代表系统健康,等待I/O (
wa
) 是最容易被忽视的性能杀手。 - 诊断思维升级:
- 使用
top
或htop
,不再只看%id
,而是全面分析%us
,%sy
,%wa
,%si
,对CPU的工作状态进行初步定性。 - 使用
vmstat 1
,动态地观察上下文切换 (cs
) 和I/O等待 (wa
) 的趋势,为你的判断提供更强的实时数据支持。
现在,你已经能初步回答“CPU到底在忙什么”这个问题了。但是,如果问题出在内存或文件上呢?当内存告急,或者一个神秘进程占用了关键端口时,我们又该如何下手?
在下一篇中,我们将深入探索内存的迷雾,学习《内存疑云 - free
与lsof
揭秘“消失”的内存与“神秘”的文件》,敬请期待!