2. RHEL主机性能观测体系

数据库主机性能问题很少以“CPU 高”这种单一形态出现。Oracle、PostgreSQL、MySQL 在 RHEL 上运行时,一次慢查询可能同时表现为 CPU 软中断升高、内存页回收频繁、磁盘 await 增大、网络重传增加。若只看一个指标,很容易把根因误判为“CPU 不够”或“磁盘太慢”。因此,本节要建立一套以数据库负载为中心的观测体系:先理解每类指标在 RHEL 上如何采集、代表什么,再把它与数据库的等待事件、会话状态、SQL 执行阶段对应起来。

一、观测体系的四个层次

RHEL 主机性能观测可以分成四层:硬件与内核资源层、进程与调度层、数据库实例层、业务 SQL 层。越往下越接近物理瓶颈,越往上越接近业务影响。排查时应先确定“数据库在等什么”,再回到主机层验证“谁在消耗、消耗在哪个设备或 CPU 上”。

CPU 方面,vmstat 1 的 us、sy、id、wa、st 是最常用的入口。数据库负载通常表现为 us 高(SQL 解析、排序、哈希连接)或 sy 高(系统调用、上下文切换、锁竞争)。若 wa 持续偏高,说明 CPU 在等 I/O,而不是算力不足。此时应结合 mpstat -P ALL 1 看单核分布:数据库进程若集中在少数 CPU 上,可能是 NUMA 绑定或调度策略问题,而非核数不够。

内存方面,不能只看 free -m 的 free 值。RHEL 会把大量内存用于 page cache,available 才更接近“还能给新进程用多少”。数据库主机要重点关注 si/so(换页)、pgscank/pgsteal(页回收)、oom 日志。若 SGA 或 shared_buffers 被换出,数据库会出现无法解释的延迟抖动。此时应检查 /proc/meminfo 中的 Dirty、Writeback,以及 vm.swappiness 是否被调得过高。

二、磁盘与网络:数据库最敏感的链路

磁盘观测的核心不是“利用率 100%”这个数字,而是延迟和队列。用 iostat -x 1 看 r_await、w_await、aqu-sz、%util。对数据库而言,w_await 超过 10ms 就值得警惕,超过 20ms 通常已影响提交延迟。若 %util 高但 await 低,说明设备仍在吞吐能力内;若 await 高且队列长,说明存在排队。进一步用 pidstat -d 1 定位到具体进程,再结合数据库的 db file sequential read、log file sync 等等待事件判断是数据文件还是日志文件。

网络方面,数据库主机的网络问题常被忽略。用 sar -n DEV 1 看吞吐与丢包,用 ss -s 看连接状态,用 netstat -s 看重传、乱序、溢出。若 retrans 持续增长,说明 TCP 重传在消耗数据库响应时间;若 Recv-Q 堆积,说明应用读取慢于数据库发送。RAC、主从复制、共享存储场景下,网络延迟会直接放大为数据库等待。

三、中断与软中断:被低估的 CPU 消耗

在高速网卡和多队列存储环境下,中断和软中断会占用大量 CPU。用 cat /proc/interrupts 观察各 CPU 的中断计数,用 mpstat -I SUM 1 看 %irq 和 %soft。若某个 CPU 的软中断长期偏高,可能是网卡多队列未均衡、RPS/RFS 未开启,或存储多路径未分散。数据库的 log file sync、网络收包都依赖中断处理,软中断瓶颈会表现为“CPU 不忙但事务提交慢”。

RHEL 主机指标与数据库负载关联观测图 从业务 SQL 到硬件资源的四层映射,箭头表示影响传导方向 业务 SQL 层 慢查询 / 高并发 排序 / 哈希连接 事务提交 / 回滚 批量导入 / 复制 观测入口:AWR / pg_stat_statements / performance_schema 数据库实例层 等待事件 会话 / 锁 Buffer / Cache Redo / WAL 写入 关键判断:db file sequential read、log file sync、buffer busy waits 进程与调度层 上下文切换 运行队列 内存换页 I/O 调度队列 观测工具:vmstat、pidstat、mpstat、/proc/pressure 硬件与内核资源层 CPU us / sy / wa / st %irq / %soft 内存 available / si / so Dirty / Writeback 磁盘 r_await / w_await aqu-sz / %util 网络 retrans / drop Recv-Q / Send-Q 关联分析主线:等待事件 → 主机指标 → 根因定位

四、把指标与数据库等待事件对应起来

真正有效的关联分析,是把主机指标翻译成数据库等待事件。例如:db file sequential read 高,同时 iostat 显示某块设备 r_await 高,说明索引读落在慢盘上;log file sync 高,同时 w_await 高且 %util 接近 100%,说明 redo 日志写入排队;latch free 或 buffer busy waits 高,同时 sy 和上下文切换高,说明 CPU 竞争或共享内存争用。反过来,若数据库等待事件集中在 CPU time,而主机 us 高、wa 低,则优化方向应是 SQL 与索引,而不是加磁盘。

下面给出一个可直接用于巡检的关联判断表,字段按“数据库现象—主机指标—可能根因—验证命令”组织,便于在故障现场快速对照。

数据库现象 主机关键指标 可能根因 验证命令
db file sequential read 高 r_await > 10ms,%util 高 索引读落在慢盘或队列深 iostat -x 1、pidstat -d 1
log file sync 高 w_await 高,Dirty 增长快 redo 日志写入排队 iostat -x 1、/proc/meminfo
buffer busy waits 高 sy 高,cs 高,us 中等 共享内存争用或热块 vmstat 1、mpstat -P ALL 1
提交延迟抖动 si/so 非零,swappiness 高 内存换页导致进程停顿 vmstat 1、cat /proc/meminfo
复制延迟增大 retrans 增长,Recv-Q 堆积 网络重传或接收端处理慢 sar -n DEV 1、ss -s
事务提交慢但 CPU 不忙 %soft 单核偏高 软中断瓶颈或网卡队列不均 mpstat -I SUM 1、/proc/interrupts

五、观测顺序与常见误区

建议的观测顺序是:先看数据库等待事件确定方向,再用 vmstat、iostat、sar 验证主机层,最后用 pidstat、/proc/interrupts 定位到进程或 CPU。常见误区有三个:一是把 free 低当成内存不足,忽略 page cache 的正常占用;二是把 %util 100% 直接等同于磁盘瓶颈,忽略 await 和队列;三是只看平均值,忽略单核、单设备、单队列的偏斜。数据库负载往往集中在少数资源上,平均值会掩盖真实瓶颈。

在 RHEL 上可先用 dstat -tcmnd --disk-util --top-cpu --top-io 做一次综合采样,快速判断是 CPU、内存、磁盘还是网络主导,再进入专项工具细查。