/proc/meminfo分析(一)
本文主要分析/proc/meminfo文件的各种输出信息的具体含义。
一、MemTotal
MemTotal对应当前系统中可以使用的物理内存。
这个域实际是对应内核中的totalram_pages这个全局变量的,定义如下:
unsigned long totalram_pages __read_mostly;
该变量表示当前系统中Linux内核可以管理的所有的page frame的数量。注意:这个值并不是系统配置的内存总数,而是指操作系统可以管理的内存总数。
内核是如何得到totalram_pages这个值的呢?是在初始化的过程中得到的,具体如下:我们知道,在内核初始化的时候,我们可以通过memblock模块来管理内存布局,从而得到了memory type和reserved type的内存列表信息。在初始化阶段如果有内存分配的需求,那么也可以通过memblock来完成,直到伙伴系统初始化完成,而在这个过程中,memory type的那些page frame被一个个的注入到各个zone的free list中,同时用totalram_pages 来记录那个时间点中空闲的page frame数量。这个点也就是伙伴系统的一个初始内存数量的起点。
举一个实际的例子:我的T450的计算机,配置的内存是8G,也就是8388608KB。但是MemTotal没有那么多,毕竟OS本身(正文段、数据段等等)就会占用不少内存,此外还有系统各种保留的内存,把这些都去掉,Linux能管理的Total memory是7873756KB。看来OS内存管理的开销也不小啊。
二、MemFree
启动的时候,系统确定了MemTotal的数目,但是随着系统启动过程,内核会动态申请内存,此外,用户空间也会不断创建进程,也会不断的消耗内存,因此MemTotal可以简单分成两个部分:正在使用的和空闲的。MemFree表示的就是当前空闲的内存数目,这些空闲的page应该是挂在各个node的各个zone的buddy系统中。
具体free memory的计算如下:
freeram = global_page_state(NR_FREE_PAGES);
也就是把整个系统中在当前时间点上空闲的内存数目统计出来。
三、MemAvailable
所谓memory available,其实就是不引起swapping操作的情况下,我们能使用多少的内存。即便是free的,也不是每一个page都可以用于内存分配。例如buddy system会设定一个水位,一旦free memory低于这个水位,系统就会启动page reclaim,从而可能引起swapping操作。因此,我们需要从MemFree这个数值中去掉各个节点、各个zone的预留的内存(WMARK_LOW)数目。当然,也是不是说那些不是空闲的页面我们就不能使用,例如page cache,虽然不是空闲的,但是它也不过是为了加快性能而使用,其实也可以回收使用。当然,也不是所有的page cache都可以计算进入MemAvailable,有些page cache在回收的时候会引起swapping,这些page cache就不能算数了。此外,reclaimable slab中也有一些可以使用的内存,MemAvailable也会考虑这部分内存的情况。
总而言之,MemAvailable就是不需要额外磁盘操作(开销较大)就可以使用的空闲内存的数量。
四、Buffers
其实新的内核已经没有buffer cache了,一切都统一到了page cache的框架下了。因此,所谓的buffer cache就是块设备的page cache。具体的统计过程是通过nr_blockdev_pages函数完成,代码如下:
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;
}
我们知道,内核是通过address_space来管理page cache的,那么块设备的address_space在哪里呢?这个稍微复杂一点,涉及多个inode,假设/dev/aaa和/dev/bbb都是指向同一个物理块设备,那么open/dev/aaa和/dev/bbb会分别产生两个inode,我们称之inode_aaa和inode_bbb,但是最后一个块设备的page cache还是需要统一管理起来,不可能分别在inode_aaa和inode_bbb中管理。因此,Linux构造了一个bdev文件系统,保存了系统所有块设备的inode,我们假设该物理块设备在bdev文件系统中的inode是inode_bdev。上面讲了这么多的inode,其实块设备的page cache就是在inode_bdev中管理的。
一般来说,buffers的数量不多,因为产生buffer的操作包括:
1、打开该block device的设备节点,直接进行读写操作(例如dd一个块设备)
2、mount文件系统的时候,需要从相应的block device上直接把块设备上的特定文件系统的super block相关信息读取出来,这些super block的raw data会保存在该block device的page cache中
3、文件操作的时候,和文件元数据相关的操作(例如读取磁盘上的inode相关的信息)也是通过buffer cache进行访问。
Linux中最多处理的是2和3的操作,1的操作很少有。
五、Cached
读写普通文件的时候,我们并不会直接操作磁盘,而是通过page cache来加速文件IO的性能。Cached域描述的就是用于普通文件IO的page cache的数量,具体计算过程如下:
cached = global_page_state(NR_FILE_PAGES) -
total_swapcache_pages() - i.bufferram;
系统中所有的page cache都会被记录在一个全局的状态中,通过global_page_state(NR_FILE_PAGES)可以知道这个数据,这个数据包括:
1、普通文件的page cache
2、block device 的page cache。参考上一节的描述。
3、swap cache。下一节会进一步描述。
对于Cached这个域,我们只关心普通文件的page cache,因此要从page cache的total number中减去buffer cache和swap cache。
六、SwapCached
其实上一节已经提及swap cache了,也归属于page cache中,具体计算如下:
unsigned long total_swapcache_pages(void)
{
int i;
unsigned long ret = 0;for (i = 0; i < MAX_SWAPFILES; i++)
ret += swapper_spaces[i].nrpages;
return ret;
}
和其他的page cache不一样,swap cache并不是为了加快磁盘IO的性能,它是为了解决page frame和swap area之间的同步问题而引入的。例如:一个进程准备swap in一个page的时候,内核的内存回收模块可能同时也在试图将这个page swap out。为了解决这些这些同步问题,内核引入了swap cache这个概念,在任何模块进行swap in或者swap out的时候,都必须首先去swap cache中去看看,而借助page descriptor的PG_locked的标记,我们可以避免swap中的race condition。
swap cache在具体实现的时候,仍然借用了page cache的概念,每一个swap area都有一个address space,管理该swap device(或者swap file)的page cache。因此,一个swap device的所有swap cache仍然是保存在对应address space的radix tree中(仍然是熟悉的配方,仍然是熟悉的味道啊)。
/proc/meminfo分析(一)的更多相关文章
- /proc/meminfo分析
参考: 1. linux/Documentation/filesystems/proc.txt 2. Linux 中 /proc/meminfo 的含义 3. redhat deployment gu ...
- linux /proc/meminfo 文件分析(转载)
cat /proc/meminfo 读出的内核信息进行解释,下篇文章会简单对读出该信息的代码进行简单的分析. # cat /proc/meminfo MemTotal: kB MemFr ...
- Linux cat /proc/meminfo 输出分析
$cat /proc/meminfoMemTotal: 2052440 kB //总内存MemFree: 50004 kB //空闲内存Buffers: ...
- /proc/meminfo详解
cat /proc/meminfo 读出的内核信息进行解释, 下篇文章会简单对读出该信息的代码进行简单的分析. MemTotal: 507480 kB MemFree: ...
- Android中proc/meminfo的详解(原)
今天在写到获取手机可用内存空间的总大小的时候,通过下面的方法去获取的时候,发现该方法最低支持的版本是16,这显然是不可取的. public static long getTotalSpace(Cont ...
- #cat /proc/meminfo 详解
$cat /proc/meminfoMemTotal: 2052440 kB //总内存MemFree: 50004 kB //空闲内存Buffers: ...
- linux查内存操作:cat /proc/meminfo
https://www.cnblogs.com/zhuiluoyu/p/6154898.html cat /proc/meminfo
- Prometheus Node_exporter 之 Memory Detail Meminfo /proc/meminfo
1. Memory Active / Inactive type: GraphUnit: bytesLabel: BytesInactive - 最近使用较少的内存, 优先被回收利用 /proc/me ...
- Interpreting /proc/meminfo and free output for Red Hat Enterprise Linux 5, 6 and 7
Interpreting /proc/meminfo and free output for Red Hat Enterprise Linux 5, 6 and 7 Solution Verified ...
随机推荐
- SVN jsvnadmin 安装与基本使用
1. jsvnadmin 介绍 https://code.google.com/p/jsvnadmin/ Svn Admin是一个Java开发的管理Svn服务器的项目用户的web应用.安装好Svn服 ...
- 动态改变UIPopupList选项(NGUI)
NGUI的UIPopupList 可以通过修改items属性来动态改变菜单选项: public class popListvahnge : MonoBehaviour { public UIPopup ...
- 用Bluepages来验证intranetId和Password的有效性
代码很简单,如下: int ret = -1;ReturnCode rc = null; cwa2 cw = new cwa2();rc = cw.authenticate(in ...
- 从Ubuntu12.04LTS到Foreda19再到Foreda8
装Ubuntu的初衷是以为它能识别我的PCI无线网卡,但装了两遍没有做到. 昨天在Ubuntu装jdk7,其过程与正常Linux安装jdk差别不小,有点背离的意思.另外VI的用法也和正常Unix/Li ...
- 破解无线网络密码-BT3如何使用3
BT3 虚拟机 SNOOPWEP2 破解无线网络WEP密钥图解 1.下载BT3 光盘映像文件(ISO格式),比如:bt3-final.iso: 用WinISO 或 UltraISO(这个还支持DVD ...
- 算法笔记_127:蓝桥杯2017模拟赛-本科组习题解答(Java)
目录 1 算年龄 2 猜算式 3 排列序数 4 字符串比较 5 还款计算 6 滑动解锁 7 风险度量 PS:以下代码部分仅供参考,若有不当之处,还请路过同学指出哦~ 1 算年龄 标题:算年龄 英 ...
- Vue 生命周期LIFECYCLE是8个吗?
vue生命周期钩子个数是:11个. export const LIFECYCLE_HOOKS = [ 'beforeCreate', 'created', 'beforeMount', 'mounte ...
- 解决win10鼠标晃动问题
删除HKEY_CLASSES_ROOTDirectoryBackgroundshellexContextMenuHandlers 下面,除了new以外的文件夹 重启,Ok
- 安装ubuntu后不能从ubuntu引导修复方法
sudo fdisk -l sudo -i mkdir /media/tempdir mount /dev/sda7 /media/tempdir grub-install --root-direct ...
- eclipse下java中凝视字体太小和xml中中文字体太小问题解决方法
我们在win7下进行android应用开发.须要搭建对应的开发环境.如今普遍基本上都是eclipse+adt+sdk,在本人搭建完环境后,发现eclipse下.java中的凝视和xml中的中文字体变得 ...