3. 数据库主机资源画像

数据库主机的性能问题很少是单一时刻的“突发故障”,更多是长期资源分配失衡的累积结果。要判断一台运行 Oracle、MySQL 或 PostgreSQL 的主机是否健康,不能只看某一刻 CPU 使用率是否飙高,而需要建立一套可对比、可回溯的性能基线。所谓基线,就是在业务正常、负载稳定的时段,采集 CPU、内存、磁盘 I/O、上下文切换、进程级资源占用等指标,形成一组“正常态参考值”。此后任何异常波动,都可以与基线对照,快速定位是数据库内部问题,还是主机资源被其他进程挤占。

本节围绕五类工具展开:top 用于快速观察整体负载与进程排名,vmstat 用于观察 CPU、内存、交换和上下文切换的宏观趋势,iostat 用于定位磁盘吞吐与延迟瓶颈,sar 用于历史数据回溯与长期趋势分析,pidstat 用于把资源消耗精确落到具体进程。它们不是互相替代的关系,而是从“面”到“点”逐层收敛的观测链。

数据库主机资源画像:五工具观测链与基线指标 top 整体负载 / 进程排名 vmstat CPU/内存/交换/上下文 iostat 磁盘吞吐 / 延迟 / 队列 sar 历史回溯 / 长期趋势 pidstat 进程级 CPU/IO/内存 基线采集窗口:业务平稳期 · 连续采样 · 固定间隔 示例:每 5 秒采样一次,持续 30 分钟,覆盖至少一个完整业务周期 CPU 基线 us / sy / id / wa r 队列长度 上下文切换 cs 内存基线 free / buff / cache si / so 交换活动 可用内存余量 磁盘 I/O 基线 r/s w/s 吞吐 await 平均延迟 %util 设备饱和度 进程基线 数据库进程 CPU% 进程 IO 读写速率 内存 RSS 占用 基线档案:正常态参考区间 示例:CPU us 40%~55% · wa < 5% · await < 10ms · %util < 60% · si/so ≈ 0 异常判定:任一指标持续偏离基线区间,即触发分层排查

上图展示了从工具采集到基线档案形成的完整观测链。下面逐一说明每个工具在数据库主机场景下的关键读数和判断方法。

top:第一眼定位整体负载与进程排名

top 是最快的入口。在数据库主机上,重点关注第一行负载均值与第三行 CPU 分布。例如一台 16 核主机,load average: 4.2, 3.8, 3.5 表示过去 1、5、15 分钟的平均可运行进程数约为 4,相对于 16 核并不算高;但如果 load average 持续超过核数,说明 CPU 排队明显。第三行中 %wa 是数据库主机最值得警惕的指标:若 wa 长期高于 10%,说明磁盘 I/O 已成为瓶颈,CPU 在等待 I/O 完成。此时按 P 按 CPU 排序、按 M 按内存排序,可以快速看到是数据库进程本身还是备份、日志、监控代理等外部进程在消耗资源。

vmstat:观察 CPU、内存与交换的宏观趋势

vmstat 5 12 表示每 5 秒采样一次,共 12 次,覆盖 1 分钟。关键列包括:r 运行队列长度,持续大于 CPU 核数说明 CPU 竞争激烈;si 和 so 是换入换出,数据库主机上理想值应接近 0,一旦持续非零,说明物理内存不足,数据库缓存被换出,性能会急剧下降;cs 上下文切换次数,若异常偏高,往往与大量短连接或锁竞争有关;us、sy、id、wa 则给出 CPU 时间分配。基线采集时,应记录平稳期的 r、cs、si/so 典型值,作为后续对比依据。

iostat:定位磁盘吞吐、延迟与饱和度

iostat -x 5 输出扩展统计,数据库主机重点看 r/s、w/s、await、%util。以一块 SSD 为例,若基线期 await 约 1~3 ms、%util 约 30%,而某时段 await 升至 25 ms、%util 接近 100%,说明设备已饱和,数据库的 redo 写入或全表扫描正在排队。需要注意,%util 对多队列 NVMe 设备并不完全线性,应结合 await 和队列深度综合判断。基线应记录数据盘、日志盘、归档盘各自的正常区间,因为不同盘承担不同 I/O 模式。

sar:历史回溯与长期趋势

sar 依赖 sysstat 服务持续采集,默认每 10 分钟写入一次历史文件。它的价值在于“事后复盘”:当业务反馈昨天 14:00 数据库变慢,可以用 sar -u -f /var/log/sa/sa15 -s 14:00:00 -e 15:00:00 回看当时的 CPU 分布,用 sar -d 回看磁盘,用 sar -r 回看内存。基线建立时,应至少保留一个完整业务周期的 sar 数据,并标注业务高峰、批处理窗口、备份窗口等时间点,使后续对比有明确参照。

pidstat:把资源消耗落到具体进程

当 top 或 vmstat 发现异常后,用 pidstat 精确定位。例如 pidstat -p <PID> 5 观察某数据库进程的 CPU 使用,pidstat -d 5 观察各进程磁盘读写,pidstat -r 5 观察内存占用。数据库主机上常见的情况是:mysqld 或 ora_pmon 等进程 CPU 正常,但一个备份脚本或日志采集 agent 占用了大量 I/O,导致数据库 await 升高。pidstat 能把“主机慢”转化为“哪个进程在消耗什么资源”,这是基线排查链的最后一环。

建立基线时,建议固定采样命令与时间窗口,例如每天业务平稳期执行一次 vmstat 5 60 >> /var/log/baseline/vmstat_$(date +%F).log,并同步记录 iostat -x 5 60 与 pidstat -d 5 60。基线不是一次性的,而应随业务增长定期更新。

基线档案示例

下表给出一台 16 核、64 GB 内存、SSD 数据盘的 MySQL 主机在平稳期的基线参考区间(示例数据,用于说明字段与判断方式,非实测结果):

指标 采集工具 基线参考区间 异常提示
CPU ustop / vmstat40%~55%持续 > 75% 需排查慢查询
CPU watop / vmstat< 5%持续 > 10% 说明 I/O 瓶颈
运行队列 rvmstat< 4持续 > 16 说明 CPU 排队
交换 si/sovmstat≈ 0持续非零说明内存不足
磁盘 awaitiostat -x< 10 ms> 20 ms 需关注
磁盘 %utiliostat -x< 60%> 85% 接近饱和
数据库进程 CPUpidstat30%~50%突增需结合慢日志
数据库进程 IOpidstat -d依业务而定备份/日志进程异常占用需隔离

需要强调的是,基线值因硬件、数据库类型、业务模型差异很大,上表仅用于说明“字段如何组织、判断如何表达”。真正可用的基线必须来自本机在平稳期的实际采集。建立基线后,日常巡检只需将当前值与基线区间对比:若 CPU us 正常但 wa 升高,优先查 iostat 和 pidstat -d;若 si/so 非零,优先查内存与数据库缓存配置;若 load 高但 CPU 空闲,则考虑 I/O 等待或锁竞争。通过这套从宏观到进程的观测链,数据库主机的资源画像才能从“感觉慢”变成“有据可查、有径可循”。