跳转至

13. 故障排查与性能优化

本章介绍 RHEL 9 的系统故障排查方法论与性能优化实践,涵盖结构化排查流程、日志分析、系统调用追踪、性能监控工具,以及内存、I/O、CPU 的调优手段。掌握本章是运维工程师独立处理生产问题的核心能力。


13.1 前提条件

  • 已完成第二阶段第 10–12 章配置。
  • 通过 SecureCRT(SSH 端口 2222)以 ops 用户、密钥认证方式登录 192.168.1.100,执行 sudo -i 切换至 root 环境。
  • EPEL 仓库已启用(第 7 章)。

安装本章所需工具:

dnf install -y sysstat strace lsof iotop nmap-ncat tcpdump

13.2 故障排查方法论

面对生产故障,结构化的排查顺序能快速缩小问题范围,避免盲目操作。

推荐排查顺序:

1. 确认现象     → 服务无响应?报错信息?哪个时间点开始?
2. 查看日志     → journalctl / /var/log/  →  定位错误信息
3. 检查服务状态 → systemctl status <service>
4. 检查资源占用 → CPU / 内存 / 磁盘 / 网络是否异常
5. 检查网络连接 → 防火墙 / SELinux / 端口监听
6. 追踪系统调用 → strace / lsof 深度分析
7. 复现与验证   → 修复后验证,记录步骤

13.3 日志分析

日志是故障排查的第一入口,80% 的问题可通过日志直接定位。

13.3.1 systemd journal 日志

# 查看服务日志(最近 100 条)
journalctl -u sshd -n 100

# 实时追踪
journalctl -u sshd -f

# 查看本次启动的错误日志
journalctl -p err -b

# 查看上次启动日志(排查重启原因)
journalctl -b -1 -p err

# 查看系统重启记录
journalctl | grep -E "reboot|shutdown|systemd.*Starting"

# 组合过滤:最近 2 小时内 sshd 的 warning 以上日志
journalctl -u sshd --since "2 hours ago" -p warning

13.3.2 传统日志文件

# 安全认证日志(SSH 登录、sudo 操作)
tail -100 /var/log/secure
grep "Failed password" /var/log/secure | tail -20
grep "Accepted publickey" /var/log/secure | tail -10

# 系统通用日志
tail -100 /var/log/messages
grep "error\|fail\|warn" /var/log/messages | tail -30

# 内核日志
dmesg | tail -50
dmesg | grep -E "error|fail|oom|segfault"
dmesg -T | grep -E "Out of memory"   # 带时间戳的 OOM 记录

13.3.3 典型故障日志特征

故障类型 日志关键词 查看命令
SSH 登录失败 Failed passwordInvalid user grep "Failed" /var/log/secure
服务启动失败 failedStart request repeated journalctl -u <service> -n 50
内存不足(OOM) Out of memoryoom-kill dmesg -T | grep -i oom
磁盘写满 No space left on device journalctl -p err -b | grep space
SELinux 拒绝 avc: deniedSELinux ausearch -m avc -ts recent
网络故障 connection refusedtimeout journalctl -k | grep net

13.4 系统调用追踪

当日志信息不足以定位问题时,使用 stracelsof 进行深度追踪。

13.4.1 strace — 系统调用追踪

# 追踪命令的系统调用
strace ls /tmp

# 追踪正在运行的进程
strace -p $(pgrep sshd | head -1)

# 过滤特定系统调用(如文件操作)
strace -e trace=open,read,write ls /etc 2>&1 | head -20

# 统计各系统调用耗时(性能分析)
strace -c ls /var/log

# 追踪子进程
strace -f -p <PID>

strace 使用场景

服务启动卡住时,用 strace -p <PID> 查看进程正在等待哪个系统调用;安装脚本权限问题时,用 strace -e open 查看哪个文件打开失败。

13.4.2 lsof — 查看文件与端口占用

# 查看占用指定端口的进程
lsof -i :2222
lsof -i TCP:2222

# 查看指定进程打开的文件
lsof -p $(pgrep sshd | head -1)

# 查看指定文件被哪些进程占用
lsof /var/log/messages

# 查看被删除但仍被进程占用的文件(磁盘释放问题常见场景)
lsof | grep deleted

# 查看指定用户打开的所有文件
lsof -u ops

13.5 性能监控

13.5.1 CPU 监控

