暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Linux系统内存大页参数设置错误导致OS内存使用过高,监控告警

原创 杨卓 2022-09-09
2826

一、问题现象

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

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论