0
点赞
收藏
分享

微信扫一扫

​​top​​与​​vmstat​​带你看懂CPU的“七十二变”

《Linux性能探案录:SRE的命令行“X光”技术》

系列第一篇:topvmstat带你看懂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时间。如果这个值持续非常高(成千上万甚至更高),而ussy都不算高,说明CPU的时间可能都浪费在“切换”上了,而不是在“干活”。这通常意味着系统中有大量活跃的线程或进程。
  • cpu -\> wa (wait I/O): 等待I/O的CPU时间百分比
  • 含义:top中的wa完全相同,但vmstat的实时滚动输出让我们能更直观地看到它的变化趋势。
  • 实操: 当你在服务器上执行一个大文件拷贝命令时,同时打开另一个终端运行vmstat 1,你会清晰地看到wa这一列的数值瞬间飙升,而id急剧下降。这个简单的实验,能让你对I/O等待有最直观的体感。

本章总结:从侦探新手到初级探员

今天,我们完成了从一个只会看CPU总使用率的新手,到能读懂CPU多种工作状态的初级探案员的转变。

  • 核心世界观: CPU“空闲”不代表系统健康,等待I/O (wa) 是最容易被忽视的性能杀手。
  • 诊断思维升级:
  • 使用tophtop,不再只看%id,而是全面分析%us, %sy, %wa, %si,对CPU的工作状态进行初步定性。
  • 使用vmstat 1,动态地观察上下文切换 (cs)I/O等待 (wa) 的趋势,为你的判断提供更强的实时数据支持。

现在,你已经能初步回答“CPU到底在忙什么”这个问题了。但是,如果问题出在内存或文件上呢?当内存告急,或者一个神秘进程占用了关键端口时,我们又该如何下手?

在下一篇中,我们将深入探索内存的迷雾,学习《内存疑云 - freelsof揭秘“消失”的内存与“神秘”的文件》,敬请期待!

举报

相关推荐

0 条评论