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 password、Invalid user |
grep "Failed" /var/log/secure |
| 服务启动失败 | failed、Start request repeated |
journalctl -u <service> -n 50 |
| 内存不足(OOM) | Out of memory、oom-kill |
dmesg -T | grep -i oom |
| 磁盘写满 | No space left on device |
journalctl -p err -b | grep space |
| SELinux 拒绝 | avc: denied、SELinux |
ausearch -m avc -ts recent |
| 网络故障 | connection refused、timeout |
journalctl -k | grep net |
13.4 系统调用追踪
当日志信息不足以定位问题时,使用 strace 和 lsof 进行深度追踪。
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/s、w/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 1;iotop -o 找出高 I/O 进程 |
| 内存持续增长不释放 | 检查是否存在内存泄漏:ps aux --sort=-%mem | head;重启问题服务 |
| 服务启动超时 | systemctl status <service>;增加 TimeoutStartSec 参数 |
strace 看到大量 EAGAIN |
进程在非阻塞模式下轮询,属正常行为,重点关注 ENOENT(文件不存在)、EACCES(权限拒绝)等错误 |
13.9 实践任务
- 登录
linuxdc(SecureCRT 端口 2222,ops用户,密钥认证,sudo -i切换 root)。 - 按照故障排查方法论,模拟 SSH 连接失败场景并完整执行排查流程。
- 使用
top、free -h、df -hT记录当前系统资源基线。 -
安装
iotop和sysstat,执行:iotop -o -d 2 -n 5 sar -u 1 5 iostat -dx 1 5 -
将
tunedprofile 设置为virtual-guest并验证:tuned-adm profile virtual-guest tuned-adm active -
生成 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 调度器)。掌握本章内容是运维工程师从"能操作"进阶到"能解决问题"的关键跨越。