love wife love life —Roger的Oracle/MySQL/PostgreSQL数据恢复博客

Phone:18180207355 提供专业Oracle/MySQL/PostgreSQL数据恢复、性能优化、迁移升级、紧急救援等服务

达梦数据库学习笔记 — 达梦数据库IO写入性能与Partial write

我们知道达梦数据库默认有多个IO线程,负责数据落盘写入,如下:

接下来我们分别准备几个会话窗口来进行一些IO写入测试和trace跟踪,观察一下IO写入情况:

再另一窗口使用strace先跟踪一下:

从上面的trace跟踪结果来看,IO线程的写入均为8192,即达梦数据库默认的page size大小;说明达梦数据库不会对IO进行合并。

我们进一步观察一下checkpoint和redo log刷新线程:

下面是checkpoint 线程的写情况:

接下来看看redo log写进程:

从上面信息来看,redo log的写入是会进行IO合并的,最小IO粒度是512,也就是redo log block size大小。同时也可以看到,触发检查点之后,检查点线程会更新其他非current redo,这一点跟Oracle类似。

最后我们再通过blktrace来观察一下操作系统底层的IO情况。

由于产生的trace文件内容较多,尝试过滤看看:

这里我们直接搜索IO线程:

通过btt分析之后,会产生dat文件,进一步分析dat文件。

这里58115968 58115976 相减为8. 说明这一步IO操作,共进行了8次。其中56231872到56231880 也是8次IO。整个一共进行了16次IO。

最后简单总结一下:

1、 从前面测试来看,达梦数据库IO线程在进行数据落盘写入时,是以page size大小为单位的,而且是单块写入,每次只能写1个。
当然在操作系统层来看,一次数据库最小IO(8k),则需要完成16次IO操作。 这应该也是一个较大的性能瓶颈点;这或许也算是达梦数据库为什么性能不是太强悍的重要原因之一。

2、 从测试来看,达梦数据库的机制也存在大多数数据库都存在的partial write(page断裂)问题,再加上达梦没有类似MySQL或MogDB一样的Double Write机制,因此这算是一个数据安全隐患。

3、Redo log线程在写入日志时会进行IO合并。

Leave a Reply

You must be logged in to post a comment.