【Linux从入门到精通】第20篇:性能监控工具大盘点
目录
一、引言:性能排查的思维框架
二、系统全局:快速浏览硬件与资源概况
2.1 nproc 和 lscpu:看清CPU家底
2.2 free:内存概况
三、vmstat:系统整体负载
四、iostat:磁盘I/O深度分析
五、mpstat 和 pidstat:CPU问题定位
5.1 mpstat:查看每个CPU核心的使用率
5.2 pidstat:查看每个进程的CPU和I/O
六、网络性能监控
6.1 查看网络吞吐量
6.2 sar:历史性能数据回溯
七、dstat:全能的监控仪表盘
八、综合实战:性能诊断的标准套路
九、工具速查表
十、本篇小结与阶段总结
本篇核心
第二阶段总结
动手练习
十一、下篇预告
一、引言:性能排查的思维框架
“服务器响应变慢了”——这是一道开放题。可能的原因有:
CPU在拼命计算(CPU瓶颈)
内存不够,疯狂换页(内存瓶颈)
磁盘读写不过来(I/O瓶颈)
网络带宽被打满(网络瓶颈)
面对这种情况,最忌讳的是“凭直觉乱猜”。猜错了方向,可能折腾半天换内存、升级CPU,最后发现是日志文件把磁盘写满了。
性能排查有一条黄金法则:先用宏观工具看整体,找到异常指标,再深入该子系统分析。
text
系统整体负载 → CPU → 内存 → 磁盘I/O → 网络
本篇按这个顺序逐一展开。
二、系统全局:快速浏览硬件与资源概况
2.1 nproc 和 lscpu:看清CPU家底
接到告警先弄清机器的“硬实力”,否则80%的CPU使用率在2核和32核机器上完全不是一个概念。
bash
# 查看CPU核心数(物理核 + 逻辑核) nproc # 查看CPU详细信息:型号、频率、缓存、NUMA拓扑 lscpu
lscpu关键字段:
Model name:CPU型号(区分云服务器虚拟化CPU和物理机)CPU(s):逻辑CPU总数(包括超线程)Thread(s) per core:每核线程数(1=无超线程,2=开了超线程)NUMA node(s):NUMA节点数(多路服务器的内存亲和性参考)
2.2 free:内存概况
bash
free -h
输出解读:
text
total used free shared buff/cache available Mem: 7.7G 2.3G 1.2G 450M 4.2G 4.8G Swap: 2.0G 512M 1.5G
关键认知——不要把free列当“剩余内存”:
free:完全未被使用的内存buff/cache:系统用来缓存文件的内存,可以随时释放给应用使用available:应用程序真正可用的内存(free + 大部分buff/cache)
判断内存是否够用,看
available列,不是free列。Linux的哲学是“空着的内存是浪费”,它会积极用空闲内存做缓存加速I/O。
Swap使用:
少量Swap被使用(几百MB)是正常的
大量Swap被使用 + 高换页活动 = 内存严重不足,性能会急剧下降
三、vmstat:系统整体负载
vmstat(Virtual Memory Statistics)一次性展示CPU、内存、I/O、系统整体的概览,是排查问题的第一站。
bash
# 每2秒输出一次,输出5次 vmstat 2 5
输出示例:
text
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu----- r b swpd free buff cache si so bi bo in cs us sy id wa st 2 0 524288 125000 210000 4300000 0 1 12 25 120 300 5 2 88 5 0 3 1 524288 124000 210000 4300000 0 0 150 350 450 800 15 5 60 20 0
字段分组解读:
| 类别 | 字段 | 含义 | 异常判定 |
|---|---|---|---|
| 进程 | r | 运行队列长度(等待CPU的进程数) | 持续 > CPU核心数 = CPU瓶颈 |
| 进程 | b | 不可中断睡眠的进程数(等待I/O) | 持续 > 0 = I/O瓶颈 |
| 内存 | swpd | 已使用的Swap(KB) | 持续增长 = 内存不足 |
| 内存 | free/buff/cache | 内存分布 | buff/cache高是正常的 |
| Swap | si | 从Swap读入内存的速率(KB/s) | > 0 说明有换页活动,持续高 = 内存不足 |
| Swap | so | 写出到Swap的速率(KB/s) | > 0 持续高 = 严重内存不足 |
| I/O | bi | 从块设备读入的速率(KB/s) | 突然飙升 = I/O密集操作 |
| I/O | bo | 写出到块设备的速率(KB/s) | 突然飙升 = I/O密集操作 |
| 系统 | in | 每秒中断数 | 突然极高 = 硬件/驱动异常 |
| 系统 | cs | 每秒上下文切换数 | 极高 + 高CPU = 大量线程/进程争抢 |
| CPU | us | 用户态CPU时间(%) | 高 = 应用程序在消耗CPU |
| CPU | sy | 内核态CPU时间(%) | 高 = 系统调用/I/O操作频繁 |
| CPU | id | 空闲时间(%) | — |
| CPU | wa | 等待I/O的时间(%) | 持续 > 10% = I/O瓶颈 |
黄金诊断组合:
r列高 +us高 → CPU计算瓶颈(应用程序在拼命算)r列不高 +wa高 → I/O瓶颈(CPU在等磁盘)b列有值 → 确认I/O瓶颈(进程卡在D状态)si/so持续 > 0 → 内存不足,已开始换页
四、iostat:磁盘I/O深度分析
当vmstat发现wa高或bi/bo大时,用iostat进一步确认是哪块磁盘、什么原因。
bash
# 安装(sysstat包) sudo apt install sysstat -y # Ubuntu/Debian sudo dnf install sysstat -y # CentOS/RHEL # 每2秒输出一次,显示扩展统计 iostat -x 2
关键字段:
| 字段 | 含义 | 异常判定 |
|---|---|---|
r/s+w/s | 每秒读写请求数(IOPS) | 接近磁盘IOPS上限即瓶颈 |
rkB/s+wkB/s | 每秒读写数据量(吞吐量) | 接近磁盘或带宽上限即瓶颈 |
await | 平均每次I/O请求的等待时间(ms) | HDD > 20ms 或 SSD > 5ms 值得关注 |
svctm | 平均每次I/O的服务时间(ms) | 已废弃,不要参考 |
%util | 设备繁忙度 | 接近100% = 磁盘饱和(HDD参考,SSD可超100) |
IOPS vs 吞吐量:
随机读写(数据库场景)→ 关注
r/s、w/s(IOPS)顺序读写(日志、视频文件)→ 关注
rkB/s、wkB/s(吞吐量)
一个诊断建议:先用iostat -x 1看await和%util。如果await持续较高(HDD > 20ms,SSD > 5ms),说明磁盘响应变慢,再结合r/s和w/s判断是随机读写过多还是设备性能不足。
五、mpstat 和 pidstat:CPU问题定位
5.1 mpstat:查看每个CPU核心的使用率
当top显示CPU使用率高时,mpstat告诉你各核心负载是否均衡——有时候是单个核心被打满,其他核心闲着。
bash
# 每2秒输出所有CPU核心的统计 mpstat -P ALL 2
关注点:
各核心的
%usr和%sys是否均衡如果某一核心的
%soft(软中断)极高,可能是网卡中断处理全压在一个核上
5.2 pidstat:查看每个进程的CPU和I/O
bash
# 查看进程的CPU使用情况(每秒刷新) pidstat 1 # 查看进程的I/O情况 pidstat -d 1
pidstat -d会显示每个进程的读写速率,是定位“哪个进程在疯狂读写磁盘”的直接手段。
六、网络性能监控
6.1 查看网络吞吐量
bash
# 查看网卡统计(累计值) ip -s link show eth0 # 实时查看网卡流量(需要nload) sudo apt install nload nload eth0
6.2 sar:历史性能数据回溯
sar是排查“刚才发生了什么”的神器(它是sysstat包的一部分)。
bash
# 查看今天的CPU使用历史(每10分钟的采样点) sar # 查看今天的内存使用历史 sar -r # 查看今天的磁盘I/O历史 sar -b # 查看今天某个时间段的记录 sar -s 10:00:00 -e 11:00:00
sar的数据由定时采集脚本(/etc/cron.d/sysstat)写入日志,即使事故当时你不在电脑前,事后也能回溯分析。
七、dstat:全能的监控仪表盘
dstat整合了vmstat、iostat、netstat的功能,在一个界面中同时展示多维度数据。
bash
# 安装 sudo apt install dstat -y sudo dnf install dstat -y # 基本使用(默认显示CPU、磁盘、网络、分页、系统) dstat # 显示更多:含CPU、磁盘、网络、内存、进程统计 dstat -cdngy
输出示例:
text
--total-cpu-usage-- -dsk/total- -net/total- ---paging-- ---system-- usr sys idl wai stl| read writ| recv send| in out | int csw 5 2 88 5 0| 12k 25k| 0 0 | 0 0 | 120 300
常用组合:dstat -cdngy 2——每2秒刷新,含CPU、磁盘、网络、内存、系统统计。
对比前面的分段工具,dstat的优势是实时、全面、一个窗口看完所有维度。但它没有历史记录功能,不如sar适合事后追溯。
八、综合实战:性能诊断的标准套路
当收到“服务器好慢”的告警时,按以下流程逐层排查:
第一步:快速确认全局状态
bash
uptime # 看系统负载和运行时长 free -h # 看内存概况 df -h # 确认磁盘空间(满了什么都慢) vmstat 2 5 # 关注r、b、wa、si/so列
第二步:根据vmstat的判断,选择深入方向
text
r值持续 > CPU核心数 → CPU瓶颈 → 步骤A b值 > 0 或 wa > 10% → I/O瓶颈 → 步骤B si/so持续 > 0 → 内存瓶颈 → 步骤C
步骤A:CPU瓶颈排查
bash
top # 按P排,找出吃得最狠的进程 mpstat -P ALL 2 # 看所有CPU核心负载分布 pidstat 1 # 看各进程CPU使用率变化
步骤B:I/O瓶颈排查
bash
iostat -x 2 # 确认哪块磁盘await高 pidstat -d 1 # 揪出在疯狂读写的进程 # 如果是日志疯狂写入 → 检查logrotate是否失效 # 如果是数据库 → 检查慢查询
步骤C:内存瓶颈排查
bash
free -h # 确认available是否接近零 ps aux --sort=-%mem | head -10 # 找出内存大户 # 检查是否有进程的内存持续增长 → 内存泄漏 # 检查是否有大量子进程 → 调整并发数或worker数
第三步:如果CPU、I/O、内存都正常,检查网络
bash
ss -s # Socket统计 ip -s link show eth0 # 看是否有大量错误包或丢包 ping -c 10 网关IP # 看是否存在网络抖动
第四步:如果当前一切正常,查历史
bash
sar -s "事发时间-30分钟" -e "事发时间+30分钟" # 回溯事发时段的CPU、内存、I/O趋势
九、工具速查表
| 工具 | 核心用途 | 标志性用法 |
|---|---|---|
uptime | 系统负载和运行时长 | uptime |
lscpu | CPU硬件信息 | lscpu |
nproc | CPU核心数 | nproc |
free -h | 内存概况 | free -h |
vmstat | 系统整体负载(含I/O、Swap) | vmstat 2 5 |
iostat | 磁盘I/O深度分析 | iostat -x 2 |
mpstat | 每核CPU使用率 | mpstat -P ALL 2 |
pidstat | 进程级CPU和I/O | pidstat 1 |
sar | 历史性能数据回溯 | sar -s 10:00 -e 11:00 |
dstat | 全维度实时监控 | dstat -cdngy 2 |
十、本篇小结与阶段总结
本篇核心
性能诊断不是玄学,而是基于指标的结构化分析:
先用vmstat看全局:r/b/wa/si/so五列锁定问题方向
再根据方向用专用工具深入:CPU用mpstat/pidstat,I/O用iostat,内存用free和ps
事后分析用sar:回溯历史趋势,发现无法复现的问题
实时综合监控用dstat:一个窗口看所有维度
第二阶段总结
至此,Linux从入门到精通第二阶段(核心机制与系统管理)全部完成。回顾一下我们走过了什么:
| 篇目 | 主题 | 核心技能 |
|---|---|---|
| 11 | 进程管理 | ps、top、进程状态 |
| 12 | 进程控制 | 前后台切换、kill信号、nohup/screen |
| 13 | 磁盘管理 | df/du、lsblk、mount、fstab |
| 14 | 引导流程 | BIOS→GRUB→Kernel→systemd,单用户模式 |
| 15 | systemd | systemctl管理服务,编写.service文件 |
| 16 | 计划任务 | crontab、at、logrotate |
| 17 | 日志系统 | journalctl、/var/log、内核报错 |
| 18 | 网络配置 | ip、ping、traceroute、ss |
| 19 | SSH进阶 | 密钥登录、~/.ssh/config、scp/sftp |
| 20 | 性能监控 | vmstat/iostat/pidstat,诊断套路 |
你现在已经具备了系统管理员的核心能力。但成为真正的Linux高手,还需要一项关键技能:Shell脚本编程——用程序化的方式将前面所学的所有命令组合成自动化方案。
动手练习
bash
# 1. 用时3分钟做一次完整的系统体检 echo "=== 时间 ===" && date echo "=== 运行时长和负载 ===" && uptime echo "=== CPU信息 ===" && nproc echo "=== 内存概况 ===" && free -h echo "=== 磁盘空间 ===" && df -h / echo "=== 系统整体负载 (只取1次) ===" && vmstat 1 1 | tail -1 echo "=== 磁盘I/O (只取1次) ===" && iostat -x 1 1 | grep -v "^$" echo "=== 网络监听端口 ===" && ss -tlnp echo "=== 内存占用Top5 ===" && ps aux --sort=-%mem | head -6 # 2. 用dstat做一次持续1分钟的监控(每5秒一次) dstat -cdngy 5 12
十一、下篇预告
第三阶段我们将开启Shell脚本编程——从入门到自动化。
下一篇《Shell脚本开篇——什么是Shell?写第一个Hello World》将带你理解Shell的本质,学习Shebang的作用、脚本的执行方式、变量的定义与引用。从“敲命令”到“写脚本”,这是自动化能力的第一个台阶。
延伸思考:上面的系统体检命令集,每次都要逐条执行很麻烦。如果把它们封装成一个文件,执行一次就自动输出所有结果,该多方便!这就是Shell脚本的意义——让命令的组合可复用、可分享、可调度。下一篇见。
