【运维案例】业务进程内存占用过高问题

产品:openEuler

版本:20.03-LTS-SP3

分类:基础服务 / glibc

来源:现网

[背景及现象描述]

用户部署在openEuler上的业务进程,相比部署在CentOS上的业务进程,内存占用明显过高,到月底业务压力增大的时候,存在因OOM宕机的风险。(如图所示,两条较高的曲线为openEuler)

[原因分析]

分析客户业务进程的strace和pmap,有两处内存占用异常:1.openEuler64M以下的小内存申请明显多于centOS。2. openEuler内存碎片化比较严重。因此怀疑均与高版本glibc的thread cache特性有关。

[解决方法]

去使能该功能的方法:启动程序之前增加该环境变量:bash_profile中添加 GLIBC_TUNABLES=glibc.malloc.tcache_count=0来关闭线程缓存;同时在进程启动后查看进程的环境变量(/proc/pid/environ)以确定成功添加。
修改方案影响性分析:glibc关闭tcache之后,与之前的glibc2.17版本的流程一致,无其它影响。
收到客户反馈,经多天观察验证,关闭glibc线程缓存后内存占用明显降低,相比centOS,openEuler的内存占用也要更低。

[相关知识]

thread cache背景:malloc接口所属的glibc 2.17与glibc2.28之间增加了per thread的一级缓存,用于提升内存申请释放的效率,具体是在glibc的2.26版本合入
image

对应的commit:sourceware.org Git

2 个赞

哈哈,让我想到了jdk8 vs jdk17