场景:半夜被报警吵醒,老板群里催命,用户抱怨网站打不开。
目标:用最短的时间(60秒)找出哪个硬件资源(CPU/内存/磁盘/网络)出问题了,然后立刻**"止血"**。
原则:
uptime
load值 dmesg -T tail
vmstat 1 3
r iOStat -xzm 1 3
%util free -m
available sar -n DEV 1 3 grep eth0
网卡流量 ss -s
TIME_WAIT lsof wC++ -l
文件句柄数 ps --sort=-%cpu head
最耗CPU的进程 ps --sort=-%mem head
最耗内存的进程 df -h
磁盘使用率 journalctl -k -p err -n 10
内核报错
uptime
03:12:45 up 45 days, load average: 48.2, 46.8, 32.0
vmstat 1 3
r b swpd free buff cache si so bi bo in cs us sy id wa st
48 2 0 200M 1.9G 6.3G 0 0 120 240 103k 142k 95 5 0 0 0
iOStat -xzm 1 3
Device rMB/s wMB/s %util await
sda 0.2 450 98.5 210
free -m
total used free shared buff/cache available
128G 125G 1.2G 0.5G 1.9G 600M
CPU爆满 cpulimit -p <PID> -l 50
磁盘IO爆满 ionice -c3 -p <PID>
内存+swap爆满 echo 3 > /proc/sys/vm/drop_caches
#!/bin/bash
# 60秒巡检脚本,结果保存在/tmp/pt60.log
{
echo "=== $(date) ==="
uptime
dmesg -T | tail -n 5
vmstat 1 3 | tail -n 1
iostat -xzm 1 2 | tail -n +4 | awk 'NR%3==0'
free -m
ss -s
sar -n DEV 1 1 | tail -n +3 | awk 'NR%2==0'
ps -eo pid,%cpu,%mem,comm --sort=-%cpu | head -6
ps -eo pid,%cpu,%mem,comm --sort=-%mem | head -6
df -h | awk 'int($5)>90'
} | tee /tmp/pt60.log
用法:
chmod +x pt60.sh
./pt60.sh
口诀:
"load高先看CPU,CPU没事看磁盘;内存爆了清缓存,网络满了先限流;盘满删大文件,内核报错准备溜。"