内存泄漏(Memory Leak)是指程序中已动态分配的堆内存由于某种原因程序未释放或无法释放,造成系统内存的浪费,导致程序运行速度减慢甚至系统崩溃等严重后果。应用态+
1 | cat /proc/meminfo
|
MemTotal: 131084400 kB MemFree: 18039732 kB MemAvailable: 128007632 kB Buffers: 3132 kB Cached: 107111252 kB SwapCached: 0 kB Active: 3757036 kB Inactive: 103812244 kB Active(anon): 455888 kB Inactive(anon): 21032 kB Active(file): 3301148 kB Inactive(file): 103791212 kB Unevictable: 0 kB Mlocked: 0 kB SwapTotal: 0 kB SwapFree: 0 kB Dirty: 0 kB Writeback: 0 kB AnonPages: 404036 kB Mapped: 203740 kB Shmem: 22024 kB Slab: 4728332 kB SReclaimable: 3858356 kB SUnreclaim: 869976 kB KernelStack: 17920 kB PageTables: 9076 kB NFS_Unstable: 0 kB Bounce: 0 kB WritebackTmp: 0 kB CommitLimit: 65542200 kB Committed_AS: 3760688 kB VmallocTotal: 135290290112 kB VmallocUsed: 0 kB VmallocChunk: 0 kB HardwareCorrupted: 0 kB AnonHugePages: 149504 kB ShmemHugePages: 0 kB ShmemPmdMapped: 0 kB HugePages_Total: 0 HugePages_Free: 0 HugePages_Rsvd: 0 HugePages_Surp: 0 Hugepagesize: 2048 kB
参数说明
top命令默认列名含义解释:
更多top命令参数释义及参考请参见top命令参数参考。
参数释义:
上图参数释义:
所以CACHE SIZE = 26438100 *0.1K = 2711600K
上图参数释义:
问题现象:
某软件在服务器上运行出现问题,在没有压力加载的情况下,内存占用超过80%。
定位过程:
dentry的作用:当读写文件时内核会为该文件对象建立一个dentry,并将其缓存起来,方便下一次读写时直接从内存中取出提高效率。
通常情况下,dentry过高的有两种解决方法:
使用sudo sh -c "echo 2 > /proc/sys/vm/drop_caches"命令来清除cache。
缺点是执行命令过程容易暂时停止执行几分钟。
调整内核参数vm.vfs_cache_pressure,例如可以设置vm.vfs_cache_pressure=10000。
vm.vfs_cache_pressure控制内核回收用于dentry和inode cache内存的倾向。默认值是100,内核会根据pagecache和swapcache的回收情况,让dentry和inode cache的内存占用量保持在一个相对公平的百分比上。减小vfs_cache_pressure会让内核更倾向于保留dentry和inode cache。当vfs_cache_pressure等于0,在内存紧张时内核也不会回收dentry和inode cache,这容易导致OOM。如果vfs_cache_pressure的值超过100,内核会更倾向于回收dentry和inode cache。