# 实时监控(按 1 查看每个核心,P 按 CPU 排序,M 按内存排序)
top

# 按 CPU 使用率列出前 10 进程
ps aux --sort=-%cpu | head -11

# sar:历史 CPU 使用情况(每秒采样 5 次)
sar -u 1 5

# 查看 CPU 核心数
nproc
lscpu | grep -E "^CPU\(s\)|^Thread|^Core|^Socket"

# 系统负载(1/5/15 分钟平均负载)
uptime

负载判断标准

负载值 ÷ CPU 核心数 > 1 表示过载,需立即分析是 CPU 竞争(sar -u)还是 I/O 等待(iostat -dx)。

13.5.2 内存监控

# 内存概览
free -h

# 详细内存信息
cat /proc/meminfo | head -20

# 按内存使用排序的进程
ps aux --sort=-%mem | head -11

# sar:内存历史统计
sar -r 1 5

# 查看 OOM 历史(内存不足导致进程被杀)
dmesg -T | grep -i "out of memory\|oom"
journalctl -k | grep -i "killed process"

13.5.3 磁盘 I/O 监控

# 磁盘 I/O 实时监控(每 2 秒刷新,仅显示有活动的进程)
iotop -o

# iostat:扩展磁盘统计(每 5 秒,共 3 次)
iostat -dx 5 3

# sar:磁盘 I/O 历史统计
sar -d 1 5

# 查看磁盘空间使用
df -hT

# 查找大文件(排查磁盘突然写满)
find /var -type f -size +100M -exec ls -lh {} \; 2>/dev/null | sort -rh | head -10

