原作者:黄宸宁
适用范围
银河麒麟高级服务器操作系统(飞腾版)V10(SP1)0711
银河麒麟高级服务器操作系统(鲲鹏版)V10(SP1)0711
银河麒麟高级服务器操作系统(兆芯版)V10(SP1)0711
银河麒麟高级服务器操作系统(海光版)V10(SP1)0711
银河麒麟高级服务器操作系统(飞腾版)V10(SP1)0518
银河麒麟高级服务器操作系统(鲲鹏版)V10(SP1)0518
银河麒麟高级服务器操作系统(兆芯版)V10(SP1)0518
银河麒麟高级服务器操作系统(海光版)V10(SP1)0518
银河麒麟高级服务器操作系统(飞腾版)V10(SP2)0524
银河麒麟高级服务器操作系统(鲲鹏版)V10(SP2)0524
银河麒麟高级服务器操作系统(兆芯版)V10(SP2)0524
银河麒麟高级服务器操作系统(海光版)V10(SP2)0524
问题概述
在麒麟V10版本中,lsm堆栈化功能存在内存泄露问题。
关于Linux LSM
Linux内核安全模块(Linux Security Module,LSM)是一种内核级别的安全框架,它允许开发人员和系统管理员通过实现安全策略和访问控制决策的模块来扩展Linux内核的安全性能。通过LSM接口,可以实现各种安全策略,比如强制访问控制(MAC)、可选访问控制(DAC)、进程间通信(IPC)和网络安全等。
问题原因
在内核LSM堆栈化时,给每个内核对象如inode、cred等分配了相关的安全域内存,并同时给每个安全模块在对应的安全域中分配所需的内存来保存该模块的安全数据,但是在内核对象释放时其安全域数据没有得到有效释放,导致内存泄露。
影响:在开启安全的情况下会导致内存泄露,长时间会影响系统稳定性运行。
问题现象
- 查看系统内存使用情况
free -g
- 排除是否是MogDB内存参数设置,导致的内存使用过高
查看MogDB共享内存的占用空间
ipcs -m
通过top查看MogDB进程内存使用情况
top
如果MogDB使用的内存远低于主机used的使用大小,说明主机内存使用过高,与MogDB无关。
如果MogDB使用的内存接近主机used的使用大小,需要查看MogDB shared buffers设置和shared_buffers的使用情况,排除是由于MogDB内存参数设置过高,导致的内存使用过高。
show shared_buffers;
select * from gs_total_memory_detail;
- 排除MogDB对内存使用过高的影响后,分析主机内存的使用情况
通过以下命令,来查看内存使用中slab的增长情况:
for i in {1..10}; do cat /proc/meminfo|grep Slab; sleep 10; done
如果slab内存一直在线性增长的趋势,通过下面的命令查看slab的内容:
cat /proc/slabinfo |awk '{print $1,$3*$4/1024/1024}'|sort -k2 -gr|head -10|awk 'BEGIN {printf "%-25s %10s\n","slab-obj-list","use-mem_MB"}{printf "%-25s %10s\n",$1,$2}'
会发现SLAB内存主要为kmalloc-96函数申请占用,kmalloc-96 为 Linux 内核专用内存分配器, 用户进程不可用。
解决方案
规避方案:
去掉grub参数”security=xxx”,或者将其改成”security=”。
解决方案:
升级内核(Version 4.19.90-23.16.v2101)。
【注意事项】
1、规避方案:改/boot/grub下的文件需要重启,直接在系统启动时grub界面上改就不需要重启;
2、升级内核后需重启;
参考文档
https://www.kylinos.cn/support/update/10.html




