近日客户报多套10g的数据库在使用NBU磁带备份时出现RMAN FULL BACKUP十分缓慢的问题,这些数据库中最大一个的达到2.61T,该数据库在一个月前地全库0级备份耗时在3-4个小时,而在最近猛涨到17个小时。客户之前已经向Symantec提交了服务请求,但暂时没有得到结论。希望我们从Oracle角度分析该备份速度变慢问题。 我们首先分析了备份信息的动态视图V$rman_backup_job_details:
OUTPUT_DEVICEINPUT_TYPEELAPSED_SECONDSINPUT_BYTES_DISPLAYINPUT_BYTES_PER_SECOUTPUT_BYTES_PER_SEC
17SBT_TAPEDB INCR620782.61T44.08M18.10M
以上可以确认在对2.61T大小的数据库执行全库磁带备份时耗费了62078s,这里还显示了backup时每秒的读取IO为44M,每秒的写出IO为18M;这里不能因为简单的output io per second<input io per second,而断论写出能力存在瓶颈;备份时对数据文件的读取和写出backup piece到备份介质上的操作是一个整体,CPU、Input IO、Output IO任何一环都可能成为备份的瓶颈;譬如因为对数据文件的读取IO存在瓶颈,那么相应的写出IO也会慢下来;又譬如当RMAN与备份服务器之间的IO带宽存在瓶颈,那么相应的读取IO也会不得不慢下来。具体是哪一个环节出现了问题,我们需要求助于其他的RMAN动态性能视图,如: V$BACKUP_SYNC_IO Displays rows when the I/O is synchronous to the process (or thread on some platforms) performing the backup. V$BACKUP_ASYNC_IO Displays rows when the I/O is asynchronous to the process (or thread on some platforms) performing the backup. 以上2个视图的区别在于一个汇聚了使用同步IO执行RMAN备份恢复操作的性能信息,而另一个是异步IO的。 因为客户使用默认配置disk_async_io为true,故而我们首先关注input IO的性能信息,这些信息存放在V$backup_async_io视图中;而对于磁带设备未启用slaves IO模拟的异步IO(tape_asynch_io=true但是backup_tape_io_slaves为默认的false),所以与磁带设备相关的output IO的性能信息存放在v$backup_sync_io视图中。
DEVICEOPEN_TIMEELAPSEDBYTES/SIO_COUNTREADYlong_waitsLONG_WAIT_TIME_TOTALLONG_WAIT_TIME_MAX
DISK4/4388900372827681276556420741149002823118153
DISK4/5753900192323498276556420741149002817854841
DISK4/6369000392934106276556420741149002824350741
DISK4/7405100357918255276556420741149002826811773
DISK4/8347900416765407276556420741149002818354377
DISK4/9395800366328159276556420741149002825539948
DISK4/10428400338451646276556420741149002826854445
DISK4/11413200350901949276556420741149002826985742
DISK4/12735400197161661276556420741149002816901634
DISK4/13410000353640696276556420741149002828360760
DISK4/14408300355113116276556420741149002827901238
DISK4/154427003275190542765564207411490028308744605
DISK4/163930003689381302765564207411490028251509205
DISK4/17423100342691291276556420741149002827386842
DISK4/183756003860295132765564207411490028230859328
DISK4/197212002010436572765564207411490028191753162
DISK4/204010003615777692765564207411490028272852147
DISK4/213466004183285782765564207411490028209569109
DISK4/224005003620291772765564207411490028265060112
DISK4/234024003603197942765564207411490028259008594
DISK4/24449600322492627276556420741149002827420264
DISK4/254139003503084932765564207411490028269380230
DISK4/267486001936851262765564207411490028177477105
DISK4/27389900371871468276556420741149002826120038
DISK4/283838003777818792765564207411490028241870158
DISK4/294037003591594882765564207411490028266135212
DISK4/303906003712050312765564207411490028248161340
DISK5/1463600312753851276556420741149002827124739
DISK5/24199003453028942765564207411490028255042117
DISK5/37057002054593812765564207411490028173043189
DISK5/4418400346540835276556420741149002829161447
DISK5/53574004056874242765564207411490028222676188
DISK5/6421400344073767276556420741149002828586095
DISK5/7405100357918255276556420741149002826376138
DISK5/83815003800594632765564207411490028203510210
DISK5/9918400157875311276556420741149002822129337
DISK5/10337860042915020276556420741149002814221136
DISK5/115599002589617532765564207411490028252911174
DISK5/12622500232919976276556420741149002824149540
DISK5/13626700231359000276556420741149002823797341
DISK5/14802000180788884276556420741149002823128342
DISK5/15601200241172131276556420741149002820941840
DISK5/161387800104476643276556420741149002821187836
这里我们关心的几个时间指标包括:ELAPSED(Input IO的总耗时)、LONG_WAIT_TIME_TOTAL(长IO的总等待时间)、LONG_WAIT_TIME_MAX(最长一次的IO等待时间)的单位均为百分之一秒, 该视图的具体定义参考这里。 从以上chart中(由于列宽的原因只截取了部分数据)我们可以看到从4/4到5/16之间备份的Input IO总耗时(elapsed)虽然间歇性的暴涨到过33786s,但其他IO指标:IO总数、READY IO总数、LONG IO WAIT的次数、LONG IO WAIT的总耗时、最长LONG IO WAIT均没有出现大的变化;基本可以判定在备份期间对数据文件的读取不存在瓶颈,为了进一步诊断需要分析备份输出的IO性能状况:
DEVICEdateELAPSEDBYTESBYTES/SIO_COUNTIO_TIME_TOTALIO_TIME_MAXDISCRETE_BYTES_PER_SECOND
SBT_TAPE4/57549005846634332167744912322303144403652600132767916
SBT_TAPE4/57039005534329077767862379721111793811355800145206530
SBT_TAPE4/127364005882005422087987514222438074332983400135749655
SBT_TAPE4/126923005568397312008043329921241753692372600150808216
SBT_TAPE4/197222005918731796488195419322578173959043400149499166
SBT_TAPE4/198290005610432102406767710621402105107462801109847793
SBT_TAPE4/267496005960105984007951048522736004359402600136718493
SBT_TAPE4/267003005651711918088070415421559573770192800149905228
SBT_TAPE5/37068006001773772808491473922894953969655800151191510
SBT_TAPE5/37125005691555184647988147621711563923245800145072827
SBT_TAPE5/1033797006044521594881788478723058023093781280219537652
SBT_TAPE5/1027984005733967462402049016421873352524296280122715115
SBT_TAPE5/1742809530777616330542216291580019315844
可以从以上chart中可以发现到5/3为止的output io总耗时还处于合理范围内(为7068+7125)s,约为4小时。而到了5/10时输出IO的总耗时达到了(33797+29784)s,约为17.6小时。研究其他IO统计信息可以发现5/10的IO_TIME_TOTAL总数为(30937+25242)s,IO_TIME_TOTAL代表了某个IO等待的总耗时,单位为百分之一秒。从另一个IO性能指标DISCRETE_BYTES_PER_SECOND来看,在5/10备份文件的平均传输率急剧下降。 综合上述现象,诱发客户环境中的RMAN全库备份缓慢的主要原因是备份文件输出IO性能在一段时间内急剧下降,瓶颈应当存在于RMAN与NBU备份服务器之间,与数据库读取性能没有关系。给客户的建议是复查数据库服务器到NBU备份服务器间的网络带宽是否正常,NBU服务器的性能是否正常,磁带库的写出性能是否正常。 这个case后续经过对NBU的复查发现原因是虚拟磁带库VTL的存储电池过期,导致读写数据时直接从磁盘上进行,而不经过缓存,故影响了数据库全备份的速度。由于VTL存储电池过期信息需要从串口直接访问其存储才能确认问题,所以在问题发生之初无法从VTL的管理界面中获取该信息。 这个case告诉我们不仅是raid卡的冲放电、存储的ups电池过期会引发严重的IO性能问题,VTL的存储电池过期也可能给数据库备份造成麻烦,要让系统7*24时刻正常运行,有太多指标需要我们去关注,良好的规范很重要,同时很多时候我们不得不和硬件打交道。