Linux中buffer/cache,swap,虚拟内存和page ++

1、Buffer 和 cache

Free 命令相对于top 提供了更简洁的查看系统内存使用情况:

[[email protected] ~]$ free -m               ——以MB为单位
                     total         used       free     shared    buffers     cached
Mem:            32109      30133      1975          0        472      16881
-/+ buffers/cache:        12780       19328
Swap:          16063        10          16053

Mem:表示物理内存统计。
-/+ buffers/cached:表示物理内存的缓存统计 
Swap:表示硬盘上交换分区的使用情况。只有mem被当前进程实际占用完,即没有了buffers和cache时,才会使用到swap。

先看第一行:Mem

total 内存总数:  32109MB
used 已经使用的内存数:  30133 MB
free 空闲的内存数: 1975
shared 当前已经废弃不用,总是0
buffers Buffer Cache内存数: 472MB ——表示系统已经分配,但是没有被使用的buffer大小。
cached Page Cache内存数: 16881MB   ——系统已经分配,但是没有被使用的cache大小。

关系:total = used + free

第2行:
-/+ buffers/cache的意思相当于:
-buffers/cache 的内存数: 12780 MB (等于第1行的 used - buffers - cached)
+buffers/cache 的内存数: 19328MB (等于第1行的 free + buffers + cached)
可见-buffers/cache反映的是被程序实实在在吃掉的内存,而+buffers/cache反映的是可以挪用的内存总数。

已经分配的内存大小:

Used(Mem) = Used(-/+ buffers/cache)+ buffers(Mem) + Cached(Mem)

30133MB = 12780 MB + 472MB + 16881MB

第三行单独针对交换分区, 就不用再说了.

为了提高磁盘存取效率, Linux做了一些精心的设计, 除了对dentry进行缓存(用于VFS,加速文件路径名到inode的转换), 还采取了两种主要Cache方式:Buffer Cache和Page Cache。前者针对磁盘块的读写,后者针对文件inode的读写。这些Cache有效缩短了 I/O系统调用(比如read,write,getdents)的时间。

如果感兴趣可以进一步参考文件/proc/meminfo,free命令就是根据它的信息生成的。free命令的源码可从procps-xxx-.src.rpm获取,xxx为版本号,比如procps-3.2.3-5.3.src.rpm。

在linux的内存分配机制中,优先使用物理内存,当物理内存还有空闲时(还够用),不会释放其占用内存,就算占用内存的程序已经被关闭了,该程序所占用的内存用来做缓存使用,对于开启过的程序、或是读取刚存取过得数据会比较快。

 2、swap、虚拟内存和page

要明白这个首先要知道什么是保护模式和实模式。

以前的操作系统是实模式,例如dos。每个时候只有一个进程在跑,这个进程使用全部的物理内存。后来发展到保护模式,分时多进程。一个CPU上跑多个进程, 但进程不知道到底有多少内存可以用,它能访问内存最大地址。例如16位系统就能访问2^16byte,32位就是2^32位。但是实际上没有那么多内存阿?怎么办?保护模式就应运而生了。

假设进程是一个刘祥,裁判(系统)一发令他就开始跑步。但是裁判说给你1秒,可以跑100米。于是刘祥开始跑步(内存地址),一秒后刘祥只跑了10米,裁判吹哨说:刘祥你先歇会,我要去给王军霞吹哨呢,现记住你跑到哪里了(保护),等会从这里开始。裁判给王军霞吹哨,一只跑一秒,回来再给刘祥吹哨再跑1秒,如此往复。开始跑步的人少,刘祥还可以站在跑道上休息。后来跑步的人越来越多,跑道都挤满了人,那么只能把一些人移动到跑道旁的草地上休息(交换)。后来发现有些人横七竖八的躺着,占了不少空间,于是规定每个人只能站着(page),这样可以容纳很多的人。

swap -- 草地,就是存放page的硬盘空间。
virtual memory -- 假设刘祥跑n圈就已经是到北京的距离了,可是他们还在原地。虚拟就是不存在的。
page -- 草地上的格,每次只容纳一个人。

为了提高磁盘存取效率, Linux做了一些精心的设计, 除了对dentry进行缓存(用于VFS,加速文件路径名到inode的转换), 还采取了两种主要Cache方式:
Buffer Cache和Page Cache.前者针对磁盘块的读写,后者针对文件inode的读写.这些Cache有效缩短了I/O系统调用(如read,write,getdents

)的时间.

内存活动基本上可以用3个数字来量化:活动虚拟内存总量,交换(swapping)率和调页(paging)率.其中第一个数字表明内存的总需求量,后两个数字表示那些内存中有多少比例正处在使用之中.目标是减少内存活动或增加内存量,直到调页率保持在一个可以接受的水平上为止.

活动虚拟内存的总量(VM)=实际内存大小(size of real memory)(物理内存)+使用的交换空间大小(amount of swap space used)

当程序运行需要的内存大于物理内存时,UNIX系统采用了调页机制,即系统copy一些内存中的页面到磁盘上,腾出来空间供进程使用。大多数系统可以忍受偶尔的调页,但是频繁的调页会使系统性能急剧下降。

