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

 

1、缓存机制介绍node

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

Swap用途:Swap意思是交换分区,一般咱们说的虚拟内存,是从硬盘中划分出的一个分区。当物理内存不够用的时候,内核就会释放缓存区(buffers/cache)里一些长时间不用的程序,而后将这些程序临时放到Swap中,也就是说若是物理内存和缓存区内存不够用的时候,才会用到Swap。
swap清理:swapoff -a && swapon -a
注意:这样清理有个前提条件,空闲的内存必须比已经使用的swap空间大缓存

2、查看缓存区及内存使用状况bash

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
free 命令用于检测物理内存和交换内存已使用量和可用量(默认单位为KB)
[root@backup ~] # free -m           //使用-m参数表示以兆字节为单位显示内存
              total       used        free      shared    buffers     cached
Mem:         64181      44372      19809          3         12        216
-/+ buffers /cache :      44143      20038
Swap:        32767          0      32767
  
第一部分Mem行解释:
total:内存总数;
used:已经使用的内存数;
free :空闲的内存数;
shared:当前已经废弃不用;
buffers Buffer:缓存内存数;
cached Page:缓存内存数。
关系:total = used +  free
  
第二部分(-/+ buffers /cache )解释:
(-buffers /cache ) used内存数:第一部分Mem行中的 used – buffers – cached
(+buffers /cache free 内存数: 第一部分Mem行中的  free  + buffers + cached
  
可见-buffers /cache 反映的是被程序实实在在吃掉的内存,而+buffers /cache 反映的是能够挪用的内存总数。
  
第三部分是指交换分区。
  
---------------------------------------------------------------------------------------------
以字节为单位显示内存
加上-b参数的 free 命令,以字节为单位显示内存的大小。
  
[root@backup ~] # free -b
              total       used        free      shared    buffers     cached
Mem:    67299549184 46525181952 20774367232    3272704   12820480  227033088
-/+ buffers /cache : 46285328384 21014220800
Swap:   34359734272          0 34359734272
-------------------------------------------------------------------------------------------
以千字节为单位显示内存
加上-k参数的 free 命令(默认单位,因此能够不用使用它),以(KB)千字节为单位显示内存大小。
[root@backup ~] # free -k
              total       used        free      shared    buffers     cached
Mem:      65722216   45435760   20286456       3196      12520     221712
-/+ buffers /cache :   45201528   20520688
Swap:     33554428          0   33554428
-------------------------------------------------------------------------------------------
以千兆字节为单位显示内存
使用-g为参数,将会以GB(千兆字节)为单位显示内存大小。
[root@backup ~] # free -g
              total       used        free      shared    buffers     cached
Mem:            62         43         19          0          0          0
-/+ buffers /cache :         43         19
Swap:           31          0         31
------------------------------------------------------------------------------------------
按期时间间隔更新内存状态
-s选项加上一个整数,用来在按期时间间隔内更新 free 命令。举个例子,下面的命令将会在每5秒更新一个 free 命令。
[root@backup ~] # free -s 5
              total       used        free      shared    buffers     cached
Mem:      65722216   45436660   20285556       3196      12712     222096
-/+ buffers /cache :   45201852   20520364
Swap:     33554428          0   33554428
  
              total       used        free      shared    buffers     cached
Mem:      65722216   45436592   20285624       3196      12720     222096
-/+ buffers /cache :   45201776   20520440
Swap:     33554428          0   33554428

3、buffers和cached解释服务器

=========================================================
缓存(cached)是把读取过的数据保存起来,从新读取时若命中(找到须要的数据)就不要去读硬盘了,若没有命中就读硬盘。其中的数据会根据读取频率进行组织,把最频繁读取的内容放在最容易找到的位置,把再也不读的内容不断日后排,直至从中删除。网络

缓冲(buffers)是根据磁盘的读写设计的,把分散的写操做集中进行,减小磁盘碎片和硬盘的反复寻道,从而提升系统性能。linux有一个守护进程按期清空缓冲内容(即写入磁盘),也能够经过sync命令手动清空缓冲。举个例子吧:我这里有一个ext2的U盘,我往里面cp一个3M的MP3,但U盘的灯没有跳动,过了一下子(或者手动输入sync)U盘的灯就跳动起来了。卸载设备时会清空缓冲,因此有些时候卸载一个设备时要等上几秒钟。app

修改/etc/sysctl.conf中的vm.swappiness右边的数字能够在下次开机时调节swap使用策略。该数字范围是0~100,数字越大越倾向于使用swap。默认为60,能够改一下试试。–二者都是RAM中的数据。性能

二者都是RAM中的数据,简单来讲,buffer是即将要被写入磁盘的,而cache是被从磁盘中读出来的。
buffer是由各类进程分配的,被用在如输入队列等方面。一个简单的例子如某个进程要求有多个字段读入,在全部字段被读入完整以前,进程把先前读入的字段放在buffer中保存。
cache常常被用在磁盘的I/O请求上,若是有多个进程都要访问某个文件,因而该文件便被作成cache以方便下次被访问,这样可提升系统性能。
========================================================学习

Cache:缓冲区,高速缓存,是位于CPU与主内存间的一种容量较小但速度很高的存储器。因为CPU的速度远高于主内存,CPU直接从内存中存取数据要等待必定时间周期,Cache中保存着CPU刚用过或循环使用的一部分数据,当CPU再次使用该部分数据时可从Cache中直接调用,这样就减小了CPU的等待时间,提升了系统的效率。Cache又分为一级Cache(L1 Cache)和二级Cache(L2 Cache),L1 Cache集成在CPU内部,L2 Cache早期通常是焊在主板上,如今也都集成在CPU内部,常见的容量有256KB或512KB L2 Cache。它是根据程序的局部性原理而设计的,就是cpu执行的指令和访问的数据每每在集中的某一块,因此把这块内容放入cache后,cpu就不用在访问内存了,这就提升了访问速度。固然若cache中没有cpu所须要的内容,仍是要访问内存的。从内存读取与磁盘读取角度考虑,cache能够理解为操做系统为了更高的读取效率,更多的使用内存来缓存可能被再次访问的数据。spa

Cache并非缓存文件的,而是缓存块的(块是I/O读写最小的单元);Cache通常会用在I/O请求上,若是多个进程要访问某个文件,能够把此文件读入Cache中,这样下一个进程获取CPU控制权并访问此文件直接从Cache读取,提升系统性能。

Buffer:缓冲区,一个用于存储速度不一样步的设备或优先级不一样的设备之间传输数据的区域。经过buffer能够减小进程间通讯须要等待的时间,当存储速度快的设备与存储速度慢的设备进行通讯时,存储慢的数据先把数据存放到buffer,达到必定程度存储快的设备再读取buffer的数据,在此期间存储快的设备CPU能够干其余的事情。

Buffer:通常是用在写入磁盘的,例如:某个进程要求多个字段被读入,当全部要求的字段被读入以前已经读入的字段会先放到buffer中。Buffer是根据磁盘的读写设计的,把分散的写操做集中进行,减小磁盘碎片和硬盘的反复寻道,从而提升系统性能。linux有一个守护进程按期清空缓冲内容(即写入磁盘),也能够经过sync命令手动清空缓冲。

cache是高速缓存,用于CPU和内存之间的缓冲;
buffer是I/O缓存,用于内存和硬盘的缓冲;

cache最初用于cpu cache,主要缘由是cpu 与memory,因为cpu快,memory跟不上,且有些值使用次数多,因此放入cache中,主要目的是,重复使用,而且一级\二级物理cache速度快,
buffer主要用于disk与 memory,主要是保护硬盘或减小网络传输的次数(内存数据表现dataSet).固然也能够提升速度(不会当即写入硬盘或直接从硬盘中读出的数据立刻显示),重复使用,最初最主要的目的是保护disk,

Free中的buffer和cache:(它们都是占用内存):
buffer : 做为buffer cache的内存,是块设备的读写缓冲区
cache: 做为page cache的内存, 文件系统的cache

若是 cache 的值很大,说明cache住的文件数不少。若是频繁访问到的文件都能被cache住,那么磁盘的读IO bi会很是小。
========================================================

下面经过一些简单通俗的例子来讲明下Cache和Buffer缓存之间的区别:

1)Cache缓存

