服务器出问题的时候,第一件事不是翻代码,是先看系统层面的指标。说几个我每次排查必看的点。
1. CPU — 别只看 %user
top 里除了 %user,还要看 %iowait 和 %steal。%iowait 高说明磁盘扛不住了,%steal 高说明宿主机在抢资源(虚拟机场景)。如果 %user 不高但机器感觉慢,经常是 iowait 在作祟。
2. 内存 — 注意 cached 和 buffers
free -h 显示 used 很高别慌。Linux 会把空闲内存拿去做缓存和 buffer,available 那列才是真正可用的。很多运维新手一看 used 90% 就以为内存不够了,其实可能是缓存占着,应用申请的时候可以回收。
3. 磁盘 — 看 await 和 %util
iostat -x 1 里的 await 是 I/O 请求平均处理时间,一般超过 10ms 就要注意了。%util 到 100% 不一定是磁盘满负荷,要看实际的 IOPS 和吞吐量是不是到了硬件上限。单块机械盘顺序读写大概 150-200MB/s,普通 SSD 500MB/s,如果实测差太多,可能就是链路或者驱动问题。
4. 网络 — 看丢包和重传
netstat -s | grep -i retransmit 看 TCP 重传率,超过 0.5% 说明网络链路有问题。sar -n DEV 1 看网卡流量和错误包,rxdrop 和 txdrop 不为 0 说明网卡或者驱动层面有瓶颈。
5. 进程 — strace 比猜根因快
如果 CPU 和 IO 都正常,但某个进程行为诡异,直接 strace -p <pid> -c 看系统调用耗时。之前有个 case,某进程动不动卡住,top 看不出来,strace 一看发现是 flock 等锁等了半分钟。不 strace 的话可能还要排查半天日志。
以上是我自己的排查思路,不一定全面,但覆盖了 80% 的场景。