一、故障概述
二、环境信息
配置类别 具体参数
CPU 32 核
内存 128GB
主库 IP 10.21.41.3
备库IP 10.21.41.4
磁盘设备 类型 总容量 挂载目录 用途
Vdb SATA 1000GB /dm8 存放备份
Vdc SSD 2.9TB /data 实例目录,存放数据
Vde SSD 1000GB /dmsqlog SQL日志目录
三、故障分析
本次数据库服务中断的根本原因是磁盘读写性能瓶颈,引发 SQL 语句执行效率大幅下降,大量语句因等待磁盘 I/O 而陷入长时间阻塞,无法及时返回数据结果。前端应用系统因未接收到预期的数据响应,进而持续发起新的数据库连接请求并尝试获取数据。随着连接请求不断积压,导致数据库服务器的内存资源被耗尽,最终会触发内存OOM故障,导致数据库服务中断。
核心诱因:磁盘I/O 性能存在瓶颈
数据库实例目录所在磁盘(vdc)的同步写性能远低于生产需求,无法支撑数据的实时写入,是故障的 “导火索”,通过dd 命令性能测试与nmon 磁盘监控双重验证:
(1)dd 命令同步写测试:
第一次测试:写入640 MB数据,耗时 118.358秒,速度为5.7 MB/s
第二次测试:写入640 MB数据,耗时 130.684秒,速度为5.1 MB/s
第三次测试:写入640 MB数据,耗时 177.866秒,速度为3.8 MB/s
结论:vdc磁盘的同步写速度仅3.8-5.7MB/s,远低于达梦数据库最低上线标准,I/O 请求持续排队,导致数据库进程频繁等待磁盘响应。
(2)nmon 磁盘监控:故障时段磁盘繁忙度骤升
在故障发生时段,主库与备库数据盘的%Busy(繁忙度)指标持续处于高位。这表明磁盘此时处于高负载、高繁忙状态,达到磁盘性能的瓶颈点,与dd测试结果相互印证。
(3)数据库运行日志:redo log写入超时
数据库在将内存中的数据页(page)刷写到磁盘,或从磁盘读取数据页时,耗时超过3秒(3492ms),远超正常值。
事务提交时,数据库需要将 redo log 写入磁盘,但写入耗时超过3 秒,这会严重拖慢事务提交速度,影响整个数据库性能。
2. 连锁反应:I/O瓶颈导致SQL执行效率大幅下降
磁盘 IO 无法及时响应,导致 SQL 语句因 “等待磁盘 I/O” 陷入长时间阻塞,即使简单SQL也出现执行延迟,具体证据来自SQL 执行耗时统计日志:
(1)SQL 执行耗时异常
故障期间,多类简单 SQL 命令的执行时间较正常水平(10-100 毫秒)飙升数百倍,部分统计数据如下:
结论:无数据读写的“set schema”命令以及“select 1”最大执行时间达10秒以上(通常为0.001秒左右),证明数据库进程因等待磁盘 I/O无法正常处理请求。
3. 最终爆发:连接激增耗尽内存,触发OOM故障
前端应用因持续未收到 SQL 执行结果,进而持续发起新的连接请求并尝试获取数据,导致连接数暴增,最终耗尽 128GB 内存,系统触发 OOM 并杀死数据库进程。
(1)应用连接请求:8000+ 次会话申请
由于SQL执行缓慢,前端应用无法在预期时间内收到数据响应。应用系统误以为是连接或短暂故障,因此不断重试并创建新的数据库连接。
根据日志分析,在极短的时间窗口内(例如,17:06:32至17:06:55),系统分配了超过4000+ 个新的数据库会话连接。主库发生故障,备库接管后17:07:03至17:07:51,系统分配了超过8000+ 个新的数据库会话连接.
假设每个连接占用5MB内存,8000个连接将消耗约40GB内存。
这种失控的连接增长,最终导致数据库进程的内存使用量急剧攀升。
(2)OOM 触发:数据库进程被杀死
服务器的物理内存(128G)被迅速耗尽,触发了操作系统的OOM机制
操作系统为保障基础运行,强制杀死dmserver进程,数据库服务彻底中断。
四、故障根因总结
本次数据库服务中断的根本原因是磁盘的I/O性能瓶颈,故障全链路可概括为:
磁盘I/O性能不足(3.8-5.7MB/s)→ SQL执行慢发生阻塞 → 应用持续申请新连接会话 → 内存耗尽触发OOM → 数据库进程被杀死,服务中断
五、整改建议
1、扩容内存至256GB,为业务高峰期内存增长预留冗余,提升系统抗风险能力;
2、更换更高性能的SSD,并测试确保写入吞吐量稳定在150 MB/s以上,从根源切断“I/O瓶颈→SQL超时→连接积压→触发oom”的故障链路。
文章
阅读量
获赞
