常用工具: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:多面手
如果 iostat
和 vmstat
有个孩子,那就是 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
为你提供了一个彩色的、交互式的进程视图。
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
这就是我所说的信息过载!
秘密武器:自定义监控脚本
有时候,现成的工具不够用。这时你需要自己动手编写监控脚本。这里有一个简单的例子,结合了 iostat
和 vmstat
数据:
#!/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
语句。不要让工具掩盖了你的问题解决能力!
接下来是什么?
现在你已经掌握了这些知识,为什么不设置一个测试环境并开始实验呢?尝试模拟不同的负载场景,看看这些工具如何响应。或者更好的是,将这些技术应用于你面临的实际问题。毕竟,实践出真知!
祝你监控愉快,愿你的系统始终高效!