一、排查思路框架(先说这个,展现系统性)
标准回答开场白:
"线上服务排查,我会遵循**'从外到内、从大到小、从现象到根源'**的思路:
先确认现象:什么问题?影响范围多大?
检查外部依赖:网络、DNS、防火墙
检查服务器状态:负载、内存、磁盘
检查应用状态:进程、端口、日志
深入分析:特定服务的详细检查"
二、具体排查命令与步骤
第1步:快速判断服务整体状态
# 1. 服务是否在运行?
systemctl status nginx # 查看服务状态
ps -ef | grep java # 查看Java进程
netstat -tlnp | grep :8080 # 查看端口占用
# 2. 服务器整体健康度
top -n 1 # CPU、内存使用情况
df -h # 磁盘空间
free -h # 内存详情
uptime # 负载情况
# 3. 最近发生了什么?
dmesg | tail -20 # 系统日志最后20行
journalctl -xe --since "5 min ago" # 近5分钟系统日志
第2步:网络与连接检查
# 1. 服务端口是否监听?
ss -tlnp | grep :8080 # 比netstat更快
lsof -i:8080 # 查看谁在监听8080
# 2. 本地能访问吗?(排除网络问题)
curl -I http://localhost:8080 # 本地HTTP检查
telnet 127.0.0.1 8080 # TCP端口连通性
# 3. 防火墙是否允许?
iptables -L -n | grep 8080 # 查看防火墙规则
firewall-cmd --list-all # firewalld查看
# 4. 外部能访问吗?(服务端测试)
curl -v http://localhost:8080/health # 详细请求
nc -zv 127.0.0.1 8080 # 快速端口测试
第3步:应用详细诊断
Java 服务检查
# 1. Java进程状态
jps -mlv # 查看所有Java进程
ps -ef | grep java | grep -v grep # 查找Java进程
# 2. 查看JVM状态
jstat -gcutil <pid> 1000 5 # GC情况,每秒1次共5次
jmap -heap <pid> # 堆内存情况
jstack <pid> > thread_dump.txt # 线程转储,分析死锁
# 3. 日志检查
tail -f /app/logs/application.log # 实时查看日志
tail -100 /app/logs/error.log # 查看最后100行
grep -i "error\|exception" /app/logs/*.log # 搜索错误
Web 服务检查(Nginx/Tomcat)
# Nginx
nginx -t # 配置文件语法检查
tail -f /var/log/nginx/error.log # 错误日志
systemctl restart nginx # 重启服务(谨慎)
# Tomcat
tail -f /opt/tomcat/logs/catalina.out # 控制台日志
ps -ef | grep tomcat # 查看Tomcat进程
第4步:资源与性能分析
# 1. 实时监控
htop # 增强版top
nmon # 性能监控工具
vmstat 1 5 # 系统性能,每秒1次共5次
# 2. 磁盘I/O检查
iostat -x 1 3 # I/O统计
iotop # 磁盘I/O进程排行
# 3. 网络连接分析
netstat -nat | awk '{print $6}' | sort | uniq -c # 连接状态统计
ss -s # socket统计
第5步:特定问题场景排查
场景1:CPU 使用率高
# 1. 找到占用CPU的进程
top -c # 显示完整命令
ps aux --sort=-%cpu | head -10 # CPU使用率排序
# 2. Java进程CPU高分析
top -Hp <pid> # 查看进程的所有线程
jstack <pid> | grep -A 10 "nid=0x`printf %x <线程id>`" # 查看具体线程
场景2:内存使用率高
# 1. 内存整体情况
free -m # 以MB显示
cat /proc/meminfo # 详细内存信息
# 2. 内存泄漏检查
jmap -histo:live <pid> | head -20 # 对象实例统计
jmap -dump:format=b,file=heap.hprof <pid> # 生成堆转储
场景3:磁盘空间不足
# 1. 查看磁盘使用
df -h # 各分区使用情况
du -sh /app/logs/* # 查看目录大小
du -ah /app | sort -rh | head -20 # 找大文件
# 2. 清理日志
find /var/log -name "*.log" -type f -mtime +7 -delete # 删除7天前日志
truncate -s 0 /app/logs/big.log # 清空大日志文件(保留文件)
场景4:服务启动失败
# 1. 查看启动日志
journalctl -u nginx -f # 服务启动日志
systemctl status nginx -l # 详细状态信息
# 2. 检查依赖
ldd /usr/sbin/nginx # 检查动态库依赖
java -version # Java版本
三、面试标准回答模板
模板一:通用排查流程
"我会按照以下五个步骤排查:
确认现象 :先用
curl或telnet测试服务是否可达,用systemctl status查看服务状态检查资源 :
top看 CPU/内存,df -h看磁盘,free -m看内存细节查看日志 :
tail -f看实时日志,grep -i error搜索错误信息网络检查 :
netstat -tlnp看端口监听,iptables查防火墙进程分析 :
ps -ef找进程,jstack分析 Java 线程,strace跟踪系统调用"
模板二:针对具体问题
如果面试官说"CPU 使用率很高":
"我会这样排查:
用
top -c找到占用 CPU 最高的进程如果是 Java 进程,用
top -Hp <pid>看具体哪个线程高用
jstack <pid>获取线程栈,把线程 ID 转成十六进制,找到对应的线程栈分析是否是死循环、频繁 GC 或锁竞争
同时用
vmstat 1看系统上下文切换,iostat看磁盘 I/O 是否正常"
如果面试官说"服务启动失败":
"我会:
journalctl -u service-name -f看启动日志
systemctl status service-name -l看详细错误检查端口冲突:
ss -tlnp | grep :port检查配置文件:
nginx -t或java -jar app.jar --dry-run检查依赖:
ldd查动态库,java -version查 Java 版本"
模板三:预防性监控
"除了问题后排查,我更注重事前预防:
设置监控告警:CPU >80%、内存 >90%、磁盘 >85% 时告警
日志规范:统一日志格式,关键操作打日志,错误日志带上下文
健康检查 :所有服务提供
/health端点,包含服务状态和关键指标定期巡检:每天检查日志错误数,每周分析 GC 情况
容量规划:提前预判资源使用,及时扩容"
四、实际案例演示
案例:Java 服务响应慢
# 第一步:整体检查
$ top
# 发现Java进程CPU 180%,负载5.2
# 第二步:Java进程分析
$ jps -mlv
12345 myapp.jar
$ top -Hp 12345
# 发现线程12350占用90% CPU
# 第三步:线程分析
$ printf "%x\n" 12350
303e
$ jstack 12345 | grep -A 20 "nid=0x303e"
# 发现线程在执行死循环或频繁GC
# 第四步:内存分析
$ jstat -gcutil 12345 1000 5
# 发现Full GC频繁
# 第五步:解决方案
# 1. 临时重启服务
# 2. 调整JVM参数:-Xmx增加堆大小
# 3. 代码优化:避免内存泄漏
案例:磁盘空间不足
# 第一步:确认问题
$ df -h
/dev/sda1 50G 49G 1G 98% /
# 第二步:找大文件
$ du -ah / | sort -rh | head -20
# 发现 /var/log/nginx/access.log 占20G
# 第三步:立即清理
$ truncate -s 0 /var/log/nginx/access.log
# 第四步:长期解决
# 1. 配置日志轮转
# 2. 添加磁盘监控告警
# 3. 定期清理脚本
五、常用命令速查表
| 场景 | 主要命令 | 说明 |
|---|---|---|
| 进程查看 | ps -ef``top``htop |
查看进程状态 |
| 端口监听 | netstat -tlnp``ss -tlnp``lsof -i:port |
检查端口占用 |
| 服务状态 | systemctl status``service --status-all |
服务管理 |
| 日志查看 | tail -f``less``grep -i error |
日志分析 |
| 网络测试 | curl``telnet``ping``traceroute |
网络连通性 |
| 磁盘空间 | df -h``du -sh``ls -lh |
磁盘使用 |
| 内存检查 | free -m``cat /proc/meminfo |
内存状态 |
| Java诊断 | jps``jstack``jmap``jstat |
JVM工具 |
| 性能监控 | vmstat``iostat``sar``nmon |
系统性能 |
六、面试加分项
1. 展现系统性思维
"我会先判断是普遍性问题 还是个别问题:如果所有服务都慢,可能是服务器资源问题;如果只有一个服务慢,可能是应用代码问题。"
2. 展现工具链熟悉度
"除了基础命令,我还会用:
ncdu:交互式磁盘分析
iftop:实时网络流量
dstat:全能系统监控
arthas:Java在线诊断工具"
3. 展现安全意识
"线上排查时,我会:
先看监控和日志,不要直接登录生产服务器
如果必须操作,在非高峰时段
修改前备份,执行危险命令前
echo先看效果使用
screen或tmux防止连接中断"
4. 展现架构思维
"根本解决需要:
监控体系:Prometheus + Grafana 监控关键指标
日志体系:ELK 收集分析日志
告警体系:关键指标设置阈值告警
自愈机制:健康检查失败自动重启"
最后总结 :"线上问题排查,关键是快准稳:快速定位问题,准确分析原因,稳定恢复服务。我通常会先看监控定位方向,再用命令深入分析,最后结合日志找到根因。"