原文地址:https://blog.csdn.net/jamesyao008/article/details/40857625
环境描述:
SYSTEM: rhe5.3 x86_64bit
ORACLE:ORACLE 11.1.7.0
内存:8G
现像:
现场运维发邮件回来前端应用缓慢,不时会抛出异常!
分析:
通过查看服务器进程使用情况发现一些进程使用内存相当高,通过vmstat 查询,系统层面已经大量使用Swap交换分区了。说明内存使用不足,系统层面反应也是比较缓慢
vmstat情况:
但查看Oracle进程查询没发现有消耗性能的SQL,
调整:
1:服务器内存:
2:调整/dev/shm
3:调整内核参数
4:调整数据库参数
5:监控DB情况
先为两台服务器增加16G内存,轮流重启服务器,完成内存增加后,修改SGA,hugepage size hugepage_setting.sh查询出vm.nr_hugepages = 6146
节点正常,但节点2不正常,和未增加内存前一样,Swap交换分区被大量使用。
解决:
通过分析及查询资料发现hugepage 没被使用
进一步分析 :还是与hugepage设置及系统参数有关:
HugePages配置
进程需要访问内存的数据时,它的虚拟内存地址段先连接到page tables(Page Table是用来存放虚拟内存也和物理内存页对应关系的内存结构),然后再连接到物理内存。所以在访问内存时需要先访问page tables得到虚拟内存和物理内存的映射关系,然后再访问物理内存。page size越小,相应的内存结构也会越大,在RHEL 系统中,缺省为4k为一个单位,则物理内存越大,page tables相对越大。无形增加进程扫描内存的成本。
当物理内存大于8G时,建议使用hugepages配置,Hugepages的常见page size为2M,是4k size的500倍,所以可以大大减小page table的尺寸,提交扫描内存的效率。
同时CPU cache中有一部分TLB(Translation Lookaside Buffer)用来存放部分page table以提高这种装换的速度。因为page size变大了,所以同样大小的TLB,所覆盖的内存大小也变大了。提高了TBL命中率,也就是提高了地址转换的速度。
HugePages配置方法:
1、在 /etc/security/limits.conf 增加memlock配置
* hard memlock unlimited
* soft memlock unlimited
2、利用官方的提供的脚本hugepages_settings.sh[ID 401749.1],计算需要配置的内存参数
$ ./hugepages_settings.sh
......
Press Enter to proceed...
Recommended setting: vm.nr_hugepages = 6146
3、修改/etc/sysctl.conf 的项vm.nr_hugepages=6146
sysctl -p;
sysctl -a|grep -i huge
4、关闭实例及群集,重启系统。
5、对hugepages配置进行检查:
$ grep -i huge /proc/meminfo
HugePages_Total: 6146
HugePages_Free: 15
Hugepagesize: 2048 kB
6、启动实例及数据库群集。
参考:
HugePages on Oracle Linux 64-bit [ID 361468.1]
Shell Script to Calculate Values Recommended Linux HugePages / HugeTLB Configuration [ID 401749.1]
问题解决