一、整体概览
# 系统负载(1/5/15 分钟)
uptime
# 16:30:01 up 30 days, 2:15, 1 user, load average: 4.20, 3.80, 3.10
# 实时进程
top -c
htop # 更友好
# 综合性能(需安装 sysstat)
vmstat 1 5
二、CPU 排查
# 查看每个 CPU 核心使用率
mpstat -P ALL 1
# 查看进程 CPU 占用
pidstat -u 1 5
# 找出最耗 CPU 的线程
top -Hp <pid>
printf "%x\n" <tid> # 转成 16 进制
jstack <pid> | grep -A 20 <nid> # Java 应用
关键指标:
us高:用户态代码问题(算法、死循环)sy高:内核态(频繁系统调用、上下文切换)wa高:等待 IO(磁盘瓶颈)cs高:上下文切换频繁
三、内存排查
free -h
# total used free shared buff/cache available
# Mem: 7.7G 3.2G 1.1G 200M 3.4G 4.0G
# 查看进程内存
ps aux --sort=-%mem | head -10
# 查看内存泄漏
pmap -x <pid> | tail -1
四、磁盘 IO
# 磁盘使用率
df -h
# 各分区 IO 情况
iostat -x 1
# 找出占用大的目录
du -sh /var/* | sort -hr | head
# 找出被删除但仍占用空间的文件
lsof | grep deleted
iostat 关键列:%util(设备繁忙度,>80% 说明饱和)、await(IO 等待时间)
五、网络排查
# 连接统计
ss -antp | awk '{print $1}' | sort | uniq -c
# 查看端口占用
ss -lntp | grep 8080
# 实时流量
iftop
nethogs
# 抓包
tcpdump -i eth0 port 80 -w /tmp/http.pcap
六、实战案例:CPU 突然飙到 800%
现象:监控告警,某 Java 服务 CPU 800%,接口大量超时。排查过程:
# 1. 找到进程
top -c # PID 23451,CPU 800%
# 2. 找线程
top -Hp 23451 # 线程 23480 占用 780%
printf "%x\n" 23480 # 5bb8
# 3. 导出堆栈
jstack 23451 > /tmp/stack.txt
grep -A 30 "nid=0x5bb8" /tmp/stack.txt
根因:正则表达式灾难性回溯(ReDoS),某条用户输入的字符串导致 Pattern 匹配进入指数级回溯。
修复:
// 问题代码
Pattern.compile("^(a+)+$");
// 修复:加超时或使用非回溯写法
Pattern.compile("^a+$");
七、常用一行命令
# 统计访问最多的 IP
awk '{print $1}' access.log | sort | uniq -c | sort -nr | head
# 统计耗时最长的接口
awk '{print $7, $NF}' access.log | sort -k2 -nr | head
# 监控某进程网络流量
watch -n 1 'cat /proc/<pid>/net/dev'
评论(0)
还没有评论,来说两句吧