Linux下Oracle通过设置大内存页解决使用swap分区问题
在一个新闻网站的后台数据库的监控过程中,经常出现数据库开始使用交换分区的情况,并进而导致整个应用系统响应非常缓慢,不能够提供服务。该服务器的内存为8G,SGA设置为4G,PGA设置为1G。操作系统为64位。
按照道理,即使内存发生不够的情况,应该是磁盘读写变得更加激烈,而不是开始频繁的使用swap交换分区,沿着这个思路,寻找相关资料,发现如果配置大内存页可以强行把SGA锁定到内存中,大内存页是不允许被交换的。而同时相关资料也说明,在内存比较大的情况下,当系统内存为8G以上时,如果不采用大内存页(2M),那么管理这些内存所需要的内存也会急剧增加。对于系统可以使用命令cat /proc/meminf查看PageTables项,由于没有采用大内存页管理而额外产生的内存消耗。
具体操作步骤:
1、查看系统内存
cat /proc/meminfo | grep MemTotal
MemTotal: 8177384 kB
2、查看SGA和PGA
SQL> show parameter sga;
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
lock_sga boolean TRUE
pre_page_sga boolean FALSE
sga_max_size big integer 4G
sga_target big integer 4G
SQL> show parameter pga;
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
pga_aggregate_target big integer 1G
4、查看没有使用大内存页时的情况
more /proc/meminfo |grep -i HugePage
HugePages_Total: 0
HugePages_Free: 0
HugePages_Rsvd: 0
Hugepagesize: 0
5、配置HugePages Pool大小
vi /etc/sysctl.conf
vm.nr_hugepages = 2300 #(这个值应大于或等于 SGA/2m,即 4*1024m/2m)
6、配置Oracle用户最大线程数、文件句柄和最大能锁定的内存
vi /etc/security/limits.conf
在最后添加如下的行
oracle soft nproc 2047
oracle hard nproc 16384
oracle soft nofile 1024
oracle hard nofile 65536
oracle soft memlock 5194304 #(这里是以KB为单位,一般大于等于SGA)
oracle hard memlock 5194304
7、使配置生效
sysctl -p
8、重启系统及启动oracle实例,下面是我们使用大内存页后的结果,
看到因为管理内存页而额外需要的内存(PageTables)为55M
cat /proc/meminfo
MemTotal: 8177384 kB
MemFree: 950472 kB
Buffers: 16824 kB
Cached: 1365136 kB
SwapCached: 170652 kB
Active: 1274416 kB
Inactive: 1082156 kB
HighTotal: 0 kB
HighFree: 0 kB
LowTotal: 8177384 kB
LowFree: 950472 kB
SwapTotal: 10420208 kB
SwapFree: 10056116 kB
Dirty: 148 kB
Writeback: 0 kB
AnonPages: 982112 kB
Mapped: 52944 kB
Slab: 64568 kB
PageTables: 55580 kB
NFS_Unstable: 0 kB
Bounce: 0 kB
CommitLimit: 12153700 kB
Committed_AS: 2584964 kB
VmallocTotal: 34359738367 kB
VmallocUsed: 267584 kB
VmallocChunk: 34359470407 kB
HugePages_Total: 2300
HugePages_Free: 264
HugePages_Rsvd: 13
Hugepagesize: 2048 kB
如上由于我们的系统数据库SGA为4G,因此配置了2300个大内存页,这样能够提供足够多的大内存页供数据库的SGA使用。配置大内存的一个另外好处是可以清楚的看到系统使用内存的情况,否则Oracle会占用buffer及cache内存,很难计算系统空余的实际内存数量。
从内存meminfo信息中可以看出,2300个大内存页,被使用了2300-264=2036个(这个过程在启动数据库的时候是动态变化的,直到SGA用满)。
在配置的过程中,发现我们的系统内核还不支持大内存页,配置后看到HugePage_Total为0,说明配置无效,需要安装新的内核。大内存页的配置可以参考相关文档。
当配置完成后,同时设置lock_sga为true,Oracle数据库服务器再也不发生大量使用swap分区的情况了,不再出现性能故障。