最近遇到一个内存泄漏问题,由于问题出现在客户端,只能通过客户提供的Log来分析。
根据客户提供的/proc/meminfo数据发现,MemAvailable 由294072kB减小至18128kB,减小约269MB,引起该变化的最直接原因是PageTables由61416KB增加到了334460kB,增加约266MB。同时观察Aon和Slab的变化,均未出现明显的增加,由此可判定,内存单纯的消耗在了PageTables项了。
查看PageTables项的统计来源:
通过以上代码可知,PageTables主要统计的就是创建页表所消耗的内存。
只有PageTables一项变大 这个比较奇怪。一般来说,映射了页表肯定会去申请一段内存,如果是内核申请的,那对应slab/vmalloc的值会变大;如果是用户态申请的,那么anon值应该会变大,现在这两项都没有变大 那有可能是对同一段地址做了重复的mmap 或者ioremap操作,这样就只会消耗pagetable。
为进一步分析,让客户提供了/proc/vmallocinfo信息,发现ioremap的次数并不多,所以推测可能是用户态做了重复的mmap映射,并让客户自查代码。
最终根据客户的反馈,其用户态代码在mmap后未执行munmap,导致了内存泄漏。