某客户现场环境运维,监控告警某台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