一、为什么要监控磁盘 I/O
磁盘 I/O 性能直接影响到达梦数据库的事务响应速度、日志写入效率以及整体吞吐量。监控磁盘 I/O 的目的包括:
- 保障数据库响应时间:达梦数据库在大量并发写入(如 redo log、数据页刷盘)时,I/O 延迟过大会导致事务等待,降低 TPS。
- 提前发现瓶颈:通过观察磁盘繁忙度(%util)和平均等待时间(await),可在性能问题影响用户之前进行干预。
- 容量规划:了解 I/O 增长趋势,决定何时升级存储(如从 HDD 换为 SSD)或拆分数据文件。
- 验证优化效果:修改达梦参数(如
BUFFER、CKPT_INTERVAL)或更换磁盘调度器后,通过 I/O 指标量化改进。
二、达梦数据库的 I/O 特征
在监控之前,需要了解达梦数据库产生磁盘 I/O 的主要场景:
| I/O 类型 | 说明 | 典型特征 |
| 数据文件读写 | 查询时读取数据页,DML/DDL 时修改数据页并最终由检查点写回 | 随机读 + 随机写,读写比例不定 |
| 重做日志(redo log) | 事务提交时顺序写入 redo 日志,保证持久性 | 顺序写,延迟敏感,写吞吐量较高 |
| 归档日志 | 日志切换后归档,通常为顺序写 | 顺序写,可能占用大量带宽 |
| 临时表空间 | 排序、哈希连接等操作使用临时表空间 | 多为读写混合,可能产生大量 I/O |
| 备份与恢复 | 使用 dmrman 或 dexp 进行备份/导出 | 顺序读或写,占用高带宽 |
三、核心 I/O 指标解读
使用 iostat -x -d -m 1 可以获得以下关键指标。掌握这些指标是分析 I/O 性能的基础。
| 指标 | 含义 | 健康范围参考(针对达梦数据库) |
| r/s, w/s | 每秒读/写请求次数(IOPS) | 普通 SAS HDD 约 200~300,SSD 可达 5000+ |
| rMB/s, wMB/s | 每秒读/写数据量(吞吐量) | HDD 约 100~200 MB/s,SATA SSD ~500 MB/s |
| %util | 磁盘繁忙度,表示 I/O 请求在时间上的占比。若持续 > 80%,说明磁盘可能成为瓶颈 | 达梦 OLTP 建议 < 70%;OLAP 可允许短期 100% |
| await | 平均每次 I/O 请求的响应时间(毫秒)。对 redo log 写入尤其重要 | SSD < 2ms,HDD < 10ms;> 20ms 需告警 |
| avgrq-sz | 平均请求大小(扇区数,512 字节/扇区)。达梦默认数据页大小通常为 8KB 或 16KB(对应 16~32 扇区) | 数据库场景常见 16~64 扇区(8~32 KB) |
| aq-sz | 平均队列深度。若持续 > 2 且 await 升高,说明 I/O 压力较大 | 一般 < 2,高并发时可接受 4~5 |
注意:
%util高不一定表示磁盘坏,也可能是高性能设备(如 NVMe SSD)在多队列下利用率高但延迟仍很低。需结合await判断。
四、识别设备映射
在使用 LVM(逻辑卷管理)时,iostat 会显示 dm-0、dm-1 等设备名。你需要知道这些设备对应哪些达梦相关的文件系统。
使用 lsblk 查看树形关系
--输出示例:
sda
└─sda3
├─klas-root (dm-0) /
├─klas-swap (dm-1) [SWAP]
└─klas-backup(dm-2)
说明:
dm-0 → 根文件系统 /,若达梦软件安装在此,数据文件、redo log 也在此。dm-1 → swap,监控其 I/O 可判断内存是否不足。dm-2 → 备份卷,未挂载则无 I/O。
五、常用监控命令与工具
5.1 实时监控(推荐组合)
# 每 2 秒显示所有磁盘的扩展统计,以 MB 为单位
iostat -x -d -m 2
# 只关注达梦数据目录所在的磁盘(如 dm-0)
iostat -x -d -m dm-0 2
5.2 定位 I/O 来源进程
当发现磁盘繁忙时,使用以下工具找出是哪些进程产生了 I/O:
# 类似 top,按 I/O 排序
iotop -o
# 使用 pidstat 查看每个进程的 I/O 统计
pidstat -d 2
5.3 长期记录与告警
#!/bin/bash
# ============================================================
# 脚本名称: io_monitor.sh
# 脚本作者: shine
# 功能描述: 监控 Linux 主机 IO 情况并记录到日志(dmdba 用户版)
# 依赖工具: iostat (sysstat)
# 部署路径: /home/dmdba/io_monitor.sh
# 日志路径: /home/dmdba/io_logs/io_YYYYMMDD.log
# ============================================================
# ---------------------- 配置区域 ----------------------
LOG_DIR="/home/dmdba/io_logs" # 日志存放目录(dmdba 可写)
LOG_FILE="${LOG_DIR}/io_$(date +%Y%m%d).log" # 按天分割日志
SAMPLE_COUNT=3 # 采样次数
SAMPLE_INTERVAL=2 # 采样间隔(秒)
# -----------------------------------------------------
# 检查 iostat 是否存在
if ! command -v iostat &>/dev/null; then
echo "错误:iostat 命令未找到,请确保已安装 sysstat。" >&2
exit 1
fi
# 创建日志目录(如果不存在)
mkdir -p "$LOG_DIR" || {
echo "错误:无法创建日志目录 $LOG_DIR" >&2
exit 1
}
# 记录开始标记及采样数据
{
echo "==================== $(date '+%Y-%m-%d %H:%M:%S') ===================="
echo "采样参数: 间隔=${SAMPLE_INTERVAL}秒, 次数=${SAMPLE_COUNT}"
echo ""
# 执行 iostat 采集
# -x : 显示扩展统计信息(含 await、%util 等关键指标)
# -d : 仅显示设备利用率报告
# -t : 打印时间戳
# -m : 吞吐量以 MB/s 为单位(便于阅读高速存储)
iostat -x -d -t -m "$SAMPLE_INTERVAL" "$SAMPLE_COUNT"
echo ""
} >> "$LOG_FILE" 2>&1
# 自动压缩 7 天前的原始日志(避免占用过多空间)
find "$LOG_DIR" -type f -name "io_*.log" -mtime +7 -exec gzip -f {} \;
# 自动删除 30 天前的压缩日志(彻底释放空间)
find "$LOG_DIR" -type f -name "io_*.log.gz" -mtime +30 -delete
将以上脚本加入 crontab,每5分钟记录一次,配合监控系统(如 Zabbix、Prometheus)设置告警:
await > 20(SSD 场景)%util > 80持续 5 分钟
六、总结
磁盘 I/O 是达梦数据库性能的关键因素之一。通过定期使用 iostat 等工具监控核心指标,结合 lsblk 明确设备映射,并掌握针对达梦特征的分析方法,可以快速定位 I/O 瓶颈,做出合理的优化决策。建议将 I/O 监控纳入日常运维巡检体系,并与达梦自身的动态性能视图(如 V$SQL_STAT、V$SESSION_STAT、V$LATCHES)配合使用,形成完整的性能分析闭环。