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. 确认现象 :先用 curl或 telnet测试服务是否可达,用 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 -t或 java -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. 使用 screen或 tmux防止连接中断"

4. 展现架构思维

"根本解决需要:

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

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

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

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

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

相关推荐
卷福同学3 小时前
第一次当面试官有感
后端·面试
怕浪猫3 小时前
顶级模型一句话,AI 写出了能玩的 QQ飞车
前端·面试·github
呃呃呃呃ex3 小时前
9. TypeScript:从类型系统到工程实践
前端·面试
律宏阔3 小时前
WSL Docker 端口明明空闲,但就是绑不上端口
linux·windows
律宏阔3 小时前
WSL 突然断网,无法 ping 内网或外网
linux·windows
穷人小水滴3 小时前
用容器编译 VirtualBox 虚拟机软件 (ArchLinux, podman)
linux·容器·virtualbox
Blanche15003 小时前
Webpack 构建流程解析
javascript·面试
我叫黑大帅3 小时前
为了知道计算机为什么选择了二进制,我做了这些……
面试·程序员·计算机组成原理
怕浪猫3 小时前
DeepSeek Harness 系列图解
面试·前端框架·node.js
double_face4 小时前
AgentScope 2.0 源码解析系列(Java 版)|第 3 篇:State 模块,Agent 靠什么记住这轮对话
后端·面试