缺页中断
缺页中断属于内部中断,也就是异常。细分的话属于异常中的故障。
在执行一条指令时,如果发现他要访问的页没有在内存中(存在位为0),那么停止该指令的执行,并产生一个页不存在异常,对应的故障处理程序可通过从外存加载加载该页到内存的方法来排除故障,之后,原先引起的异常的指令就可以继续执行,而不再产生异常。
主缺页中断 --> 要从磁盘读取数据而产生的中断
次缺页中断 --> 数据已经被读入内存并被缓存起来,从内存缓存区中而不是直接从硬盘中读取数据而产生的中断
time 命令可以用来查看某程序第一次启动的时候产生了多少主缺页中断和次缺页中断:
/usr/bin/time -v date
buffer和cache
可以用查看服务器物理内存和文件缓存区的情况:
其中:
MemTotal --> 物理总内存
MemFree --> 可用内存
Buffers --> 磁盘缓存
Cached --> 文件缓存区
磁盘缓存(Buffers),又称磁盘快取,实际上就是将下载到的数据先保存于系统为软件分配的内存空间中(这个内存空间被称之为"内存池"),当保存到内存池中的数据达到一个程度时,便将数据保存到硬盘中。这样可以减少实际的磁盘操作,有效的保护磁盘免于重复的读写操作而导致的损坏。
文件缓存区(Cached),将文件相关数据缓存到文件缓存区中,以便需要的时候调用
从文件缓存区读取页要比硬盘内读取页快得多,所以Linux内核将尽量调用次缺页中断来直接从文件缓存区中读取数据,而不是通过主缺页中断来读取,这样一来,当系统运行了一段时间后,可能会发现即使运行了很少的几个进程,文件缓存区依然越变越大,只有当物理内存已经不够使用时,才会通过守护进程释放掉一些页。所以当发现系统可用内存月来越小时,也许就是由于内核将数据缓存到文件缓存区导致的。
内存页面类型
Linux中内存页面主要有三种类型:
1、Read pages,只读页(或代码页),那些通过主缺页中断从硬盘读取的页面,包括不能修改的静态文件、可执行文件、库文件等。当内核需要它们的时候把它们读到内存中,当内存不足的时候,内核就释放它们到空闲列表,当程序再次需要它们的时候需要通过缺页中断再次读到内存。
2、Dirty pages,脏页,指那些在内存中被修改过的数据页,比如文本文件等。这些文件由 pdflush 负责同步到硬盘,内存不足的时候由 kswapd 和 pdflush 把数据写回硬盘并释放内存。
3、Anonymous pages,匿名页,那些属于某个进程但是又和任何文件无关联,不能被同步到硬盘上,内存不足的时候由 kswapd 负责将它们写到交换分区并释放内存。
SWAP交换分区
当系统没有足够物理内存来应付所有请求的时候就会用到 swap 设备,swap 设备可以是一个文件,也可以是一个磁盘分区。不过要小心的是,使用 swap 的代价非常大。如果系统没有物理内存可用,就会频繁 swapping,如果 swap 设备和程序正要访问的数据在同一个文件系统上,那会碰到严重的 IO 问题,最终导致整个系统迟缓,甚至崩溃。
swap 设备和内存之间的 swapping 状况是判断 Linux 系统性能的重要参考,我们可以用很多工具来监测 swap 和 swapping 情况,比如:top、cat /proc/meminfo、vmstat 等。