当前位置:   article > 正文

内存管理二 proc/meminfo 文件详解_mem.memfree.percent

mem.memfree.percent

一、meminfo中参数的解释:

cat  /proc/meminfo

MemTotal:        1859640 kB                         //可用的总内存
MemFree:           69836 kB                          //完全未用到的物理内存 LowFree+HighFree
MemAvailable:     507340 kB                       //MemAvailable ≈ MemFree+Buffers+Cached
Buffers:            7428 kB                               //缓冲区内存数
Cached:           462428 kB                           //缓存区内存数
SwapCached:        17780 kB
Active:           548544 kB             //Active:(pages[LRU_ACTIVE_ANON]   + pages[LRU_ACTIVE_FILE])
Inactive:         552948 kB            //pages[LRU_INACTIVE_ANON] + pages[LRU_INACTIVE_FILE]

Active(anon):     315788 kB 
Inactive(anon):   319452 kB
Active(file):     232756 kB  
Inactive(file):   233496 kB
Unevictable:        1820 kB
Mlocked:               0 kB
HighTotal:       1366584 kB
HighFree:          26140 kB
LowTotal:         493056 kB
LowFree:           43696 kB

SwapTotal:       1048572 kB                   //可用的swap空间的总的大小
SwapFree:         642324 kB                   //剩余swap空间的大小
Dirty:               148 kB                            //需要写入磁盘的内存区大小
Writeback:             0 kB                         //正在被写回磁盘的大小
AnonPages:        630600 kB                 //未映射页的内存大小
Mapped:           351396 kB                   //设备和文件等映射的大小
Shmem:              1784 kB
Slab:             117972 kB                       //slab使用的内存
SReclaimable:      27540 kB                 //可收回Slab的大小
SUnreclaim:        90432 kB                   //不可回收的slab的大小
KernelStack:       17968 kB     常驻内存,每一个用户线程都会分配一个kernel stack(内核栈)
PageTables:        46464 kB                  //管理内存分页页面的索引表的大小

NFS_Unstable:          0 kB
Bounce:                0 kB
WritebackTmp:          0 kB
CommitLimit:     1978392 kB
Committed_AS:   67525156 kB
VmallocTotal:     499712 kB                 //vmalloc内存区大小
VmallocUsed:           0 kB                    //vmalloc已经使用的内存
VmallocChunk:          0 kB                   //vmalloc区可用的连续最大块的大小
CmaTotal:              0 kB
CmaFree:               0 kB

二、概述
(1)ACTIVE_ANON和ACTIVE_FILE,分别表示anonymous pages和mapped pages。

用户进程的内存页分为两种:与文件关联的内存(比如程序文件、数据文件所对应的内存页)和与文件无关的

内存(比如进程的堆栈,用malloc申请的内存),前者称为file pages或mapped pages,后者称为anonymous pages;

其中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

      Inactive list里的是长时间未被访问过的内存页,Active list里的是最近被访问过的内存页,LRU算法利用Inactive list

和Active list可以判断哪些内存页可以被优先回收。

(2)MemAvailable

      应用程序可用内存数。系统中有些内存虽然已被使用但是可以回收的,比如cache/buffer、slab都有一部分可以回收,

所以MemFree不能代表全部可用的内存,这部分可回收的内存加上MemFree才是系统可用的内存,即:

MemAvailable≈MemFree+Buffers+Cached,它是内核使用特定的算法计算出来的,是一个估计值。

(3)VmallocUsed

  通过vmalloc分配的内存都统计在/proc/meminfo的 VmallocUsed 值中,但是要注意这个值不止包括了分配的物

理内存,还统计了VM_IOREMAP、VM_MAP等操作的值,譬如VM_IOREMAP是把IO地址映射到内核空间、并未

消耗物理内存,所以我们要把它们排除在外。从物理内存分配的角度,我们只关心VM_ALLOC操作,这可以从

/proc/vmallocinfo中的vmalloc记录看到。

(4)KernelStack:

  Kernel stack(内核栈)是常驻内存的,既不包括在LRU lists里,也不包括在进程的RSS/PSS内存里,所以

我们认为它是kernel消耗的内存。统计值是/proc/meminfo的KernelStack。64bit 系统的 task_struct size 是16KB,  

32bit的系统task_struct size为 8KB,每一个用户线程都会分配一个kernel stack(内核栈),内核栈虽然属于线程,

但用户态的代码不能访问,只有通过系统调用(syscall)、自陷(trap)或异常(exception)进入内核态的时候才会用到,也

就是说内核栈是给kernel code使用的。
 

三、内存黑洞:

  进程通过将memoryinfo中的内存大小相加起来,发现总是比真实内存小,那是因为有内存黑洞的存在,

我们知道,Kernel的动态内存分配通过以下几种接口:

  • alloc_pages/__get_free_page: 以页为单位分配

  • vmalloc: 以字节为单位分配虚拟地址连续的内存块

  • slab allocator

vmalloc和slab分配的内存都会被记录在meminfo中,

但通过alloc_pages/__get_free_page分配的内存,没有在/proc/meminfo中统计,不知道有多少,就像个黑洞。

 

作者:frank_zyp 
您的支持是对博主最大的鼓励,感谢您的认真阅读。 
本文无所谓版权,欢迎转载。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/羊村懒王/article/detail/160814
推荐阅读
相关标签
  

闽ICP备14008679号