计算内核泄漏内存值

最近看物理机有些内存不知道去哪里了,于是总结了下:

通过/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  –  对应 Unevictable

Hugepages在/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 $MemTotal
echo $MemFree
echo "======================"
 
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 $Slab
echo $VmallocUsed
echo $PageTables
echo $KernelStack
echo $Bounce
echo $MemKernel
echo "======================"
 
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 $Active
echo $Inactive
echo $Unevictable
echo $HugePages_Total
echo $Hugepagesize
echo $MemLru
echo "======================"
 
CurrentMemTotal=$((MemFree + MemKernel + MemLru))
#MemTotal=$MemFree + MemKernel + $(($Active + $Inactive + $Unevictable + ($HugePages_Total * $Hugepagesize)))
echo $MemTotal
echo $CurrentMemTotal
 
LeakMem=$((MemTotal-CurrentMemTotal))
echo $LeakMem

 

参考:http://linuxperf.com/?p=142

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值