UNIX内存管理:UNIX系统通过2种方法进行内存管理,“调页算法”,“交换技术”。
调页算法是将内存中最近不常使用的页面换到磁盘上,把常使用的页面(活动页面)保留在内存中供进程使用。
交换技术是系统将整个进程,而不是部分页面,全部换到磁盘上。正常情况下,系统会发生一些交换过程。

当内存严重不足时,系统会频繁使用调页和交换,这增加了磁盘I/O的负载。进一步降低了系统对作业的执行速度,即系统I/O资源问题又会影响到内存资源的分配。

Unix的虚拟内存:Unix的虚拟内存是一个十分复杂的子系统,它实现了进程间代码与数据共享机制的透明性,并能够分配比系统现有物理内存更多的内存,某些操作系统的虚存甚至能通过提供缓存功能影响到文件系统的性能,各种风格的UNIX的虚存的实现方式区别很大,但都离不开下面的4个概念。

1:实际内存
实际内存是指一个系统中实际存在的物理内存,称为RAM。实际内存是存储临时数据最快最有效的方式,因此必须尽可能地分配给应用程序,现在的RAM的形式有多种:SIMM、DIMM、Rambus、DDR等,很多RAM都可以使用纠错机制(ECC)。

2:交换空间(swap)
交换空间是专门用于临时存储内存的一块磁盘空间,通常在页面调度和交换进程数据时使用,通常推荐交换空间的大小应该是物理内存的二到四倍。

3:页面调度
页面调度是指从磁盘向内存传输数据,以及相反的过程,这个过程之所以被称为页面调度,是因为Unix内存被平均划分成大小相等的页面;通常页面大小为4KB和8KB(在Solaris中可以用pagesize命令查看)。当可执行程序开始运行时,它的映象会一页一页地从磁盘中换入,与此类似,当某些内存在一段时间内空闲,就可以把它们换出到交换空间中,这样就可以把空闲的RAM交给其他需要它的程序使用。

4:交换
页面调度通常容易和交换的概念混淆,页面调度是指把一个进程所占内存的空闲部分传输到磁盘上,而交换是指当系统中实际的内存已不够满足新的分配需求时,把整个进程传输到磁盘上,交换活动通常意味着内存不足。

vmstat监视内存性能:该命令用来检查虚拟内存的统计信息,并可显示有关进程状态、空闲和交换空间、调页、磁盘空间、CPU负载和交换,cache刷新以及中断等方面的信息。
测试:

[[email protected] ~]# vmstat
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu------
 r  b     swpd    free       buff      cache   si   so    bi    bo   in   cs us sy id wa st
 0  0      0  1592800  41124   319788    0    0  1084    95  791  375  6 28 57 10  0
[[email protected] ~]#

Procs
r: The number of processes waiting for run time.
运行的和等待(CPU时间片)运行的进程数,这个值也可以判断是否需要增加CPU(长期大于1)

b: The number of processes in uninterruptable sleep.
处于不可中断状态的进程数,常见的情况是由IO引起的

w: The number of processes swapped out but otherwise runnable.

Memory

swpd: the amount of virtual memory used (kB).

free: the amount of idle memory (kB).
空闲的物理内存

buff: the amount of memory used as buffers (kB).
作为buffer cache的内存,对块设备的读写进行缓冲

cache: the amount of memory used as cache.

Swap

si: Amount of memory swapped in from disk (kB/s). 虚拟内存的页导入(从SWAP DISK导入RAM)

so: Amount of memory swapped to disk (kB/s). 虚拟内存的页导出.

(从RAM到SWAP DISK)

1、page in/out:系统运行过程中,它一般不会导致严重的性能问题,即使你的物理内存再大,也难免会出现或多或少的PAGE IN/OUT,这是多任务操作系统的内在机制决定的;

2、swap in/out:一般来说是系统物理内存比较紧张的表现,它是PAGE IN/OUT行为的进一步升级,PAGE IN/OUT是说明系统内存不够用,但仅仅是PAGE或BLOCK和磁盘的交换,但PAGE IN/OUT这种“内存不够用”一般是很难满足的,也是动态的。
3、page in/out和swap in/out的区别是:page in/out是PAGE 或BLOCK在内存和磁盘间交换,但swap in/out是整个进程空间的交换,这会产生严重的性能问题。
4、其实,PAGE、SWAP和SGA、PGA没可比性啊,它们应该说有联系,但不能对比着来讨论,前者是操作系统内存管理的一种行为,而后者是ORACLE数据库的两个和内存有关的参数,打个不恰当的比方:就象烹饪和饭量;
4、一般来说,sga和pga是基于操作系统的内存管理机制的,但具体dbms的缓冲内部是怎末管理的,我现在不是特别清楚,但我个人认为,DBMS的内存管理和一般软件的内存管理是有区别的,这种区别是,DBMS的内存管理不是完全依赖于OS的,也就是DBMS在内存管理方面,自主性更强一些,各种DBMS的缓冲区管理机制也不完全相同,个人之见而已,大家一起讨论。

