Linux 服务器问题排查指南(面试标准回答)

一、排查思路框架(先说这个,展现系统性)

标准回答开场白

"线上服务排查,我会遵循**'从外到内、从大到小、从现象到根源'**的思路:

  1. 先确认现象:什么问题?影响范围多大?

  2. 检查外部依赖:网络、DNS、防火墙

  3. 检查服务器状态:负载、内存、磁盘

  4. 检查应用状态:进程、端口、日志

  5. 深入分析:特定服务的详细检查"


二、具体排查命令与步骤

第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版本

三、面试标准回答模板

模板一:通用排查流程

"我会按照以下五个步骤排查:

  1. 确认现象 :先用 curltelnet测试服务是否可达,用 systemctl status查看服务状态

  2. 检查资源top看 CPU/内存,df -h看磁盘,free -m看内存细节

  3. 查看日志tail -f看实时日志,grep -i error搜索错误信息

  4. 网络检查netstat -tlnp看端口监听,iptables查防火墙

  5. 进程分析ps -ef找进程,jstack分析 Java 线程,strace跟踪系统调用"

模板二:针对具体问题

如果面试官说"CPU 使用率很高"

"我会这样排查:

  1. top -c找到占用 CPU 最高的进程

  2. 如果是 Java 进程,用 top -Hp <pid>看具体哪个线程高

  3. jstack <pid>获取线程栈,把线程 ID 转成十六进制,找到对应的线程栈

  4. 分析是否是死循环、频繁 GC 或锁竞争

  5. 同时用 vmstat 1看系统上下文切换,iostat看磁盘 I/O 是否正常"

如果面试官说"服务启动失败"

"我会:

  1. journalctl -u service-name -f看启动日志

  2. systemctl status service-name -l看详细错误

  3. 检查端口冲突:ss -tlnp | grep :port

  4. 检查配置文件:nginx -tjava -jar app.jar --dry-run

  5. 检查依赖:ldd查动态库,java -version查 Java 版本"

模板三:预防性监控

"除了问题后排查,我更注重事前预防:

  1. 设置监控告警:CPU >80%、内存 >90%、磁盘 >85% 时告警

  2. 日志规范:统一日志格式,关键操作打日志,错误日志带上下文

  3. 健康检查 :所有服务提供 /health端点,包含服务状态和关键指标

  4. 定期巡检:每天检查日志错误数,每周分析 GC 情况

  5. 容量规划:提前预判资源使用,及时扩容"


四、实际案例演示

案例: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. 展现安全意识

"线上排查时,我会:

  1. 先看监控和日志,不要直接登录生产服务器

  2. 如果必须操作,在非高峰时段

  3. 修改前备份,执行危险命令前 echo先看效果

  4. 使用 screentmux防止连接中断"

4. 展现架构思维

"根本解决需要:

  1. 监控体系:Prometheus + Grafana 监控关键指标

  2. 日志体系:ELK 收集分析日志

  3. 告警体系:关键指标设置阈值告警

  4. 自愈机制:健康检查失败自动重启"

最后总结"线上问题排查,关键是快准稳:快速定位问题,准确分析原因,稳定恢复服务。我通常会先看监控定位方向,再用命令深入分析,最后结合日志找到根因。"

相关推荐
末日汐2 小时前
磁盘与文件系统
linux·运维·数据库
水天需0102 小时前
Linux PS4 环境变量详解
linux
小新ya2 小时前
vscode增删改查文件,一直等待中...
linux·vscode
小李独爱秋2 小时前
计算机网络经典问题透视:电子邮件的安全协议PGP主要都包含哪些措施?
运维·服务器·网络·网络协议·计算机网络·安全
小李独爱秋2 小时前
计算机网络经典问题透视:互联网的网络层安全协议族IPsec都包含哪些主要协议?
运维·服务器·开发语言·网络协议·计算机网络·安全
C雨后彩虹2 小时前
synchronized高频考点模拟面试过程
java·面试·多线程·并发·lock
济6173 小时前
linux(第十四期)--官方 SDK 移植实验-- Ubuntu20.04
linux·运维·服务器
云qq3 小时前
x86操作系统23——进程相关系统调用
linux·c语言·汇编·ubuntu