云计算百科
云计算领域专业知识百科平台

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

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

标准回答开场白:

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

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

  • 检查外部依赖:网络、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 -eftophtop

    查看进程状态

    端口监听​

    netstat -tlnpss -tlnplsof -i:port

    检查端口占用

    服务状态​

    systemctl statusservice –status-all

    服务管理

    日志查看​

    tail -flessgrep -i error

    日志分析

    网络测试​

    curltelnetpingtraceroute

    网络连通性

    磁盘空间​

    df -hdu -shls -lh

    磁盘使用

    内存检查​

    free -mcat /proc/meminfo

    内存状态

    Java诊断​

    jpsjstackjmapjstat

    JVM工具

    性能监控​

    vmstatiostatsarnmon

    系统性能


    六、面试加分项

    1. 展现系统性思维

    "我会先判断是普遍性问题还是个别问题:如果所有服务都慢,可能是服务器资源问题;如果只有一个服务慢,可能是应用代码问题。"

    2. 展现工具链熟悉度

    "除了基础命令,我还会用:

    • ncdu:交互式磁盘分析

    • iftop:实时网络流量

    • dstat:全能系统监控

    • arthas:Java在线诊断工具"

    3. 展现安全意识

    "线上排查时,我会:

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

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

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

  • 使用 screen或 tmux防止连接中断"

  • 4. 展现架构思维

    "根本解决需要:

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

  • 日志体系:ELK 收集分析日志

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

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

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

    赞(0)
    未经允许不得转载:网硕互联帮助中心 » Linux 服务器问题排查指南(面试标准回答)
    分享到: 更多 (0)

    评论 抢沙发

    评论前必须登录!