这几天在做战斗校验压测的时候发现,战斗校验进程占用内存一直在涨,而且长时间不降,但是相同逻辑在windows下跑的时候,校验结束进程占用内存就会降下来,这里记录一下整个追查过程。
首先怀疑有内存泄露,于是先用valgrind
valgrind --tool=memcheck --leak-check=full --log-file=/tmp/bc_leak ./battle_check
校验几场场战斗后得到结果并没有"definitely lost", "indirectly lost", "possibly lost", "still reachable", and "suppressed"这五种级别的泄露提示,据此判断,应该是没有内存泄露。
根据上面的检测结果,分析一下,没有泄露,但是进程占用内存又一直在增加,那应该是从系统申请了内存但是没有还回去,那什么操作会导致这样的结果呢,继续追查,这次该拿出系统调用追踪利器strace
strace -tt -f -o /tmp/bc_leak_strace ./battle_check
同时结合top命令
top -p 17626 -d 0.1
这样可以观察在进程res占用增大的时候,系统调用是什么,得到的数据是这样的,在res猛增的时候,一直在跑brk调用
而后是没有对应的释放操作的,于是上网查了一下brk申请内存导致只涨不降的情况,发现还挺多的,主要是glibc的优化,brk比mmap性能好,小内存是brk申请,大内存就是mmap申请,但是brk申请的内存回收有个限制,如果最后申请的内存还在用的话,之前所有不在用的内存都不能回收,除非用malloc_trim(0)强制回收,找到症结之后,在每场校验最后加了强制回收空闲内存的逻辑,
这会触发之前大量的内存被回收,在我的逻辑中,内存从250m增长到460m,然后一次全部回收完,校验进程占用的内存会回到最原始的250m。
这里贴一下相关文章,单价可以参考:
glibc下的内存管理 - lookof - 博客园文章来源:https://www.toymoban.com/news/detail-612172.html
内存泄漏之malloc_trim - 寒魔影 - 博客园文章来源地址https://www.toymoban.com/news/detail-612172.html
到了这里,关于linux下程序占用内存只涨不降原因追查的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!