请教一个关于oom的问题,我按照上次课把mem打出来,发现 2022-07-15 18:19:57 HKT,10/0,0,LOG,00000,"level: 1; 41262 more child contexts containing 98531328 total in 82498 blocks; 37707344 free (13786 chunks);
这里占用内存非常多。通过观察机器的内存,发现基本上内存以1G/3S的速度增长,但是当流量停止后,内存会缓慢的下降。使用的SQL都是简单的按照索引查询,没有开事务,表里面有一个json字段。内存分配了为什么不释放呢?
如果内存不够了,按照lru的策略,应该淘汰在加入需要的page吧。会释放是不是说明不是泄露,但是还是oom,是不是说明释放的速度比不上申请的速度,但是为什么申请的时候不先淘汰呢?我还有什么办法能分析这个问题,线上除了限流还有别的手段吗?
根据你的描述,当流量停止后,内存会缓慢的下降,说明内存应该是释放了的,只是业务高峰时,内存占用太大导致OOM的。内存泄漏一般是调用malloc或plloc后,没有调用free函数释放内存,导致的使用的内存逐渐增加最后导致OOM,这种会更难解决。建议从以下方面看是否能解决内存问题:
平衡系统的内存占用。通常我们系统中内存可包括共享内存(如bufferpool占用内存)、Cache和动态内存(如MemoryContext占用的内存)、操作系统占用的内存,需要平衡下各部分大小。
如您怀疑的jason类型导致的,可以考虑改写SQL,如何减少单次查询内存的大小吗?
很多Cache和MemoryContext内存是跟backend有关的,可以通过减少并发链接数,间接减少内存占用,之前150节点TPCC测试,PlanCache增大导致的OOM就是这种情况,除了从BufferPool省除内存外,就是要开发plancache来减少这部分内存占用。
OOM时会有Core文件,也可以debug下core文件,更具体定位下内存问题的原因。
此答案来自钉钉群“PG|POLARDB技术进阶”
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。