DAY 13 进程与系统监控:top/htop/ps/pstree/jstat 一眼定位瓶颈
——最小可行清单 · 第 13 天(1 h 上手)
今日目标
- 用
ps
+grep
快速抓进程;pgrep
一键 PID top
变身为htop
,看懂 CPU、内存、Load 三色柱pstree
看父子关系,lsof
找打开文件/端口- 用
vmstat
/iostat
/jstat
判 CPU、IO、GC 瓶颈 - 写 10 行脚本:CPU>80% 自动 dump 线程栈
1. ps:静态快照第一枪
BSD 风格(带柱):
ps aux | head # a=所有终端 u=用户 x=无终端
ps aux | grep nginx # 抓 nginx
GNU 风格(可排序):
ps -eo pid,ppid,cmd,%cpu,%mem --sort=-%cpu | head
只拿 PID:
pgrep -f nginx # -f 匹配整行
pgrep -u $USER -f java # 仅当前用户
2. top → htop:交互式监控
安装:
sudo apt install htop # Debian/Ubuntu
sudo yum install htop # RHEL/CentOS
关键区域(图在上,文在下)
- 1 栏:CPU bars(低<40% 绿,高>80% 红)
- 2 栏:内存/交换(used/cache/buff)
- Load average:1/5/15 分钟队列长度,>CPU 核数即排队
交互键
| 键 | 功能 | |----|------| | F6 | 排序字段(CPU、MEM、TIME) | | t | 树状父子进程 | | / | 搜索进程 | | P | 按 CPU 排序 | | M | 按内存排序 |
3. pstree:一眼看家谱
pstree -p | less # 带 PID
pstree -p $USER # 仅当前用户
高亮线程:
pstree -p 1234 | grep java # 某进程的线程树
4. lsof:文件、端口、PID 三合一
谁占用了 80 端口:
sudo lsof -i :80
某进程打开哪些文件:
lsof -p $(pgrep mysql)
被删除但仍占用空间的文件:
sudo lsof | grep '(deleted)'
5. vmstat:系统级瓶颈 1 秒刷新
vmstat 1 # 每秒 1 行
重点列:
r
运行队列线程数,>CPU 核即饱和wa
IO 等待 CPU 占比,>15% 磁盘瓶颈si/so
交换进出,非 0 表示内存不足
6. iostat:磁盘 IO 细分
安装:
sudo apt install sysstat
查看:
iostat -x 1 # -x 扩展,1 秒刷新
关键指标:
%util
设备利用率,>80% 瓶颈await
平均等待毫秒,>20ms 慢盘svctm
服务时间(接近 await 则排队)
7. jstat:JVM 性能雷达
GC 情况 1 秒刷新:
jstat -gc $(pgrep java) 1s
重点列:
EU/OU
Eden/Old 使用量YGC/FGC
Young/Full GC 次数YGCT/FGCT
耗时,>5% 总时间需调优
8. 综合实战:CPU>80% 自动 dump 线程
脚本 cpu_dump.sh
:
#!/bin/bash
# 每 30 秒检查,连续 3 次超 80% 则 jstack
THRESH=80
CNT=0
while true; do
CPU=$(top -bn1 | grep java | head -1 | awk '{print $9}' | cut -d'.' -f1)
[[ -z $CPU ]] && { sleep 30; continue; }
if [[ $CPU -gt $THRESH ]]; then
((CNT++))
if [[ $CNT -ge 3 ]]; then
PID=$(pgrep java)
jstack $PID > /tmp/jstack_$(date +%F_%T).log
echo "High CPU $CPU%, dumped stack" >&2
CNT=0
fi
else
CNT=0
fi
sleep 30
done
后台运行:
chmod +x cpu_dump.sh
nohup ./cpu_dump.sh &
9. 一行监控组合拳
# 内存 Top 10
ps aux --sort=-%mem | head -n 10
# CPU Top 10
ps aux --sort=-%cpu | head -n 10
# 网络实时流量
sudo nethogs # 需安装 nethogs
10. 常见坑速查
现象 | 原因 | 修复 |
`ps aux | grep java` 把自己 grep 出来 | 关键字匹配 |
top 中 CPU >100% | 多核累加,按 1 看各核 | 正常 |
jstat 报 “not found” | 未装 JDK |
|
11. 今日打卡(1 分钟)
- [ ] 用
ps aux
或pgrep
找到任意进程 PID - [ ] 打开
htop
并看懂 CPU、内存、Load 三色柱 - [ ] 用
lsof -i :端口号
查出监听程序 - [ ] 运行
vmstat 1
或iostat -x 1
识别一次 CPU/IO 瓶颈
全部打勾 → 进程监控通关!
DAY 14 预告:网络故障四件套 ping/ss/traceroute/tcpdump
,从“不通”到“抓包”一条龙!