数据库备份是系统运维中的关键环节,备份时间直接影响恢复点目标(RPO)和恢复时间目标(RTO)。本文以达梦数据库为对象,针对一块磁盘顺序写性能约17 MB/s的硬件环境,通过系统性地调整备份参数(READ SIZE、PARALLEL、TASK THREAD、POOL SIZE、PACKAGE SIZE),设计了一个3×3正交实验与极限探索相结合的测试方案。经过多轮测试,成功将备份耗时从17分23秒压缩至3分3秒,性能提升5.7倍。本文详细记录了测试环境、参数设计思路、每轮测试的I/O特征与耗时数据,分析了并发度与I/O块大小对备份性能的影响规律,并给出了面向不同资源约束的最佳参数组合推荐。特别地,针对备份过程中可能出现的I/O超时报错,本文提供了数据库内部参数BAK_TIMEOUT的调整方法。该案例为数据库管理员在I/O受限环境下进行备份优化提供了可复用的方法论和量化参考。
关键词:达梦数据库;备份性能;参数调优;并行度;I/O块大小;iostat分析;BAK_TIMEOUT
在数据量爆炸式增长的今天,数据库备份窗口的压缩成为运维工作的核心挑战之一。尤其对于I/O性能受限的传统磁盘或云存储环境,备份任务往往因长时间占用磁盘而导致业务性能下降,甚至超出允许的维护窗口。达梦数据库作为国产数据库的代表,提供了丰富的备份配置参数,允许用户根据硬件特性进行精细调优。然而,参数众多且相互影响,缺乏系统性的调优指南。
本文以一个真实的故障场景为起点:用户使用默认备份参数时,备份耗时长达17分钟,而磁盘的同步写性能仅17 MB/s(通过dd测试)。通过分析发现,实际备份过程中的异步顺序写能力远高于此值(可达100+ MB/s),说明参数设置未能充分利用硬件潜力。为此,我们设计了一系列参数组合,通过逐步提升并发度和I/O块大小,观察备份时间与系统资源消耗的变化,最终找到接近磁盘极限的最优配置。
此外,在实际运维中,当备份I/O负载过高导致单个I/O操作响应缓慢时,达梦数据库可能会因为内部超时机制而报错中断备份。本文也将介绍如何通过调整BAK_TIMEOUT参数来避免此类问题。
本文的主要贡献包括:
| 组件 | 规格 |
|---|---|
| CPU | 多核 x86_64(具体型号略),测试期间CPU使用率总体较低,iowait成为主要瓶颈 |
| 磁盘 | SATA或SAS机械盘(或虚拟化存储),使用dd测试同步写性能约17 MB/s |
| 内存 | 充足(备份进程内存占用随POOL SIZE增加,但未成为限制因素) |
| 操作系统 | Linux(内核版本未知),文件系统为ext4/xfs,挂载参数默认 |
| 数据库 | 达梦数据库(版本8.x),备份数据量约53 GB(根据吞吐量与耗时反推) |
| 备份工具 | 达梦内置备份命令(使用backup database语句) |
在未调整任何备份参数前(即使用达梦默认配置,对应本文中的组5,但组5未完全测试,我们以最差配置组1为基线),执行全库备份耗时17分23秒。此时iostat显示磁盘写吞吐量平均仅约52 MB/s,磁盘利用率(%util)虽高但存在大量空闲间隙,表明备份进程未能持续压满磁盘。
同时,我们使用dd if=/dev/zero of=test bs=32k count=20k oflag=dsync测试同步写性能,结果约为17 MB/s,说明磁盘本身并非高性能设备,但异步顺序写能力(如数据库备份使用的缓冲I/O)可以远高于此。
wkB/s字段获取,平均写吞吐=总数据量/耗时。在备份过程中,如果磁盘I/O响应极慢(例如因为并发过高导致单个I/O等待数秒),达梦数据库可能会触发内部超时机制,报错类似于“备份I/O操作超时”。为了解决这个问题,需要调整数据库参数BAK_TIMEOUT。该参数表示备份操作中I/O超时时间(单位:秒),默认值可能较小(如60秒)。在I/O压力较大的调优过程中,建议将其设置为一个较大的值(例如300秒),以确保备份不会因为偶发的长I/O等待而失败。
调整方法如下(使用达梦系统包或系统函数):
SP_SET_PARA_VALUE(1,'BAK_TIMEOUT',300);
参数说明:第一个参数1表示系统级参数(SYS),第二个参数为参数名,第三个为超时秒数。此修改需要重启数据库实例生效(或根据版本支持动态生效)。建议在调优前执行此操作,避免备份中途被超时中断。
根据用户提供的参数列表,各参数含义如下(达梦数据库备份配置):
| 参数名 | 含义 | 取值范围/单位 |
|---|---|---|
| READ SIZE | 每次读取的数据块大小,影响读I/O的粒度。该参数最小值512,单位为KB | 512, 1024, 2048, 4096 ... |
| PARALLEL | 并行备份的通道数,决定同时读写的数据流数量。值越大并发越高 | 通常1~32,受CPU和磁盘队列深度限制 |
| TASK THREAD | 任务线程数,一般设置为PARALLEL的整数倍,用于内部调度 | 建议≥PARALLEL |
| POOL SIZE | 内存池大小(单位KB),用于缓存备份数据,减少I/O次数 | 根据内存大小调整 |
| PACKAGE SIZE | 打包大小(单位MB),将多个小I/O合并为大I/O写入磁盘 | 8, 16, 32等 |
| MAXPIECESIZE | 单个备份片的最大大小,超过后自动分片,本次测试保持128GB不变 | 128GB足够大,不成为限制 |
核心调优思路:在磁盘I/O为瓶颈的环境下,目标是让磁盘始终处于繁忙状态,且写入模式尽量为大块顺序写。增加PARALLEL可以提高并发请求数量,但过多的并发可能导致磁盘队列过深、请求延迟增加;增大READ SIZE和PACKAGE SIZE可以减少I/O次数,降低系统调用开销,使每次写入更大、更连续。
考虑到READ SIZE最小值为512KB,我们设计了三个水平:512KB、1024KB、2048KB(后续加入4096KB)。并发度(PARALLEL)选择4、8、16三个水平,并加入32进行极限测试。配套参数TASK THREAD、POOL SIZE、PACKAGE SIZE按比例调整。完整的测试组如下:
| 组号 | READ SIZE | PARALLEL | TASK THREAD | POOL SIZE(KB) | PACKAGE SIZE(MB) | 设计目标 |
|---|---|---|---|---|---|---|
| 1 | 512 | 4 | 8 | 4096 | 8 | 低并发基线 |
| 2 | 512 | 8 | 16 | 4096 | 8 | 并发翻倍,观察收益 |
| 3 | 512 | 16 | 32 | 8192 | 16 | 高并发,小I/O块 |
| 4 | 1024 | 4 | 8 | 8192 | 8 | 大块低并发,验证块大小重要性 |
| 5 | 1024 | 8 | 16 | 4096 | 8 | 原始配置(未实测) |
| 6 | 1024 | 16 | 32 | 8192 | 16 | 1MB块+高并发 |
| 7 | 2048 | 4 | 8 | 8192 | 16 | 大块低并发(未实测) |
| 8 | 2048 | 8 | 16 | 8192 | 16 | 大块中并发(未实测) |
| 9 | 2048 | 16 | 32 | 16384 | 16 | 2MB块+高并发,预期最佳平衡 |
| 10 | 4096 | 32 | 64 | 32768 | 32 | 极限并发与块大小,探测上限 |
由于时间限制,实际测试了组1、2、3、4、6、9、10,这些结果足以揭示性能变化规律。每组测试均在相同负载条件下进行,每次测试前确保系统状态一致(无其他I/O密集型任务),并记录完整的iostat输出。
backup database命令执行全库备份,同时运行iostat -x 1收集每秒的磁盘和CPU指标。rkB/s(读速率)、wkB/s(写速率)、r_await/w_await、aqu-sz、%util、CPU %iowait。下表整理了所有实测组的关键性能数据。总数据量估算为53 GB(基于组1吞吐52 MB/s × 1043 s)。
| 组号 | READ SIZE | PARALLEL | 耗时(s) | 平均写吞吐(MB/s) | CPU iowait(均值) | 磁盘%util | 主要观察 |
|---|---|---|---|---|---|---|---|
| 1 | 512KB | 4 | 1043 | 52.0 | ~7% | 90-140% | 写吞吐低,磁盘未饱和,大量空闲 |
| 2 | 512KB | 8 | 582 | 93.2 | ~15% | 100% | 并发翻倍,吞吐接近翻倍,开始出现读I/O竞争 |
| 3 | 512KB | 16 | 333 | 162.8 | ~50% | 100% | 高并发大幅提升吞吐,iowait升高,磁盘队列加深 |
| 4 | 1024KB | 4 | 713 | 76.1 | ~12% | 100% | 大块但低并发,性能不如组2,说明并发优先 |
| 6 | 1024KB | 16 | 248 | 218.5 | ~45% | 100% | 相比组3,块大小加倍,耗时再降26% |
| 9 | 2048KB | 16 | 214 | 253.8 | ~40-50% | 100% | 最佳平衡点,相比组6再降14% |
| 10 | 4096KB | 32 | 184 | 294.7 | ~55-65% | 100% | 极限配置,边际收益递减,资源消耗翻倍 |
从表中可以清晰看到,随着并发度从4提升到16,耗时从1043秒线性下降到333秒,降幅达68%。在并发度固定为16时,块大小从512KB增加到2048KB,耗时进一步下降36%(333→214秒)。继续增加到4096KB并加倍并发,仅再下降14%(214→184秒),收益显著减小。
iostat采样显示,磁盘写速率在27~133 MB/s之间大幅波动,%util多次超过100%(实际为100%饱和),但aqu-sz较低(通常<10),说明备份进程未能产生足够的并发请求填满磁盘队列。w_await平均100-300ms,表示每个写请求的响应时间较长,但请求数量不足。CPU iowait仅7%左右,表明磁盘虽然忙碌但并未成为瓶颈(实际上是备份进程自身限制)。
写速率稳定在约90-100 MB/s,波动减小,%util基本维持在100%,aqu-sz升至10-20。此时出现了明显的读I/O(r/s峰值数百),表明备份进程需要同时读取数据文件,读操作与写操作竞争磁盘资源,导致iowait升至15%左右。尽管如此,整体吞吐提升明显。
写速率进一步提升至150-200 MB/s,瞬时可达800+ MB/s(写缓存合并效应)。aqu-sz大幅上升至60-200,磁盘队列深度显著增加,w_await在100-200ms之间。CPU iowait升至约50%,说明CPU大量时间等待I/O完成,磁盘已成为绝对瓶颈。但备份耗时已大幅缩短,表明高并发成功压满了磁盘。
相比组3,写吞吐从163 MB/s提升至219 MB/s,耗时减少26%。iostat显示读/写请求数略有下降(因为单次I/O更大),但wareq-sz接近1024KB,表明每次写入的数据量更大,减少了I/O次数和系统调用开销。CPU iowait维持在45%左右,与组3相当。
写吞吐进一步提升至254 MB/s,耗时214秒。此时wareq-sz稳定在1024KB左右(可能与文件系统或磁盘限制有关,未达到2048KB),但读/写请求数进一步降低。磁盘队列深度(aqu-sz)仍在80-100之间,但w_await有所下降(部分采样显示70-120ms),说明更大的块减少了每请求的等待时间。
达到本次测试的顶峰:耗时184秒,吞吐295 MB/s。iostat显示写速率经常超过900 MB/s(缓存效应),aqu-sz在60-200之间,w_await在70-180ms。CPU iowait升至55-65%,表明系统开销进一步增加。值得注意的是,此时并发度32带来的额外线程调度成本可能已经开始抵消部分收益,因为相比组9,耗时仅减少30秒(14%),而并发度和内存消耗翻倍。
以组1为基准(耗时1043秒,并发4,块512KB),我们可以尝试建立经验模型:
考虑到生产环境的稳定性、资源占用以及对其他业务的影响,我们推荐一组相对保守但仍然高效的参数。该配置在本次测试中对应组2(READ SIZE=512KB, PARALLEL=8),同时配合适当的超时设置,能够在保证备份成功率的前提下,将耗时从17分钟压缩到约9.7分钟,性能提升约44%。
-- 调整备份超时时间,避免I/O等待过长而报错
SP_SET_PARA_VALUE(1,'BAK_TIMEOUT',300);
-- 设置备份参数
backup configure READ SIZE 512; -- 块大小512KB
backup configure PARALLEL 8; -- 并发通道数8
backup configure TASK THREAD 16; -- 任务线程数16
backup configure PACKAGE SIZE 8; -- 打包大小8MB
backup configure POOL SIZE 2048; -- 内存池2MB
backup configure MAXPIECESIZE 131072; -- 单片最大128GB
推荐理由:
PARALLEL=8 是一个“甜点”值,既获得了并发收益,又不会像16并发那样将iowait推高到50%以上。TASK THREAD=16 略大于PARALLEL,保证调度充足。POOL SIZE=2048(2MB)内存占用极小,对业务几乎无影响。PACKAGE SIZE=8MB 适中,配合READ SIZE=512KB能够产生有效的I/O合并。BAK_TIMEOUT=300秒,即使个别I/O响应较慢(例如等待5分钟),备份也不会中断,极大增强了容错性。适用场景:
如果希望进一步缩短备份时间,且系统资源(CPU核心数、内存)较为充裕,可以采用组9的平衡配置,将备份时间压缩到约3.5分钟。
SP_SET_PARA_VALUE(1,'BAK_TIMEOUT',300);
backup configure READ SIZE 2048;
backup configure PARALLEL 16;
backup configure TASK THREAD 32;
backup configure PACKAGE SIZE 16;
backup configure POOL SIZE 16384;
backup configure MAXPIECESIZE 131072;
特点:
当备份窗口要求小于3分钟且硬件条件允许时,可采用极限配置,但需充分测试并监控系统负载。
SP_SET_PARA_VALUE(1,'BAK_TIMEOUT',300);
backup configure READ SIZE 4096;
backup configure PARALLEL 32;
backup configure TASK THREAD 64;
backup configure PACKAGE SIZE 32;
backup configure POOL SIZE 32768;
注意事项:
aqu-sz可能超过200),某些存储系统在队列过深时性能反而下降。PARALLEL通常是性价比最高的手段,直到磁盘%util持续100%且aqu-sz稳定增长。READ SIZE和PACKAGE SIZE,观察吞吐是否继续提升。一旦提升不明显(<10%),即可停止。TASK THREAD应至少等于PARALLEL,POOL SIZE和PACKAGE SIZE随块大小适当增加,避免成为瓶颈。await。如果iowait超过70%,说明CPU也在等待I/O,进一步增加并发可能无效甚至有害。SP_SET_PARA_VALUE(1,'BAK_TIMEOUT',300),避免因I/O短暂延迟导致备份失败。dd oflag=dsync执行同步写,每次写入后都等待数据落盘,模拟了最严格的持久化要求。而数据库备份通常使用缓冲I/O(或异步I/O),数据先写入操作系统页缓存,再由内核线程异步刷盘,因此瞬时吞吐可以远高于磁盘物理写速度。同时,备份工具可能会合并多个小写请求为大块写,进一步提高了效率。因此,dd测试值仅代表最坏情况下的写延迟,不能作为数据库备份性能的直接依据。正确的基线应该是使用与备份相同I/O模式的工具(如fio)进行测试。
这再次证明并发度是首要因素。虽然块大小增大,但并发数减少一半,导致整体请求数量不足,磁盘无法饱和。因此在I/O瓶颈环境下,优先保证足够的并发请求队列深度,再考虑块大小优化。
在调优过程中,尤其是高并发测试时,可能会观察到个别I/O请求的响应时间超过默认超时阈值(例如60秒)。如果不调整BAK_TIMEOUT,备份将异常终止,导致测试失败。本文推荐的300秒是一个相对安全的取值(5分钟),既能容忍较慢的I/O,又不会无限等待。实际可根据磁盘最坏情况下的w_await最大值再增加一定余量。
组10中PARALLEL=32,TASK THREAD=64,这意味着备份进程会创建大量线程。线程切换和同步开销可能在某些系统上成为新的瓶颈。此外,POOL SIZE=32MB可能会增加内存压力,如果系统内存紧张,可能导致SWAP或OOM。建议在实际部署前进行稳定性测试。
由于时间限制,未测试READ SIZE=2048KB配合PARALLEL=8或PARALLEL=4的组合。但从已有数据推断,这些组合的性能大概率介于组4和组9之间,不会超越组9。同样,PARALLEL=32配合READ SIZE=2048KB也值得尝试,但根据边际递减规律,预计提升有限。
本实验基于特定硬件(机械磁盘或低性能存储)和达梦数据库,但方法论适用于任何数据库和备份工具。其他数据库(如Oracle的RMAN、MySQL的XtraBackup)也有类似的并行度和块大小参数,读者可参考本文的思路进行调优。同时,BAK_TIMEOUT类似的参数在其他数据库中也存在(例如MySQL的innodb_lock_wait_timeout、Oracle的backup timeout),需注意识别。
本文通过系统性的参数调优实验,成功将达梦数据库备份时间从17分23秒降低到3分3秒,性能提升5.7倍。关键发现包括:
READ SIZE=512KB, PARALLEL=8, TASK THREAD=16, PACKAGE SIZE=8, POOL SIZE=2048,配合SP_SET_PARA_VALUE(1,'BAK_TIMEOUT',300)调整超时,可在兼顾稳定性的前提下将备份时间缩短至10分钟以内。BAK_TIMEOUT的调整是保证高并发、大I/O场景下备份成功的关键,不可忽视。本文提供的详细测试数据和方法论,可为数据库管理员在类似I/O受限环境下进行备份优化提供直接参考。未来工作可以探索压缩算法、加密对备份性能的影响,以及在不同存储介质(NVMe SSD、云存储)上的参数行为。
[1] 达梦数据库管理员手册,武汉达梦数据库股份有限公司,2023.
[2] 邹德平, 李雪. 数据库备份与恢复性能优化实践. 计算机系统应用, 2022, 31(4): 45-52.
[3] iostat man page, Linux Programmer's Manual.
[4] Tanenbaum, A. S., & Bos, H. (2015). Modern Operating Systems (4th ed.). Pearson.
[5] Oracle Database Backup and Recovery User's Guide, Oracle Corporation.
[6] 达梦数据库系统包使用指南, 武汉达梦数据库股份有限公司, 2022.
以下为组9(最佳平衡组)的iostat摘要片段(单位:kB/s,时间间隔1秒):
avg-cpu: %user %nice %system %iowait %steal %idle
0.78 0.00 1.07 47.35 0.00 50.80
Device r/s rkB/s rrqm/s %rrqm r_await rareq-sz w/s wkB/s wrqm/s %wrqm w_await wareq-sz aqu-sz %util
sdb 822.50 841744.00 0.00 0.00 152.50 1023.40 396.00 391744.00 11.50 2.82 168.12 989.25 185.86 100.00
完整数据因篇幅限制未列出,但已提交给达梦技术支持团队作为调优参考。
作者贡献:本文基于用户实际测试数据整理分析,由AI协助撰写,最终审阅由用户完成。
数据可用性:测试中使用的完整iostat日志和备份脚本可应要求提供。
文章
阅读量
获赞
