案例背景
压测内容:某系统3个接口 压测工具:Loadrunner 压测环境:单台WAS应用+单台oracle数据库 压测场景:20个并发用户,无思考时间,无迭代间隔。每秒钟开始一个用户,持续运行15分钟后,每秒钟结束一个用户。 问题描述:响应时间间歇性地飙高到几十秒,甚至超过120秒,无规律可循。
分析过程
查看TPS图,发现在案发时间内,TPS指标也降到了冰点,说明此时系统几乎无响应。
查看吞吐量图,并未达到带宽瓶颈,同样地在案发时间内,吞吐量也几乎都没有了。
至此,只能知道系统在案发时间内几乎停止了响应,但是未找到相关的可疑对象。
下一步,检查服务器硬件资源使用情况。
首先,应用服务器的CPU和IO使用率在案发时间仍然处于较低负载,甚至零负载,排除嫌疑。
其次,数据库服务器的CPU使用率在压力期间保持较高位水平,但是案发时间降到了最低,说明此时数据库服务器的CPU可能在等待什么。
而数据库的IO使用率在压力期间保持较高位水平,特别是案发时间内始终处于100%,并且结合CPU和IO图来看,IO 100%的时候,CPU就会降低,说明此时CPU可能处于在等待IO。
查看DISK_SUMM,发现IO压力主要表现为写,而不是读。
回头看测试脚本,只有第二个接口会往数据库写数据,跟踪了一下每次请求大概要往3张表里面写入3条记录,每秒TPS大约为60,在非发案期间是比较平稳的。但是即使是写入磁盘排队,也应该是均匀的,或者越往后响应时间越长才对,不应该是突发挂起这类的异常。
从资源TOP 页里面的IO监控结果来看,占用大量IO的是oracle进程。
查看系统换页空间,作案时间内并没有出现由于内存不足造成的大量换页,因此内存的嫌疑可以排除。
最后把目光投向ORACLE AWR报告,这是一份信息量很大的报告。
检查 TOP 5事件,看到了排名第一的“log file switch (checkpoint incomplete)“,平均等待时间21秒,应该就是它了?
什么是log file switch? 当log file 满了的时候——〉logfile switch ——〉checkpoint——〉dbwr——〉lgwr 这个时候下一个checkpoint来了,但此时dbwr/lgwr还没有完成,所以就会产生等待事件log file switch (checkpoint incomplete)。
解决问题
查看redo log日志组和大小,发现只有3组默认50M的日志组。 >SELECT GROUP#,bytes/1024/1024||'M',status,archived FROM v$log;
查看日志组文件保存位置 >SELECT * FROM V$logfile; 于是先增加3组256M大小的日志组
alter database add logfile group 4 ('/opt/oracle/oradata/TSO/redo04.log') size 256M; alter database add logfile group 5 ('/opt/oracle/oradata/TSO/redo05.log') size 256M; alter database add logfile group 6 ('/opt/oracle/oradata/TSO/redo06.log') size 256M;
然后,切换日志组
alter system switch logfile;
把ACTIVE状态的日志变成INACTIVE状态
alter system checkpoint ;
删除INACTIVE状态的group 1 2 3 日志组。如果状态仍然是ACTIVE的,需要等待变成INACTIVE再删除。
alter database drop logfile group 1; alter database drop logfile group 2; alter database drop logfile group 3;
删除对应的重做日志文件 [root@perf234 ~]# cd /opt/oracle/oradata/TSO [root@perf234 TSO]# rm -f redo01.log [root@perf234 TSO]# rm -f redo02.log [root@perf234 TSO]# rm -f redo03.log
再增加3组256M大小的group 1 2 3日志组
alter database add logfile group 1 ('/opt/oracle/oradata/TSO/redo01.log') size 256M; alter database add logfile group 2 ('/opt/oracle/oradata/TSO/redo02.log') size 256M; alter database add logfile group 3 ('/opt/oracle/oradata/TSO/redo03.log') size 256M;
至此,redo log调整完毕。
优化之后
调整后,响应时间较平稳,TPS也较平稳。
应用服务器资源使用率较低且平稳。
数据库服务器CPU和IO使用率较高,但是也较平稳。
IO也短时间内达到100%,仍然主要是IO WRITE为主.
ORACLE AWR报告中的TOP 5事件,已然没有了log file switch (checkpoint incomplete)的身影。