常用工具:iostat、vmstat 和 dstat

让我们从性能监控工具的三大法宝开始:

1. iostat:I/O 侦探

当磁盘 I/O 让你头疼时,iostat 就是你的阿司匹林。这个小工具可以为你提供所有设备的 CPU 利用率和 I/O 统计信息的快照。

$ iostat -xz 1
Linux 5.4.0-42-generic (myserver)     06/15/2023     _x86_64_    (4 CPU)

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           2.43    0.00    1.22    0.31    0.00   96.04

Device            r/s     w/s     rkB/s     wkB/s   rrqm/s   wrqm/s  %rrqm  %wrqm r_await w_await aqu-sz rareq-sz wareq-sz  svctm  %util
sda              0.35    2.13     14.44     34.96     0.00     0.57   0.00  21.05    0.57    2.50   0.01    41.54    16.43   0.40   0.10

这告诉了我们什么?嗯,我们的系统相当空闲。CPU 96% 的时间都在闲置,而我们的磁盘 (sda) 的利用率仅为 0.10%。

2. vmstat:内存大师

vmstat 是你了解系统内存的窗口。它显示从运行队列长度到交换使用的所有信息。

$ 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 6981496 191268 724132    0    0     3     5   36   79  2  1 97  0  0
 0  0      0 6981496 191268 724132    0    0     0     0  209  355  1  0 99  0  0

看看那个 free 列 - 我们有大约 7GB 的空闲内存。难怪我们的系统如此悠闲!

3. dstat:多面手

如果 iostatvmstat 有个孩子,那就是 dstat。这个多功能工具将 CPU、磁盘、网络、分页和系统统计信息结合在一个彩色输出中。

$ dstat -cdngy
----total-cpu-usage---- -dsk/total- -net/total- ---paging-- ---system--
usr sys idl wai stl| read  writ| recv  send|  in   out | int   csw 
  2   1  97   0   0|  14k   40k|   0     0 |   0     0 | 237   420 
  1   0  99   0   0|   0     0 |  66B  722B|   0     0 | 206   357 
  1   0  99   0   0|   0     0 |  60B  722B|   0     0 | 208   355 

这就是我所说的系统统计信息的一站式服务!

深入挖掘:不为人知的英雄

但等等,还有更多!让我们探索一些不太知名但同样强大的工具:

4. sar:时间旅行者

sar(系统活动报告器)就像是系统统计数据的时间机器。它可以显示历史数据,甚至生成漂亮的图表。

$ sar -u 1 3
Linux 5.4.0-42-generic (myserver)     06/15/2023     _x86_64_    (4 CPU)

13:00:01        CPU     %user     %nice   %system   %iowait    %steal     %idle
13:00:02        all      2.01      0.00      0.75      0.25      0.00     96.98
13:00:03        all      1.75      0.00      0.75      0.00      0.00     97.49
13:00:04        all      1.75      0.00      0.75      0.25      0.00     97.24
Average:        all      1.84      0.00      0.75      0.17      0.00     97.24

专业提示:使用 sar -A 查看所有统计信息。但要小心,这就像从消防水管中喝水!

5. perf:分析利器

当你需要深入分析时,perf 是你的探险装备。它可以分析 CPU 使用情况、跟踪系统调用,甚至分析缓存未命中。

$ sudo perf top
Samples: 42K of event 'cpu-clock', 4000 Hz, Event count (approx.): 5250000000 lost: 0/0 drop: 0/0
Overhead  Shared Object                    Symbol
   7.89%  [kernel]                         [k] _raw_spin_unlock_irqrestore
   4.32%  [kernel]                         [k] finish_task_switch
   3.21%  [kernel]                         [k] __schedule
   2.96%  [kernel]                         [k] schedule

看看这个!内核的 _raw_spin_unlock_irqrestore 函数占用了我们近 8% 的 CPU。也许是时候深入研究内核代码了?

情节加深:可视化性能

