返回首页
当前位置: 主页 > 数据库 > Oracle教程 >

Oracle DB Server内存使用暴涨问题的处理案例分析

时间:2016-09-30 23:18来源:电脑教程学习网 www.etwiki.cn 编辑:admin

一金融公司客户核心交易系统的新版即将上线,随着试运行网点的增多,数据库服务器突然出现内存使用量陡增的状况。事件第一次出现时,初步查看发现Oracle数据库内存SGA、PGA使用量并未出现异常。随后操作系统的交换空间SWAP达到20多GB,系统缓慢到无法登陆无法操作,最终只能重启处理。经过反复分析,没有在日志中查找到原因。于是我们降低了Oracle对操作系统内存的用量。

半月后,内存使用量又有上升趋势,我们快速介入进行了观察。

此时发现数据库服务器操作系统对内存使用偏高,约有20G。查看/proc/meminfo,一一比对,发现PageTables项过大,达到16GB。

原因分析:

Page Table是进程使用的内存虚拟地址和实际的内存物理地址的映射表,也就是记录上图当中那些箭头的位置。Linux下默认内存每页面为4KB,所以当内存很大,进程很多时,这张映射表会非常大,又完全存在于内存中。
解决的方法是在操作系统中采用大内存页面(Huge Page,1个页面2MB)技术,内存映射表由每记录处理4KB上升为每记录处理2MB。每条映射管理的内存块的大小增大500倍,则映射数下降为1/500,使用的内存量也将下降到1/500,从GB级下降到MB级。大页面内存的使用需要程序的支持,Oracle数据库中,大页面内存完全用于SGA。
Oracle建议在大SGA(12G以上),高连接数(1000个以上)的系统中使用Huge Page,但是Huge Page和Oracle 11g的AMM不兼容。因此需要取消memory_target、memory_max_target的设置。分别设置sga和pga。这样内存中Page Table的使用量就可以由几十G下降到几十M了。
 
处理过程:
1、  修改数据库参数
[oracle@uaflsdb02 ~]$ sqlplus / as sysdba
SQL> alter system reset memory_target scope=spfile;
SQL> alter system reset memory_max_target scope=spfile;

2、  查看数据库参数,计算大页面的需求数
[oracle@uaflsdb02 ~]$ sqlplus / as sysdba
SQL> show parameter sga
查看到sga为32GB。大页面每页面有2MB,32GB/2MB=16384。因此至少需要16384个大页面。取大页面数稍大于需求量,并取整为17000。

3、  设置大页面数为17000
[root@uaflsdb01 ~]$ vim /etc/sysctl.conf
# 添加以下一行
vm.nr_hugepages = 17000

4、  设置memlock参数
[root@uaflsdb01 ~]# vim /etc/security/limits.conf
# 添加以下两行,memlock参数稍小于内存总量即可,按KB算
*       soft    memlock 60000000
*       hard    memlock 60000000

5、  关闭数据库,重启服务器,再打开数据库,查看修改生效情况与效果
[oracle@uaflsdb02 ~]$ free -m
             total       used       free     shared    buffers     cached
Mem:         64509      38118      26391          0        126       1296
-/+ buffers/cache:      36694      27814
Swap:        66399          0      66399
# 剩余内存有27GB
[root@uaflsdb02 ~]# grep Huge /proc/meminfo
HugePages_Total:   17000
HugePages_Free:    14452
HugePages_Rsvd:    13837
HugePages_Surp:        0
Hugepagesize:       2048 kB
# 大页面已启用
[root@uaflsdb02 ~]# free -m
             total       used       free     shared    buffers     cached
Mem:         64509      37152      27356          0         11        717
-/+ buffers/cache:      36424      28085
Swap:        66399        478      65921
# 空闲内存有28GB
[root@uaflsdb02 ~]# grep PageTables /proc/meminfo     
PageTables:        73256 kB
# PageTables内存使用量由16GB下降到72MB。

6、  查看数据库状况,验证应用系统业务操作,发现完全正常
7、  至此,本调整成功完成。
 
后续分析:
这套系统为什么会出现如此高的Page Table使用量呢?这是由Oracle的服务器进程过多,SGA过大引起的,一个进程映射到32GB的内存需要32GB/4KB=8M个映射条目,在64bit的系统上约消耗24MB的内存,那么1000个进程就会消耗24GB的内存,这是非常大的使用量。
而对于一般应用而言,是不需要1000个并发操作的,数据库对1000个并发操作也无法承担,那么在设计应用时,应尽量避免过高连接数的设计,使用数据库时,启用少量连接并进行重用。
而连接数实在无法控制的时候,则可使用本文介绍的大内存页面方式,降低Page Table内存的使用量。

------分隔线----------------------------
标签(Tag):Oracle oracle数据库 数据库
------分隔线----------------------------
推荐内容
猜你感兴趣