达梦数据库服务器的磁盘I/O监控指南

一、为什么要监控磁盘 I/O

磁盘 I/O 性能直接影响到达梦数据库的事务响应速度、日志写入效率以及整体吞吐量。监控磁盘 I/O 的目的包括:

  • 保障数据库响应时间:达梦数据库在大量并发写入(如 redo log、数据页刷盘)时,I/O 延迟过大会导致事务等待,降低 TPS。
  • 提前发现瓶颈:通过观察磁盘繁忙度(%util)和平均等待时间(await),可在性能问题影响用户之前进行干预。
  • 容量规划:了解 I/O 增长趋势,决定何时升级存储(如从 HDD 换为 SSD)或拆分数据文件。
  • 验证优化效果:修改达梦参数(如 BUFFERCKPT_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-0dm-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_STATV$SESSION_STATV$LATCHES)配合使用,形成完整的性能分析闭环。

暂无评论

发送评论 编辑评论


|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