假设某地发生了天然灾害(好比地震),居民缺衣少食,因而派救火车去给若干个居民点送水。救火车到达第一个居民点,开闸放水,老百姓就拿着盆盆罐罐来接水。假如说救火车在一个居民点停留100分钟放完了水,而后从新储水花半个小时,再开往下一个居民点。这样一个白天来来来回回的,也就是4-5个居民点。

但咱们想一想,救火车是何等存在,若是把水龙头彻底打开,其强大的水压能轻易冲上10层楼以上, 10分钟就能够把水所有放完。但由于居民是拿盆罐接水,100%打开水龙头那就是给人洗澡了,因此只能打开一小部分(好比10%的流量)。但这样就下降了放水的效率(只有原来的10%了),10分钟变100分钟。

那么,咱们是否能改进这个放水的过程,让救火车以最高效率放完水、尽快赶往下一个居民点呢?
方法就是:在居民点建蓄水池。
救火车把水放到蓄水池里,由于是以100%的效率放水,10分钟结束而后走人。居民再从蓄水池里一点一点的接水。

咱们分析一下这个例子,就能够知道Cache的含义了。
救火车要给居民送水,居民要从救火车接水,就是说居民和救火车之间有交互,有联系。
但救火车是"高速设备",居民是"低速设备",低速的居民跟不上高速的救火车,因此救火车被迫下降了放水速度以适应居民。
为了不这种状况,在救火车和居民之间多了一层"蓄水池(也就是Cache)",它一方面以100%的高效和救火车打交道,另外一方面以10%的低效和居民打交道,这就解放了救火车,让其以最高的效率运行,而不被低速的居民拖后腿,因而救火车只须要在一个居民点停留10分钟就能够了。
因此说,蓄水池是"活雷锋",把高效留给别人,把低效留给本身。把10分钟留给救火车,把100分钟留给本身。

