proc/meminfo 文件内存详解

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/CodingNotes/article/details/82659569

/proc/meminfo 解析:

  • MemTotal:可用的总内存--总物理内存减去kernel 代码/数据段占用再减去保留的内存区,mem_init_print_info里面有具体计算方式;
  • MemFree:完全未用到的物理内存 LowFree+HighFree

   计算公式:MemAvailable:MemFree+Active(file)+Inactive(file)-(watermark+min(watermark,Active(file)+Inactive(file)/2))

   file占用的内存是可以释放的,但是释放的过多,会导致swap发生

   减去部分内存的目的是避免swap

  • Buffers:block device 文件读写用到的page 
    long nr_blockdev_pages(void)
    {
    struct block_device *bdev;
    long ret = 0;
    spin_lock(&bdev_lock);
    list_for_each_entry(bdev, &all_bdevs, bd_list) {
    ret += bdev->bd_inode->i_mapping->nrpages;
    }
    spin_unlock(&bdev_lock);
    return ret;
    }
    
  • Cached:普通文件占用的缓冲

        global_page_state(NR_FILE_PAGES) – total_swapcache_pages – i.bufferram
        NR_FILE_PAGES:所有缓冲页(page cache)的总和,包括:
        cached+buffer+swap cache
        swap cache中包含的是被确定要swapping换页、但是尚未写入物理交换区的匿名内存页(匿名指的是未关联任何具体文件)
        free 命令所显示的 “buffers” 表示块设备(block device)所占用的缓存页,包括直接读写块设备、以及文件系统元数据                     (metadata)如SuperBlock所使用的缓存页;
        而 “cached” 表示普通文件所占用的缓存页。
 

  • SwapCached:内存足够的情况下,这个值一般为0

那些匿名内存页,比如用户进程通过malloc()申请的内存页是没有关联任何文件的(有别于backing storage基于磁盘文件的内存页),如果发生swapping换页,这类内存页会被写入交换区。从一个匿名内存页被确定要被换页开始,它就被计入了swap cache,但是不一定会被立刻写入物理交换区,因为Linux的原则是除非绝对必要,尽量避免I/O。所以swap cache中包含的是被确定要swapping换页、但是尚未写入物理交换区的匿名内存页。
cache属于os管理,对应用程序是透明的

用下面的命令可以释放Cache Memory:
 

To free pagecache:
echo 1 > /proc/sys/vm/drop_caches
To free dentries and inodes:
echo 2 > /proc/sys/vm/drop_caches
To free pagecache, dentries and inodes:
echo 3 > /proc/sys/vm/drop_caches
  • Active:(pages[LRU_ACTIVE_ANON]   + pages[LRU_ACTIVE_FILE])
  • Inactive:pages[LRU_INACTIVE_ANON] + pages[LRU_INACTIVE_FILE]

ACTIVE_ANON和ACTIVE_FILE,分别表示anonymous pages和mapped pages。用户进程的内存页分为两种:与文件关联的内存(比如程序文件、数据文件所对应的内存页)和与文件无关的内存(比如进程的堆栈,用malloc申请的内存),前者称为file pages或mapped pages,后者称为anonymous pages

这部分具体可以参考LRU 内存管理算法

HighMem跟LowMem是32bitX86 上面的一种划分,860MB以上内存成为HighMem,
ARM架构上面没有这样的划分方式;
swap分区参数:Swap分区在系统的物理内存不够用的时候,把硬盘空间中的一部分空间释放出来,以供当前运行的程序使用
SwapTotal:可用的swap空间的总的大小
SwapFree:剩余swap空间的大小
kswapd()-->balance_pgdat()-->shrink_zone()-->shrink_inactive_list()-->shrink_page_list()(核心函数)-_swap()-->get_swap_page()
内存换出到swap的过程

  • Dirty:需要写入磁盘的内存区大小
  • Writeback:正在被写回磁盘的大小
  • AnonPages:未映射页的内存大小
  • Mapped: 设备和文件等映射的大小。
  • Slab: 内核数据结构slab的大小,可以减少申请和释放内存带来的消耗。
  • SReclaimable:可收回Slab的大小
  • SUnreclaim:不可收回Slab的大小(SUnreclaim+SReclaimable=Slab)
  • PageTables:管理内存分页页面的索引表的大小。
  • NFS_Unstable:不稳定页表的大小
  • VmallocTotal: vmalloc内存区大小
  • VmallocUsed: 已用的vmalloc区大小 
  • VmallocChunk: vmalloc区可用的连续最大块的大小

猜你喜欢

转载自blog.csdn.net/CodingNotes/article/details/82659569