1. 问题描述:
客户反映,数据库服务器的IO量非常大,达到每秒800M,几乎将HBA的带宽打满,交易出现缓慢的情况。
2. 分析过程:
收集当前时段的OracleAWR报告,找到LoadProfile部分,如下图所示
可以看到:
每秒的物理读PhysicalReads达到104,207个BLOCK,每个BLOCK的大小是8K
即每秒的IO量达到104207*8K=814M!
IO的流量太大了,几乎打满了HBA所支持的吞吐,影响到整体的性能是必然的!
根据上述知识点,我们知道,ORACLE采用内存换IO的策略,避免出现过多IO。
那么我们不妨猜一下,是否是因为buffer cache太小导致IO无法缓存呢?
进一步检查AWR报告中的”Cache Sizes”部分
如下图所示,buffercache大小仅为128M!而shared pool大小为15,232M.
而该服务器配置了60G的内存!
我们提到,buffercache可以设置到服务器内存的40%,即24G。
通过查找AWR报告中的”Buffer Pool Advisory”,如下图所示,可以看到:
当buffer cache从128M设置到256M时,IO即物理读的个数将从3600万下降到1900万,就下降了一倍!
3. 原因
难道是配置失误?不是的。实际上,客户通过一个memory_target参数设置了为ORACLE数据库分配总计40G的内存。这是一种常见的做法,即交给ORACLE来动态分配在SGA和PGA之间,在SGA内部各个组件的内存大小。由于内存动态调整算法的不完善,导致过多的内存分给了PGA而SGA不够,又由于应用程序绑定变量的使用不够理想,导致shared pool不断的膨胀,一步一步地,将buffer cache压缩到了只剩128M.
4. 解决方法
为buffer cache设定一个基准值20G后,IO高的问题得到解决。