Linux故障排查与性能优化实战经验

发布于:2025-06-22 ⋅ 阅读:(20) ⋅ 点赞:(0)

故障排查与性能优化

案例1:GRUB引导故障

故障现象
系统启动卡在"GRUB>"提示符,无法进入系统
原因分析

  • GRUB配置文件损坏(/boot/grub/grub.cfg)
  • 引导文件被误删或磁盘损坏
    解决步骤
  1. 在GRUB命令行依次执行:
insmod xfs
set root=(hd0,msdos1)
linux /vmlinuz root=/dev/sda1
initrd /initramfs.img
boot
  1. 进入系统后执行:grub2-mkconfig -o /boot/grub2/grub.cfg

案例2:文件系统只读故障

故障现象
无法创建文件,提示"Read-only file system"
排查过程

  1. dmesg | grep -i error 发现磁盘I/O错误
  2. smartctl -a /dev/sda 检查磁盘健康状态
    解决方案
  3. 卸载分区:umount /dev/sda1
  4. 强制修复:fsck -y /dev/sda1或者xfs文件系统 xfs_repair /dev/sda`
  5. 重新挂载:mount -a

案例3:OOM Killer触发

故障现象
关键进程突然被终止,系统日志出现"Killed process"
分析工具

  1. grep -i 'killed process' /var/log/messages
  2. free -h 查看内存使用情况
  3. vmstat 1 监控内存交换
    优化方案
  • 调整oom_score_adj:echo -100 > /proc/[PID]/oom_score_adj
  • 修改sysctl.conf:
vm.overcommit_memory = 2
vm.overcommit_ratio = 80

案例4:系统启动卡住(initramfs损坏)

故障现象
启动时卡在"Loading initial ramdisk"
紧急处理

  1. 进入救援模式()使用live CD
  2. 重建initramfs:
chroot /mnt/sysimage
dracut -f /boot/initramfs-$(uname -r).img $(uname -r)

案例5:磁盘空间耗尽

故障现象
服务异常,df显示使用率100%
快速定位

  1. lsof -n | grep deleted 查找未释放空间的进程
  2. du -xh --max-depth=1 / | sort -hr 定位大文件
    典型场景
  • /var/log/journal 日志膨胀:journalctl --vacuum-size=100M
  • /tmp目录堆积:rm -rf /tmp/*.tmp

案例6:NTP时间不同步

故障现象
日志出现"Clock skew detected"警告
排错流程

  1. ntpq -pn 查看时间源状态
  2. chronyc sources -v 检查chrony同步状态
  3. systemctl restart chronyd
  4. 硬件时钟同步:hwclock --systohc

案例7:SELinux导致服务异常

故障现象
Apache无法访问自定义目录
诊断方法

  1. tail -f /var/log/audit/audit.log | grep httpd
  2. sealert -a /var/log/audit/audit.log
    解决方案
# 临时解决
setenforce 0
# 永久方案
semanage fcontext -a -t httpd_sys_content_t "/webroot(/.*)?"
restorecon -Rv /webroot

案例8、root密码遗忘

在RHEL/CentOS 7及更新版本中,如果忘记root密码,可以通过以下步骤重置(需物理/虚拟控制台访问权限):

方法原理

通过修改GRUB2启动参数进入单用户模式,绕过身份验证直接获取root权限


详细操作步骤

  1. 重启系统并中断引导
# 当系统启动到GRUB菜单时,快速按下方向键阻止自动引导
# 选择默认内核条目(通常第一条)按 `e` 键进入编辑模式
  1. 修改内核参数
# 在linux16行(或linux行)末尾追加:
rd.break enforcing=0

# 修改后的完整行示例:
linux16 /vmlinuz-3.10.0-1160.el7.x86_64 root=/dev/mapper/rhel-root rw rd.break enforcing=0
  1. 进入紧急模式
# 按 Ctrl+X 启动系统,进入紧急救援模式的shell环境
# 此时文件系统挂载在/sysroot(只读模式)
  1. 切换根目录
chroot /sysroot
  1. 修改root密码
# 此时已获得完整root权限:
passwd root
# 输入新密码两次(不会显示输入内容)
  1. 修复SELinux上下文
# 强制重新标记文件系统(重要!):
touch /.autorelabel
  1. 退出并重启
exit
exit
reboot

关键参数说明

参数 作用
rd.break 在内核加载初期中断启动流程
enforcing=0 临时禁用SELinux强制模式

Linux系统性能优化

一、性能优化概述

  1. 目标:提升系统响应速度、资源利用率,避免瓶颈。
  2. 核心原则
    • 监控先行:先分析瓶颈,再针对性优化。
    • 逐步调整:避免一次性修改过多参数。
    • 稳定性优先:优化后需充分测试。

二、性能监控工具

1. 基础工具

  • top / htop

    top          # 实时查看CPU、内存、进程
    htop         # 增强版(支持鼠标操作)
    
    • 关键指标%CPU(CPU占用)、%MEM(内存占用)、LOAD AVERAGE(系统负载)。- -
  • vmstat

    vmstat 1     # 每秒输出一次系统状态
    
    • 关键列
      • r:等待CPU的进程数(> CPU核数表示过载)。
      • si/so:Swap交换频率(频繁交换说明内存不足)。
  • iostat

    iostat -xz 1 # 查看磁盘I/O
    
    • 关键指标%util(磁盘利用率 >80% 表示瓶颈)、await(I/O等待时间)。
  • netstat / ss

    netstat -ant | grep ESTABLISHED | wc -l  # 查看TCP连接数
    ss -s        # 统计套接字信息
    

三、子系统优化策略

1. CPU优化
  • 调整进程优先级

    nice -n 19 ./script.sh   # 启动低优先级进程
    renice 19 -p PID         # 修改运行中进程的优先级
    
  • 绑定CPU核心(减少上下文切换)

    taskset -c 0,1 ./program  # 绑定到CPU0和CPU1
    
  • 内核参数调整

    # 修改/etc/sysctl.conf
    kernel.sched_child_runs_first = 1  # 子进程优先调度
    
2. 内存优化
  • 调整Swap使用策略

    # 修改/etc/sysctl.conf
    vm.swappiness = 10        # 降低Swap使用倾向(0-100,默认60)
    vm.vfs_cache_pressure = 50 # 减少inode缓存回收频率
    
  • 禁用透明大页(THP)

    echo never > /sys/kernel/mm/transparent_hugepage/enabled
    
3. 磁盘I/O优化
  • 选择合适I/O调度器

    # 查看当前调度器
    cat /sys/block/sda/queue/scheduler
    # 临时修改为deadline调度器(适用于SSD)
    echo deadline > /sys/block/sda/queue/scheduler
    
  • 文件系统优化(ext4)

    # 挂载参数:noatime(不记录访问时间), data=writeback
    UUID=xxx / ext4 defaults,noatime,data=writeback 0 1
    
4. 网络优化
  • TCP参数调优

    # 修改/etc/sysctl.conf
    net.core.somaxconn = 4096       # 提高连接队列长度
    net.ipv4.tcp_fin_timeout = 30   # 缩短TIME_WAIT超时
    net.ipv4.tcp_tw_reuse = 1       # 允许重用TIME_WAIT连接
    
    sysctl -p  # 应用配置
    
  • 限制连接数

    # 使用iptables限制单IP连接数
    iptables -A INPUT -p tcp --syn --dport 80 -m connlimit --connlimit-above 50 -j DROP
    

四、资源限制优化

1. ulimit
  • 修改用户级限制

    # 编辑/etc/security/limits.conf
    * soft nofile 65535    # 文件描述符软限制
    * hard nofile 65535    # 硬限制
    
  • 生效方式:重启会话或执行 ulimit -n 65535

2. cgroups(控制组)
  • 限制进程资源

    # 创建cgroup(需安装cgroup-tools)
    cgcreate -g cpu,memory:/my_group
    # 限制CPU使用为50%
    cgset -r cpu.cfs_period_us=100000 -r cpu.cfs_quota_us=50000 my_group
    # 限制内存为1GB
    cgset -r memory.limit_in_bytes=1G my_group
    # 将进程加入cgroup
    cgexec -g cpu,memory:my_group ./program
    

五、安全与注意事项

  1. 备份配置文件:修改前备份 /etc/sysctl.conf/etc/security/limits.conf
  2. 灰度测试:先在测试环境验证参数调整效果。
  3. 避免过度优化:如无明确瓶颈,优先使用默认配置。

六、综合案例


案例1:TCP连接数过高导致Web服务卡顿

问题描述

Nginx服务器在高并发时出现 Too many open files 错误,TCP连接数超过默认限制。

优化配置

  1. 修改文件描述符限制

    # 编辑 /etc/security/limits.conf
    * soft nofile 65535
    * hard nofile 65535
    nginx soft nofile 65535   # 针对Nginx用户单独设置
    
  2. 调整Nginx配置

    # /etc/nginx/nginx.conf
    worker_rlimit_nofile 65535;  # 与limits.conf一致
    events {
      worker_connections 4096;   # 每个Worker进程连接数
    }
    
  3. 内核TCP参数优化

    # 编辑 /etc/sysctl.conf
    net.core.somaxconn = 65535     # 最大连接队列
    net.ipv4.tcp_max_syn_backlog = 65535  # SYN队列长度
    net.ipv4.tcp_tw_reuse = 1      # 重用TIME_WAIT连接
    net.ipv4.tcp_fin_timeout = 30  # 缩短FIN超时
    
    sysctl -p  # 生效配置
    

验证方法

ss -lnt | grep 'LISTEN'   # 查看监听队列长度
cat /proc/$(pidof nginx)/limits | grep 'open files'  # 确认Nginx进程限制

案例2:Java应用内存溢出导致系统崩溃**

问题描述

Tomcat服务频繁触发OOM(Out of Memory),且系统Swap使用率过高。

优化配置

  1. 限制JVM堆内存

    # 修改Tomcat启动脚本 catalina.sh
    export JAVA_OPTS="-Xms2G -Xmx2G -XX:MaxMetaspaceSize=512M"
    
  2. 调整系统Swap策略

    # 编辑 /etc/sysctl.conf
    vm.swappiness = 10       # 降低Swap使用倾向
    vm.overcommit_memory = 1 # 允许超量分配内存(谨慎使用)
    
  3. 使用cgroups限制内存

    # 创建内存限制组
    cgcreate -g memory:/tomcat
    cgset -r memory.limit_in_bytes=4G /tomcat
    cgset -r memory.memsw.limit_in_bytes=6G /tomcat  # 物理内存+Swap总限制
    # 启动Tomcat
    cgexec -g memory:tomcat /opt/tomcat/bin/startup.sh
    

验证方法

free -h          # 查看内存和Swap使用
ps aux | grep tomcat  # 确认cgroup限制生效
cat /sys/fs/cgroup/memory/tomcat/memory.usage_in_bytes  # 查看内存占用

案例3:磁盘I/O延迟导致数据库性能下降**

问题描述

MySQL读写缓慢,iostat 显示磁盘 %util 持续高于90%。

优化配置

  1. 切换I/O调度器

    # 临时切换为deadline调度器(SSD推荐)
    echo deadline > /sys/block/sda/queue/scheduler
    # 永久生效(GRUB配置)
    vi /etc/default/grub
    GRUB_CMDLINE_LINUX_DEFAULT="elevator=deadline"
    update-grub  # Debian/Ubuntu
    grub2-mkconfig -o /boot/grub2/grub.cfg  # CentOS/RHEL
    
  2. 调整文件系统挂载参数

    # 编辑 /etc/fstab
    UUID=xxxx /data ext4 defaults,noatime,nodiratime,data=writeback 0 2
    
  3. MySQL配置优化

    # /etc/my.cnf
    innodb_flush_method = O_DIRECT     # 绕过内核缓存
    innodb_io_capacity = 2000          # SSD建议值
    innodb_buffer_pool_size = 8G       # 分配足够缓冲池
    

验证方法

cat /sys/block/sda/queue/scheduler  # 确认调度器
iostat -xm 1                        # 观察%util和await变化
mysql> SHOW GLOBAL STATUS LIKE 'Innodb_buffer_pool%';  # 查看缓冲池命中率

案例4:CPU竞争导致多线程应用性能差**

问题描述

Python多进程数据处理程序运行缓慢,top 显示CPU在多个核心间频繁切换。

优化配置

  1. 绑定进程到特定CPU核心

    # 使用taskset绑定到CPU0-3
    taskset -c 0-3 python3 data_processing.py
    
  2. 调整进程优先级

    nice -n -20 python3 high_priority_task.py  # 最高优先级(需root)
    renice -n 19 -p 1234   # 将运行中的PID=1234进程设为低优先级
    
  3. 禁用CPU节能模式

    # 安装cpufrequtils(Debian/Ubuntu)
    apt install cpufrequtils
    # 设置为性能模式
    cpufreq-set -g performance -c 0  # 对每个CPU核心执行
    

验证方法

mpstat -P ALL 1      # 查看各核心利用率
cpufreq-info         # 确认当前CPU频率策略

案例5:网络丢包导致视频流传输卡顿**

问题描述

视频流服务器在传输大流量UDP数据时出现丢包,sar -n UDP 1 显示 idgm/s(输入数据报)超过网卡处理能力。

优化配置

  1. 增大Socket缓冲区

    # 编辑 /etc/sysctl.conf
    net.core.rmem_max = 67108864   # 接收缓冲区最大值(64MB)
    net.core.wmem_max = 67108864   # 发送缓冲区最大值
    net.core.netdev_max_backlog = 500000  # 网卡队列长度
    
  2. 多队列网卡优化

    # 启用RSS(Receive Side Scaling)
    ethtool -L eth0 combined 8     # 设置8个队列(需网卡支持)
    # 绑定IRQ到不同CPU核心
    vi /etc/rc.local
    /usr/bin/irqbalance --powerthresh=50  # 启用IRQ平衡
    
  3. 应用层优化(FFmpeg示例)

    ffmpeg -i input -c copy -f mpegts udp://target:1234?buffer_size=4194304  # 增大发送缓冲区
    

验证方法

ethtool -S eth0 | grep rx_dropped  # 查看丢包统计
sar -n UDP 1                       # 监控UDP报文状态
cat /proc/interrupts | grep eth0   # 确认IRQ分布

总结:优化配置原则**

  1. 精准定位瓶颈

    • 使用 perf top 分析CPU热点。
    • 通过 dmesg 检查内核OOM或I/O错误日志。
  2. 层级化调整

    层级 工具/方法
    应用层 代码优化、连接池配置
    运行时 JVM参数、Golang GC策略
    操作系统 sysctl、cgroups、ulimit
    硬件/驱动 升级SSD、调整RAID级别
  3. 自动化监控

    # 使用Prometheus + Grafana监控模板
    - node_exporter 采集系统指标  
    - alertmanager 配置CPU/内存阈值告警  
    

附:配置修改注意事项

  1. 备份原始文件

    cp /etc/sysctl.conf /etc/sysctl.conf.bak
    
  2. 分阶段生效

    • 优先通过 sysctl -w 临时修改测试。
    • 确认稳定后写入配置文件。
  3. 回归测试

    ab -n 10000 -c 500 http://localhost/  # ApacheBench压力测试
    iperf3 -c target_ip -t 60            # 网络带宽测试
    

附:常用命令速查表

命令 作用
sar -u 1 3 查看CPU使用率
vmstat 1 监控内存和进程队列
iostat -xz 1 分析磁盘I/O瓶颈
ss -s 统计TCP连接状态

网站公告

今日签到

点亮在社区的每一天
去签到