一、问题现象
某客户现场环境运维,监控告警某台Oracle db os 内存使用率大于90%,需要进行问题排查;
二、问题诊断
2.1 内存使用率check
Linux free -g check发现free 0,available 0,swap 使用1g swap 配置15G
2.2 检查是否存在使用过大的内存进程
Linux top 排查忽略
2.3 检查Oracle数据库参数
memory_target 0,sga target 4800 Mbytes
OS 16Gbytes
???看到这里,内存去哪了,OS 16G,ORACLE DB SGA只占用4.68G,剩余的12G内存被什么占用了?
2.4 检查OS 内存大页的配置
vm.nr_hugepages = 6150 换算成Gbytes12Gbytes
三、问题处理
3.1 减小内存大页的参数设置
–默认规则是内存大页设置为SGA换算大页数量+1, OS Linux默认操作系统内存小页,页大小4K,内存大页默认页大小2Mbytes
Linux 大页处于free状态是可以直接调整减小,可以在线调整! 但是处于使用状态建议停库调整或者重启主机
vi /etc/sysctl.conf
--修改前
vm.nr_hugepages = 6150
--调整后
vm.nr_hugepages = 2500
[root@AsiainfoDS-DB ~]# grep Huge /proc/meminfo
HugePages_Total: 2500
HugePages_Free: 2500
HugePages_Rsvd: 0
HugePages_Surp: 0
Hugepagesize: 2048 kB
看到这里是不是有朋友已经蒙蔽了? 大页内存怎么都处于Free???
虽然此时OS 释放出来了(6150-2500)*2/1024=7G,但是作为技术人员要有一定追求,就是直男癌。
会玩的朋友应该已经想到了是什么问题导致的。
3.2 检查oracle操作系统用户是否具有内存大页的使用权限
Oracle 11g db+ db alert数据库启动会有一定信息的
Starting ORACLE instance (normal)
************************ Large Pages Information *******************
Per process system memlock (soft) limit = 64 KB
Total Shared Global Region in Large Pages = 0 KB (0%)
Large Pages used by this instance: 0 (0 KB)
Large Pages unused system wide = 4935 (10 GB)
Large Pages configured system wide = 4935 (10 GB)
Large Page size = 2048 KB
RECOMMENDATION:
Total System Global Area size is 4802 MB. For optimal performance,
prior to the next instance restart:
1. Large pages are automatically locked into physical memory.
Increase the per process memlock (soft) limit to at least 4810 MB to lock
100% System Global Area's large pages into physical memory
********************************************************************
从DB alert的日志验证了Oracle sga根本没有使用内存大页,导致OS内存大页的内存被分配出去+Oracle sga使用OS内存默认小页,导致OS free没什么内存,数据库压力一上来,Pga或者其它进程使用OS free分分钟让OS 内存使用率飙升到90%+
Linux用户使用大页的限制,标准设置应该无限制!
#vi /etc/security/limits.conf
* soft memlock unlimited
* hard memlock unlimited
–实际检查当前环境没有配置这个参数!!!
解决方法:
1.内存大页功能关闭,释放占用的无效的大页内存给Os free;
2.重启Oracle db,因为之前已经根据SGA设置了较为合理的内存大页,重启库太麻烦被嫌弃;
3.3 减少或者关闭内存大页
修改参数
/etc/sysctl.conf
vm.nr_hugepages = 2500 删除注释这行记录
执行sysctl -p,sysctl -a check发现内存大页无改变
vm.nr_hugepages = 100 调整为200Mbytes的内存大页占用
# free -g
total used free shared buff/cache available
Mem: 15 1 9 4 5 10
Swap: 15 1 14
[root@AsiainfoDS-DB ~]# grep Huge /proc/meminfo
AnonHugePages: 24576 kB
HugePages_Total: 100
HugePages_Free: 100
HugePages_Rsvd: 0
HugePages_Surp: 0
Hugepagesize: 2048 kB
可以发现OS free 变成9Gbytes, available 变成10G 问题已解决! 结合以前写的博客,这已经是第四次遇到这类问题了!!! 希望设置内存大页的小伙伴们都看一下。
参考文章
https://www.cnblogs.com/lvcha001/p/13356991.html