proc/meminfo 文件内存详解

来源:互联网 发布:局域网服务器软件 编辑:程序博客网 时间:2024/05/21 05:06
/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区可用的连续最大块的大小
0 0