从以上例子能够看出,所谓Cache,就是"为了弥补高速设备和低速设备之间的矛盾"而设立的一个中间层。由于在现实里常常出现高速设备要和低速设备打交道,结果被低速设备拖后腿的状况。Cache的存在是为了解决什么问题?速度太慢了,要加快速度!

以PC为例。CPU速度很快,但CPU执行的指令是从内存取出的,计算的结果也要写回内存,但内存的响应速度跟不上CPU。CPU跟内存说:你把某某地址的指令发给我。内存听到了,但由于速度慢,迟迟不见指令返回,这段时间,CPU只能无所事事的等待了。这样一来,再快的CPU也发挥不了效率。
怎么办呢?在CPU和内存之间加一块"蓄水池",也就是Cache(片上缓存),这个Cache速度比内存快,从Cache取指令不须要等待。当CPU要读内存的指令的时候先读Cache再读内存,但一开始Cache是空着的,只能从内存取,这时候的确是很慢,CPU须要等待。但从内存取回的不只仅是CPU所须要的指令,还有其它的、当前不须要的指令,而后把这些指令存在Cache里备用。CPU再取指令的时候仍是先读Cache,看看里面有没有所需指令,若是碰巧有就直接从Cache取,不用等待便可返回(命中),这就解放了CPU,提升了效率。(固然不会是100%命中,由于Cache的容量比内存小)

2)Buffer缓存

好比说吐鲁番的葡萄熟了,要用大卡车装葡萄运出去卖果园的姑娘采摘葡萄,固然不是前手把葡萄摘下来,后手就放到卡车上,而是须要一个中间过程"箩筐":摘葡萄→放到箩筐里→把箩筐里的葡萄倒入卡车。也就是说,虽然最终目的是"把葡萄倒入卡车",但中间必需要通过"箩筐"的转手,这里的箩筐就是Buffer。是"暂时存放物品的空间"。
注意2个关键词:暂时,空间
再换句话说,为了完成最终目标:把葡萄放入卡车的空间,须要暂时把葡萄放入箩筐的空间。

以BT为例,BT下载须要长时间的挂机,电脑就有可能24小时连轴转,但BT下载的数据是碎片化的,体如今硬盘写入上也是碎片化的,由于硬盘是机械寻址器件,这种碎片化的写入会形成硬盘长时间高负荷的机械运动,形成硬盘过早老化损坏,当年有大量的硬盘由于BT下载而损坏。因而新出的BT软件在内存里开辟了Buffer,数据暂时写入Buffer,攒到必定的大小(好比512M)再一次性写入硬盘,这种"化零为整"的写入方式大大下降了硬盘的负荷。这就是:为了完成最终目标:把数据写入硬盘空间,须要暂时写入Buffer的空间。

3)两者之间的区别总结

Cache和Buffer的相同点:都是2个层面之间的中间层,都是内存。
Cache和Buffer的不一样点:Cache解决的是时间问题,Buffer解决的是空间问题。
为了提升速度,引入了Cache这个中间层。
为了给信息找到一个暂存空间,引入了Buffer这个中间层。
为了解决2个不一样维度的问题(时间、空间),恰巧取了同一种解决方法:加入一个中间层,先把数据写到中间层上,而后再写入目标。
这个中间层就是内存“RAM”,既然是存储器就有2个参数:写入的速度有多块(速度),能装多少东西(容量)
Cache利用的是RAM提供的高读写速度,Buffer利用的是RAM提供的存储容量(空间)。

