从卡住的服务器说起
上周三晚上,公司一台运行订单服务的Linux服务器突然响应变慢,SSH登录都卡得不行。运维同事第一反应是看CPU和内存,top命令一跑,发现某个Java进程占了90%以上的CPU。这时候就得上调试手段了。
定位问题进程
先用ps找到具体进程ID:
ps aux | grep java拿到PID后,可以结合top -p实时观察资源占用变化。如果怀疑是死循环或线程阻塞,下一步就该查线程状态了。
查看线程堆栈信息
对于Java应用,jstack是个好帮手:
jstack <PID>输出里能看到哪些线程在RUNNABLE、BLOCKED还是WAITING状态。有一次我们发现一个线程一直在执行同一个方法调用,明显是代码逻辑出问题了。
系统级跟踪工具strace
不是所有程序都是Java写的。有个Python脚本跑着跑着就卡住,看不到日志输出。这时候用strace能看清它到底在干什么:
strace -p <PID>屏幕上刷出一堆read调用,一直返回0,说明程序在等输入但没人给。原来是启动时漏了重定向标准输入。
网络问题怎么查
服务连不上数据库?别急着重启。先看看端口通不通:
netstat -tulnp | grep 3306或者更现代一点的ss命令:
ss -tulnp | grep 3306要是发现本地没监听,再查防火墙规则:
iptables -L -n | grep 3306有一次就是中间机器开了防火墙,挡了数据库端口,开发还以为是代码配置错了。
日志永远是第一线索
/var/log/目录别忽略。messages、syslog、dmesg这些文件经常藏着关键信息。比如一次内核报错显示磁盘I/O异常,顺着查下去才发现是RAID阵列有块硬盘快挂了。
用tail实时盯着日志也很常见:
tail -f /var/log/nginx/error.log刷新网页的同时看日志有没有新条目,能快速判断是不是请求触发了错误。
小工具大用途
lsof看文件句柄:
lsof -i :8080df查磁盘空间,du看目录大小。有次网站打不开,一查df结果根分区100%满了,清掉几个旧日志立马恢复。
调试不一定要复杂工具,组合使用基础命令往往最快见效。关键是清楚每一步想验证什么,而不是盲目敲命令。”}