linux下程序占用内存只涨不降原因追查

        这几天在做战斗校验压测的时候发现,战斗校验进程占用内存一直在涨,而且长时间不降,但是相同逻辑在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调用   

 linux下程序占用内存只涨不降原因追查_第1张图片

而后是没有对应的释放操作的,于是上网查了一下brk申请内存导致只涨不降的情况,发现还挺多的,主要是glibc的优化,brk比mmap性能好,小内存是brk申请,大内存就是mmap申请,但是brk申请的内存回收有个限制,如果最后申请的内存还在用的话,之前所有不在用的内存都不能回收,除非用malloc_trim(0)强制回收,找到症结之后,在每场校验最后加了强制回收空闲内存的逻辑,

linux下程序占用内存只涨不降原因追查_第2张图片 

这会触发之前大量的内存被回收,在我的逻辑中,内存从250m增长到460m,然后一次全部回收完,校验进程占用的内存会回到最原始的250m。

这里贴一下相关文章,单价可以参考:

glibc下的内存管理 - lookof - 博客园

内存泄漏之malloc_trim - 寒魔影 - 博客园

你可能感兴趣的:(c++编程,cache,服务器,linux)