a)Buffer(缓冲区)是系统两端处理速度平衡(从长时间尺度上看)时使用的。它的引入是为了减少短时间内突发I/O的影响,起到流量整形的做用。好比生产者——消费者问题,他们产生和消耗资源的速度大致接近,加一个buffer能够抵消掉资源刚产生/消耗时的忽然变化。
b)Cache(缓存)则是系统两端处理速度不匹配时的一种折衷策略。由于CPU和memory之间的速度差别愈来愈大,因此人们充分利用数据的局部性(locality)特征,经过使用存储系统分级(memory hierarchy)的策略来减少这种差别带来的影响。
c)假定之后存储器访问变得跟CPU作计算同样快,cache就能够消失,可是buffer依然存在。好比从网络上下载东西,瞬时速率可能会有较大变化,但从长期来看倒是稳定的,这样就能经过引入一个buffer使得OS接收数据的速率更稳定,进一步减小对磁盘的伤害。
========================================================

4、手动清理缓存

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
释放缓存区内存的方法
1)清理pagecache(页面缓存)
[root@backup ~] # echo 1 > /proc/sys/vm/drop_caches     或者 # sysctl -w vm.drop_caches=1
 
2)清理dentries(目录缓存)和inodes
[root@backup ~] # echo 2 > /proc/sys/vm/drop_caches     或者 # sysctl -w vm.drop_caches=2
 
3)清理pagecache、dentries和inodes
[root@backup ~] # echo 3 > /proc/sys/vm/drop_caches     或者 # sysctl -w vm.drop_caches=3
 
上面三种方式都是临时释放缓存的方法,要想永久释放缓存,须要在 /etc/sysctl .conf文件中配置:vm.drop_caches=1 /2/3 ,而后sysctl -p生效便可!
 
另外,可使用 sync 命令来清理文件系统缓存,还会清理僵尸(zombie)对象和它们占用的内存
[root@backup ~] # sync
 
 
舒适提示:
上面操做在大多数状况下都不会对系统形成伤害,只会有助于释放不用的内存。
可是若是在执行这些操做时正在写数据,那么实际上在数据到达磁盘以前就将它从文件缓存中清除掉了,这可能会形成很很差的影响。
 
那么若是避免这种事情发生呢?
所以,这里不得不提一下 /proc/sys/vm/vfs_cache_pressure 这个文件,告诉内核,当清理inoe /dentry 缓存时应该用什么样的优先级。
[root@backup ~] # cat /proc/sys/vm/vfs_cache_pressure
100
 
vfs_cache_pressure=100    这个是默认值,内核会尝试从新声明dentries和inodes,并采用一种相对于页面缓存和交换缓存比较 "合理" 的比例。
 
减小vfs_cache_pressure的值,会致使内核倾向于保留dentry和inode缓存。
增长vfs_cache_pressure的值,(即超过100时),则会致使内核倾向于从新声明dentries和inodes
  
总之,vfs_cache_pressure的值:
小于100的值不会致使缓存的大量减小
超过100的值则会告诉内核你但愿以高优先级来清理缓存。
  
其实不管vfs_cache_pressure的值采用什么值,内核清理缓存的速度都是比较低的。
若是将此值设置为10000,系统将会将缓存减小到一个合理的水平。
======================================================
 
这里顺便说下本身遇到的一个内存问题:
IDC机房有一台专门的备份服务器,天天凌晨执行多个备份脚本。某天早上忽然发现收到不少条zabbix监控报警信息:这台备份服务器的内存使用了已超过80%!
因而,赶忙登录这台备份服务器,使用 free 命令查看内存使用状况:
[root@backup ~] # free -m
              total       used        free      shared    buffers     cached
Mem:         64181      48585      15596          3          2         18
-/+ buffers /cache :      48564      15617
Swap:        32767          0      3276
 
确实发现内存使用率已超过80%!可是使用 "top" 命令查看,发现此时并无什么进程在占用内存,而且本机是备份服务器,只有晚上执行备份脚本,
其余时间都没有服务进程在跑!因而尝试手动释放内存:
[root@backup ~] # echo 1 > /proc/sys/vm/drop_caches
[root@backup ~] # echo 2 > /proc/sys/vm/drop_caches
[root@backup ~] # echo 3 > /proc/sys/vm/drop_caches
[root@backup ~] # sync
 
发如今执行了上面第三条命令后,内存才真正被释放出来了,其余命令都没有起到效果。
***************当你发现本身的才华撑不起野心时,就请安静下来学习吧***************
相关文章
相关标签/搜索