案例背景****

压测内容:X系统Y业务 压测工具:Loadrunner 压测环境:单台应用+单台oracle数据库 压测场景:100个并发用户,每3秒钟开始一个,无思考时间,无迭代间隔。 问题描述:随着用户的增加,响应时间逐渐变慢,TPS逐渐降低,系统甚至出现响应超时。到了某个时候,响应时间又突然变快,TPS又恢复到最佳状态。

分析过程****

首先,查看Throughput流量图,变化趋势跟TPS一致,基本排除网络瓶颈。

下一步,检查服务器硬件资源使用情况。 应用服务器:

数据库服务器:

1.应用服务器的CPU使用率跟TPS曲线一致,说明问题应该不在应用上; 2.数据库服务器的IO使用率一开始跟TPS曲线一致,后上下震荡; 3.数据库服务器的CPU使用率则随着压力的增加不断上升,后也上下震荡;

综合以上,数据库服务器的CPU使用率不断上升是目前最可疑的问题所在。

下一步,查找数据库服务器CPU使用率高的原因,通过AWR报告查找。主要查看TOP SQL,尤其是高BUFFER GETS部分,因为高平均BUFFER GETS往往意外着高CPU。

分析AWR报告中的TOP SQL部分,未发现存在明显问题的SQL,因此TOP SQL导致高CPU使用率的情况不成立。   不过查看AWR报告中的TOP 5事件,发现free buffer wait 事件的等待时间过长,平均时间达到了3.7秒。

**什么是free buffer waits? ** 当数据库要在buffer cache中寻找空闲空间来放置数据,但发现空间不足时,就会产生这个等待。

产生等待的过程如下: a) 在用户请求块的DBA上应用HASH函数,获得适当的hash bucket; b) 检索bucket对应的chain,确认块头是否存在,若存在就使用; c) 若不存在,用户进程在LRU链上按最近最少使用的顺序寻找空闲缓冲区。若在此过程中发现脏块,则将其移到LRUW列。找到空闲缓冲区后,就可以从数据文件将块读到该缓冲区上; d) 在LRU列上寻找,一般扫描40%的比例,扫完后没有发现空闲缓冲区,就会停止扫描并驱使DBWR将脏块写到磁盘上; e) 在等待dbwr写脏块的过程中,用户进程在等待free buffer waits事件。   出现此现象的可能原因: 1.data buffer太小,导致空闲空间不够

2.脏块写得慢 a)内存中的脏数据太多,DBWR无法及时将这些脏数据写到磁盘中以释放空间,也就是可能有批量dml操作 b)dbwr数太少,db_writer_processes参数是否设得过少,配合os上的ps -ef | grep $ORACLE_SID | grep dbw查看dbwr数量 c)缓慢的IO子系统,db file parallel write较多,v$log视图发现日志很难被重用因为checkpoint得慢 d)延迟块清除,即延迟块头事务标记清除。

3.要申请的空间过多 a) 低效率的SQL语句导致过量的物理读。

压测过程中,物理IO未达到瓶颈,因此考虑是data buffer太小造成的原因。

解决问题****

首先,了解服务器和数据库配置信息。 服务器内存:16G,都用于ORACLE数据库使用。 数据库配置信息: 版本 11g ,采用memory_target和memory_max_target自动内存管理 memory_target/memory_max_target/sga_max_size 均配置为6.4G, sga_target/pga_aggregate_target配置为0   修改oracle配置,将memory_target/memory_max_target/sga_max_size调整为8G。

ALTER SYSTEM SET memory_max_target=8000m scope=SPFILE;
ALTER SYSTEM SET memory_target=8000m scope=SPFILE;
ALTER SYSTEM SET sga_max_size=8000m SCOPE=SPFILE;
 

遇到的困难: ORA-00845: MEMORY_TARGET not supported on this system   官方说法: /dev/shm小于MEMORY_TARGET的大小,或者是/dev/shm根本就没有挂载,如果同时设置了MEMORY_TARGET和MENORY_MAX_TARGET,那么/dev/shm至少必须和MEMORY_MAX_TARGET的大小一致。   解决困难: 查看/dev/shm当前设置大小,如下图所示为7.7G,小于上面设置的8G的MEMORY_MAX_TARGET。   两种解决方式: 1) 临时解决: umount /dev/shm/ mount -t tmpfs shmfs -o size=14G /dev/shm 注:如果unmount时提示设备忙( umount: /dev/shm: device is busy ),用以下命令解决。
fuser -km /dev/shm 2)永久解决: vi /etc/fstab tmpfs /dev/shm tmpfs defaults 0 0 改成 tmpfs /dev/shm tmpfs defaults,size=14G 0 0   修改之后:

优化之后****

以上调整后,重新压测,事务响应时间、TPS等都表现得趋于平稳了,新的瓶颈在于硬件瓶颈。

AWR报告中,TOP5 等待事件已经看不到free buffer wait的身影了。