有时候,一张图片胜过千言万语。以下是一些图形化工具:

6. htop:交互式进程查看器

想象一下 top 的增强版。htop 为你提供了一个彩色的、交互式的进程视图。

htop screenshot
htop 的使用:视觉盛宴,脑力大餐。

7. atop:系统和进程监控器

atop 就像 top 的优秀表亲。它在一个视图中显示系统级计数器和每个进程的统计信息。

$ atop
ATOP - myserver                        2023/06/15  13:15:23                        ------------------------------
PRC | sys    1.85s | user   3.70s | #proc    213 | #zombie    0 | #exit      0 |
CPU | sys       2% | user      4% | irq       0% | idle    94% | wait      0% |
CPL | avg1    0.02 | avg5    0.05 | avg15   0.05 | csw    53592 | intr   43357 |
MEM | tot    15.5G | free    6.8G | cache 724.7M | buff  191.3M | slab  409.8M |
SWP | tot    15.9G | free   15.9G |              | vmcom   4.7G | vmlim  23.7G |
DSK |          sda | busy      0% | read     131 | write    644 | avio 2.50 ms |
NET | transport    | tcpi      37 | tcpo      36 | udpi       0 | udpo       0 |
NET | network      | ipi       37 | ipo       36 | ipfrw      0 | deliv     37 |
NET | eth0    ---- | pcki      19 | pcko      18 | si    1 Kbps | so    1 Kbps |

  PID SYSCPU USRCPU   VGROW  RGROW  RDDSK  WRDSK  ST EXC  S  CPU CMD       1/600
 1829  0.37s  0.73s      0K     0K     0K     0K  --   -  R   1% atop
    1  0.02s  0.03s      0K     0K     0K     0K  --   -  S   0% systemd

这就是我所说的信息过载!

秘密武器:自定义监控脚本

有时候,现成的工具不够用。这时你需要自己动手编写监控脚本。这里有一个简单的例子,结合了 iostatvmstat 数据:


#!/usr/bin/env python3

import subprocess
import time

def get_iostat():
    output = subprocess.check_output("iostat -c 1 1 | tail -n 2 | head -n 1", shell=True).decode()
    cpu_stats = output.split()
    return float(cpu_stats[5])  # %idle

def get_vmstat():
    output = subprocess.check_output("vmstat 1 2 | tail -n 1", shell=True).decode()
    stats = output.split()
    return int(stats[3])  # free memory

while True:
    cpu_idle = get_iostat()
    free_mem = get_vmstat()
    print(f"CPU Idle: {cpu_idle}%, Free Memory: {free_mem}K")
    time.sleep(5)

运行这个脚本,你就有了自己的迷你监控系统!

总结:成为系统性能的福尔摩斯

在低级别监控 Linux 系统就像是在赛博朋克小说中当侦探。你有工具(iostat、vmstat、dstat),有放大镜(perf),还有你的华生(自定义脚本)。关键是知道何时使用哪个工具,以及如何解释结果。

记住:

  • 从基础工具(iostat、vmstat、dstat)开始,快速概览
  • 需要时使用专用工具如 perf 深入分析
  • 用 htop 和 atop 可视化数据,获得不同视角
  • 不要害怕为你的特定需求编写自定义脚本

最重要的是,多练习!你监控的系统越多,你就越能发现异常并解决性能问题。

思考的食粮

“最有效的调试工具仍然是仔细的思考,加上适当的打印语句。” — Brian Kernighan

虽然我们有这些花哨的工具,但有时最好的方法是退后一步,认真思考问题,也许再加上一些战略性的 echo 语句。不要让工具掩盖了你的问题解决能力!

接下来是什么?

现在你已经掌握了这些知识,为什么不设置一个测试环境并开始实验呢?尝试模拟不同的负载场景,看看这些工具如何响应。或者更好的是,将这些技术应用于你面临的实际问题。毕竟,实践出真知!

祝你监控愉快,愿你的系统始终高效!