page in/out和swap in/out是操作系统行为,目的是内存紧张时,空出内存来供给其他进程使用,这和应用软件从磁盘的读入和写出内存不是一回事情,也就是说,数据库从磁盘读入数据和写出数据到磁盘的行为,不算是PAGE IN/OUT和SWAP IN/OUT,有关操作系统原理的书籍里,应该有这部分内容。

时间: 2024-11-10 14:50:29

Linux中buffer/cache,swap,虚拟内存和page ++的相关文章

Linux中Buffer和Cache的区别

1. Cache:缓存区,是高速缓存,是位于CPU和主内存之间的容量较小但速度很快的存储器,因为CPU的速度远远高于主内存的速度,CPU从内存中读取数据需等待很长的时间,而  Cache保存着CPU刚用过的数据或循环使用的部分数据,这时从Cache中读取数据会更快,减少了CPU等待的时间,提高了系统的性能. Cache并不是缓存文件的,而是缓存块的(块是I/O读写最小的单元):Cache一般会用在I/O请求上,如果多个进程要访问某个文件,可以把此文件读入Cache中,这样下一个进程获取CPU控制

linux下的缓存机制及清理buffer/cache/swap的方法梳理

(1)缓存机制 为了提高文件系统性能,内核利用一部分物理内存分配出缓冲区,用于缓存系统操作和数据文件,当内核收到读写的请求时,内核先去缓存区找是否有请求的数据,有就直接返回,如果没有则通过驱动程序直接操作磁盘. 缓存机制优点:减少系统调用次数,降低CPU上下文切换和磁盘访问频率. CPU上下文切换:CPU给每个进程一定的服务时间,当时间片用完后,内核从正在运行的进程中收回处理器,同时把进程当前运行状态保存下来,然后加载下一个任务,这个过程叫做上下文切换.实质上就是被终止运行进程与待运行进程的进程

Linux系统中的Page cache和Buffer cache

Linux系统中的Page cache和Buffer cache Free命令显示内存 首先,我们来了解下内存的使用情况: Mem:表示物理内存统计 total:表示物理内存总量(total = used + free) used:表示总计分配给缓存(包含buffers 与cache )使用的数量,但其中可能部分缓存并未实际使用. free:未被分配的内存. shared:共享内存. buffers:系统分配但未被使用的buffers 数量. cached:系统分配但未被使用的cache 数量.

Linux内存中的Cache真的能被回收么?

Linux内存中的Cache真的能被回收么? ![Recycle] (http://sc.websbook.com/sc/upimg/allimg/090228/014_1600_websbook_com.jpg) 在Linux系统中,我们经常用free命令来查看系统内存的使用状态.在一个RHEL6的系统上,free命令的显示内容大概是这样一个状态: [[email protected] ~]# free             total       used       free     s

浅谈Linux 内存中的Cache: buffers 与 cached

Linux 内存中的Cache,真的能被回收么? 您真的了解Linux的free命令么? 在Linux系统中,我们经常用free命令来查看系统内存的使用状态.在一个RHEL6的系统上,free命令的显示内容大概是这样一个状态: 这里的默认显示单位是kb,我的服务器是128G内存,所以数字显得比较大.这个命令几乎是每一个使用过Linux的人必会的命令,但越是这样的命令,似乎真正明白的人越少(我是说比例越少). 一般情况下,对此命令输出的理解可以分这几个层次: 不了解.这样的人的第一反应是:天啊,内

Linux 内存中的Cache,真的能被回收么?

您真的了解Linux的free命令么? 在Linux系统中,我们经常用free命令来查看系统内存的使用状态.在一个RHEL6的系统上,free命令的显示内容大概是这样一个状态: 这里的默认显示单位是kb,我的服务器是128G内存,所以数字显得比较大.这个命令几乎是每一个使用过Linux的人必会的命令,但越是这样的命令,似乎真正明白的人越少(我是说比例越少). 一般情况下,对此命令输出的理解可以分这几个层次: 不了解.这样的人的第一反应是:天啊,内存用了好多,70个多G,可是我几乎没有运行什么大程

Linux内存中的Cache真的能被回收吗? 【转】

在Linux系统中,我们经常用free命令来查看系统内存的使用状态.在一个RHEL6的系统上,free命令的显示内容大概是这样一个状态: [[email protected] ~]# free             total       used       free     shared    buffers     cachedMem:     132256952   72571772   59685180          0    1762632   53034704-/+ buff

Page Cache buffer Cache

https://www.thomas-krenn.com/en/wiki/Linux_Page_Cache_Basics References Jump up ↑ The Buffer Cache (Section 15.3) page 348, Linux-Kernel Manual: Guidelines for the Design and Implementation of Kernel 2.6, Robert Love, Addison-Wesley, 2005 Jump up ↑ L

Linux中内存查看命令free详解(转)

add by zhj:-/+ buffers/cache行的free列就是实际未使用的内存.free -m中的参数-m是指以MB为单元输出数据 原文:http://liustb.blog.163.com/blog/static/1337080192011718112434416/ free命令用来查看内存的使用情况,与Top命令相比,开销较小. $free –m total          used        free        shared         buffers