4、故障排查工具链:Linux常用命令(top/df/curl)、网络诊断(ping/telnet/traceroute)、进程管理(ps/systemctl)

做自动化运维这些年,我越来越觉得——工具链就是你的第二双手。故障来了,你慌不慌,就看这双手够不够快。今天咱们就把这套「排查三板斧」掰开揉碎讲清楚。

4.1 系统状态三剑客:top、df、curl

先说 top。这玩意儿我每天至少敲十次。它告诉你CPU谁在吃、内存谁在占、负载高不高。我个人习惯先看 load average 那三个数——如果第三个值(15分钟平均)都超过CPU核数了,那基本可以断定系统已经「喘不过气」了。

关键指标速查:

  • %us:用户态CPU占用。太高说明应用在疯狂计算。
  • %sy:内核态CPU占用。超过30%要警惕,可能是系统调用太频繁。
  • %wa:I/O等待。这个值一高,磁盘大概率是瓶颈。
  • RES:常驻内存。比VIRT靠谱,VIRT很多是共享库,虚的。

有一次线上告警说服务响应慢,我上去一看 top,%wa 飙到 60%。我当时就判断是磁盘I/O问题,结果一查,是日志轮转脚本卡住了。嗯,有时候问题就这么直白。

再说 df -h。磁盘满了,服务分分钟挂给你看。我建议你养成习惯:每天巡检先跑一遍 df -h,看看 /、/var、/data 这些关键分区。特别是 /var/log,日志写满磁盘的事故我见过不下十次。

我的小技巧:df -i 看inode使用率。有时候磁盘没满,但inode用光了,文件照样写不进去。我曾经被这个坑过——一个临时文件目录里生成了几百万个小文件,df -h 显示还有50%空间,但服务就是报错「磁盘空间不足」。查了半天才发现是inode满了。

最后是 curl。这工具太实用了。我排查HTTP接口问题时,第一反应就是 curl -v 看完整交互过程。你想想看,服务返回500还是502,响应时间是1秒还是10秒,一目了然。

# 常用curl调试参数
curl -v http://localhost:8080/health    # 看完整请求响应
curl -I http://example.com              # 只看响应头
curl -o /dev/null -s -w '%{http_code}: %{time_total}s\n' http://example.com  # 只输出状态码和耗时

注意:curl 默认不跟随重定向。如果接口返回301/302,记得加 -L 参数。我见过有人对着302看了半天,以为服务挂了。

4.2 网络诊断三板斧:ping、telnet、traceroute

网络问题排查,说白了就是回答三个问题:通不通?端口开没开?路径对不对?

ping 回答第一个问题。它能告诉你目标主机是否可达,以及网络延迟大概多少。但注意,ping不通不一定是网络问题——有些服务器禁ping。我曾经排查过一个案例,ping不通但业务正常,最后发现是安全组把ICMP给禁了。

telnet 回答第二个问题。它测试的是TCP端口连通性。比如你要确认MySQL的3306端口是否开放:

telnet 192.168.1.100 3306

如果出现 Connected to 192.168.1.100,说明端口通了。如果卡住不动或者报 Connection refused,那要么端口没开,要么防火墙拦了。

避坑指南:我曾经用telnet测试Redis端口,发现连不上。查了半天防火墙、安全组都没问题。最后发现——Redis绑定了127.0.0.1,只允许本机访问。所以telnet不通时,先确认服务监听地址对不对。

traceroute 回答第三个问题。它追踪数据包从你机器到目标机器的路径。当网络慢或者丢包时,traceroute能帮你定位是哪个节点出了问题。

traceroute -n www.example.com  # -n 参数不解析域名,速度快很多

看输出时,重点关注那些 * * * 或者延迟突然飙升的跳点。如果某个中间节点连续丢包,那问题大概率出在那一段。

4.3 进程管理:ps 与 systemctl

进程管理这块,pssystemctl 是我最常用的两个命令。一个管「活的进程」,一个管「服务状态」。

ps aux 是我排查进程问题的起手式。它能列出所有进程的CPU、内存、启动时间等信息。我一般会配合 grep 过滤:

ps aux | grep java          # 找Java进程
ps aux --sort=-%cpu | head  # 看CPU占用最高的10个进程
ps aux --sort=-%mem | head  # 看内存占用最高的10个进程

有一次服务莫名其妙重启了,我查了半天日志没找到原因。后来用 ps -eo pid,lstart,cmd | grep myapp 看进程启动时间,发现凌晨3点重启过一次。再配合 journalctl 一查,是OOM Killer把进程干掉了。嗯,内存泄漏。

实用技巧:想看进程的父子关系?用 ps -ef --forest。它会以树形结构展示进程,一眼就能看出谁是谁的子进程。排查僵尸进程时特别好用。

systemctl 是管理systemd服务的标准工具。我建议你记住这几个常用操作:

命令 作用
systemctl status xxx 查看服务状态(最常用)
systemctl restart xxx 重启服务
systemctl enable xxx 设置开机自启
systemctl list-units --type=service 列出所有服务
journalctl -u xxx 查看服务的日志(配合排查利器)

注意:systemctl status 显示的是服务当前状态,但有时候服务进程还在跑,systemctl却显示 inactive。为什么?因为服务可能不是通过systemd启动的。我遇到过有人手动执行了启动脚本,systemctl 当然不认。所以排查时,ps 和 systemctl 要结合着看。

好了,这套工具链你掌握了,大部分故障都能快速定位。说白了,排查就像破案——工具是放大镜,经验才是关键。多练,多踩坑,你也能成为那个「看一眼就知道问题在哪」的人。