赞
踩
/proc/meminfo 解析:
计算公式:MemAvailable:MemFree+Active(file)+Inactive(file)-(watermark+min(watermark,Active(file)+Inactive(file)/2))
file占用的内存是可以释放的,但是释放的过多,会导致swap发生
减去部分内存的目的是避免swap
- 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;
- }
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” 表示普通文件所占用的缓存页。
那些匿名内存页,比如用户进程通过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_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的过程
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。