# 查看目录占用(逐层定位)
du -sh /var/*
du -sh /var/log/*

iostat 关键指标解读:

指标 说明 警戒值
%util 磁盘利用率 > 80% 表示 I/O 饱和
await 平均 I/O 等待时间(ms) SSD > 1ms,HDD > 20ms 需关注
r/sw/s 每秒读写请求数 超过硬盘 IOPS 规格则饱和

13.5.4 网络监控

# 查看网络连接状态
ss -tuln                            # 所有监听端口
ss -s                               # 连接统计摘要
ss -tn state established | wc -l   # 当前 ESTABLISHED 连接数

# 实时网络流量(需安装)
dnf install -y nload
nload ens33

# 网络数据包捕获(排查网络层问题)
tcpdump -i ens33 -n port 2222 -c 50

# sar:网络吞吐量历史
sar -n DEV 1 5

13.6 系统性能优化

13.6.1 tuned 性能调优框架

tuned 是 RHEL 9 官方推荐的性能调优工具,提供预定义的优化配置集(profile)。

# 安装
dnf install -y tuned

systemctl enable --now tuned

# 查看所有可用 profile
tuned-adm list

# 查看当前激活的 profile
tuned-adm active

# 按场景选择 profile
tuned-adm profile throughput-performance    # 高吞吐(数据库、文件服务器)
tuned-adm profile latency-performance       # 低延迟(交易系统)
tuned-adm profile virtual-guest             # 虚拟机(本实验环境)
tuned-adm profile balanced                  # 平衡模式(默认)

# 让 tuned 自动推荐最佳 profile
tuned-adm recommend

13.6.2 内存优化(swappiness)

# 查看当前 swappiness(默认 60)
cat /proc/sys/vm/swappiness

# 服务器推荐值:10(减少 swap 使用,优先用内存)
sysctl -w vm.swappiness=10

# 持久化(已在第 11 章 sysctl 配置中设置)
grep swappiness /etc/sysctl.d/99-linuxdc.conf

13.6.3 I/O 调度器优化

# 查看当前 I/O 调度器
cat /sys/block/sda/queue/scheduler

# RHEL 9 可用调度器:mq-deadline(推荐)、bfq、none
# 临时切换
echo mq-deadline > /sys/block/sda/queue/scheduler

# 持久化:通过 udev 规则
tee /etc/udev/rules.d/60-io-scheduler.rules << 'EOF'
ACTION=="add|change", KERNEL=="sd[a-z]|nvme[0-9]n[0-9]", \
  ATTR{queue/scheduler}="mq-deadline"
EOF

udevadm control --reload-rules
udevadm trigger

13.6.4 生成系统诊断报告(sosreport)

dnf install -y sos

# 生成完整诊断报告(收集日志、配置、状态信息)
sos report

# 仅收集指定插件的信息(减小报告体积)
sos report --only-plugins networking,firewalld,systemd,logs

# 报告生成在 /var/tmp/sosreport-*.tar.xz
ls -lh /var/tmp/sosreport-*.tar.xz

通过 SecureFX 下载 sosreport 压缩包,提交给 Red Hat 技术支持或离线分析。


13.7 典型故障排查案例

案例一:SSH 无法连接

# 步骤 1:确认服务是否运行
systemctl is-active sshd

# 步骤 2:确认端口监听
ss -tuln | grep :2222

# 步骤 3:检查防火墙
firewall-cmd --list-ports | grep 2222

# 步骤 4:检查 SELinux
ausearch -m avc -ts recent | grep sshd

# 步骤 5:查看 sshd 日志
journalctl -u sshd -n 30

# 步骤 6:从客户端调试连接
ssh -vvv -p 2222 ops@192.168.1.100

案例二:磁盘突然写满

# 步骤 1:确认哪个分区写满
df -hT

# 步骤 2:定位大目录
du -sh /var/* | sort -rh | head -10
du -sh /var/log/* | sort -rh | head -10

# 步骤 3:找出大文件
find /var/log -type f -size +100M

# 步骤 4:检查被删除但未释放的文件
lsof | grep deleted

# 步骤 5:清理
journalctl --vacuum-size=200M
find /var/log -name "*.gz" -mtime +30 -delete

13.8 常见问题与排查

问题现象 排查步骤
系统负载高但 CPU 不高 通常是 I/O 等待:iostat -dx 1iotop -o 找出高 I/O 进程
内存持续增长不释放 检查是否存在内存泄漏:ps aux --sort=-%mem | head;重启问题服务
服务启动超时 systemctl status <service>;增加 TimeoutStartSec 参数
strace 看到大量 EAGAIN 进程在非阻塞模式下轮询,属正常行为,重点关注 ENOENT(文件不存在)、EACCES(权限拒绝)等错误

13.9 实践任务

  1. 登录 linuxdc(SecureCRT 端口 2222,ops 用户,密钥认证,sudo -i 切换 root)。
  2. 按照故障排查方法论,模拟 SSH 连接失败场景并完整执行排查流程。
  3. 使用 topfree -hdf -hT 记录当前系统资源基线。
  4. 安装 iotopsysstat,执行:

    iotop -o -d 2 -n 5
    sar -u 1 5
    iostat -dx 1 5
    
  5. tuned profile 设置为 virtual-guest 并验证:

    tuned-adm profile virtual-guest
    tuned-adm active
    
  6. 生成 sosreport,通过 SecureFX 下载至本地。


13.10 自测问题

Q1:系统负载(load average)为 4.0,服务器有 2 个 CPU 核心,这意味着什么?

负载值 4.0 除以 2 个核心 = 2.0,即每个核心平均有 2 个任务在等待。这意味着系统存在明显过载,需要立即分析是 CPU 竞争(sar -u)还是 I/O 等待(iostat -dx)。

Q2:lsof | grep deleted 发现有大文件被进程占用,磁盘却没有释放,如何处理?

文件被删除后,只要有进程持有其文件描述符,磁盘空间就不会释放。处理方法:① 重启持有该文件描述符的进程(kill -HUP <PID>);② 如进程不能重启,可将文件内容清空(> /proc/<PID>/fd/<FD>),磁盘空间立即释放;③ 从根本上解决:配置日志轮转(logrotate)避免日志文件过大。

Q3:tuned 与手动 sysctl 调优是否冲突?

可能冲突。tuned 在激活 profile 时会修改相关内核参数。若同时通过 /etc/sysctl.d/ 手动配置了相同参数,tuned 的值会在服务启动时覆盖手动配置。建议使用 tuned 作为基础框架,通过创建自定义 tuned profile(继承基础 profile 并添加 sysctl 覆盖)来管理所有参数,保持配置的一致性。


13.11 章节总结

本章介绍了 RHEL 9 故障排查的结构化方法论与核心工具(journalctl、strace、lsof),以及系统性能监控(top、iostat、sar)和优化手段(tuned、swappiness、I/O 调度器)。掌握本章内容是运维工程师从"能操作"进阶到"能解决问题"的关键跨越。