本文共 2520 字,大约阅读时间需要 8 分钟。
最近看物理机有些内存不知道去哪里了,于是总结了下:
通过/proc/meminfo 统计内核泄漏值,用总内存(MemTotal) 减去 未使用的内存和内核以及用户态程序所使用的内存 (MemFree + MemKernel + MemLru)。这样就能统计出不明去向的内存值,也可以是说是内核内存泄漏了吧。
未使用的内存: MemFree = cat /proc/meminfo | grep 'MemFree:'
内核内存: MemKernel = Slab + VmallocUsed + PageTables + KernelStack + HardwareCorrupted + Bounce
MemLru和大页: Active + Inactive + Unevictable + (HugePages_Total * Hugepagesize)
LRU是Kernel的页面回收算法(Page Frame Reclaiming)使用的数据结构。Page cache和所有用户进程的内存(kernel stack和huge pages除外)都在LRU lists上。
LRU lists包括如下几种,在/proc/meminfo中都有对应的统计值:
LRU_INACTIVE_ANON – 对应 Inactive(anon)
LRU_ACTIVE_ANON – 对应 Active(anon) LRU_INACTIVE_FILE – 对应 Inactive(file) LRU_ACTIVE_FILE – 对应 Active(file) LRU_UNEVICTABLE – 对应 UnevictableHugepages在/proc/meminfo中是被独立统计的,与其它统计项不重叠,既不计入进程的RSS/PSS中,又不计入LRU Active/Inactive,也不会计入cache/buffer。如果进程使用了Hugepages,它的RSS/PSS不会增加。
MemTotal=$(cat /proc/meminfo | grep 'MemTotal:' | awk '{print $2}')MemFree=$(cat /proc/meminfo | grep 'MemFree:' | awk '{print $2}')echo $MemTotalecho $MemFreeecho "======================" Slab=$(cat /proc/meminfo | grep 'Slab:' | awk '{print $2}')VmallocUsedBytes=$(grep vmalloc /proc/vmallocinfo | awk '{total+=$2}; END {print total}')VmallocUsed=$((VmallocUsedBytes/1024))PageTables=$(cat /proc/meminfo | grep 'PageTables:' | awk '{print $2}')KernelStack=$(cat /proc/meminfo | grep 'KernelStack:' | awk '{print $2}')HardwareCorrupted=$(cat /proc/meminfo | grep 'HardwareCorrupted:' | awk '{print $2}')Bounce=$(cat /proc/meminfo | grep 'Bounce:' | awk '{print $2}')MemKernel=$((Slab + VmallocUsed + PageTables + KernelStack + HardwareCorrupted + Bounce))echo $Slabecho $VmallocUsedecho $PageTablesecho $KernelStackecho $Bounceecho $MemKernelecho "======================" Active=$(cat /proc/meminfo | grep 'Active:' | awk '{print $2}')Inactive=$(cat /proc/meminfo | grep 'Inactive:' | awk '{print $2}')Unevictable=$(cat /proc/meminfo | grep 'Unevictable:' | awk '{print $2}')HugePages_Total=$(cat /proc/meminfo | grep 'HugePages_Total:' | awk '{print $2}')Hugepagesize=$(cat /proc/meminfo | grep 'Hugepagesize:' | awk '{print $2}')MemLru=$((Active + Inactive + Unevictable + (HugePages_Total * Hugepagesize)))echo $Activeecho $Inactiveecho $Unevictableecho $HugePages_Totalecho $Hugepagesizeecho $MemLruecho "======================" CurrentMemTotal=$((MemFree + MemKernel + MemLru))#MemTotal=$MemFree + MemKernel + $(($Active + $Inactive + $Unevictable + ($HugePages_Total * $Hugepagesize)))echo $MemTotalecho $CurrentMemTotal LeakMem=$((MemTotal-CurrentMemTotal))echo $LeakMem
参考:
转载地址:https://blog.csdn.net/wllabs/article/details/101059413 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!