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

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


2)查看缓存区及内存使用状况算法

[root@localhost ~] # free -m
        total      used       free    shared   buffers    cached
Mem:       7866       7725      141      19     74        6897
-/+ buffers /cache :       752       7113
Swap:      16382      32      16350


从上面的命令结果显示中能够看出:内存总共8G,已使用7725M,剩余141M,很多的人都是这么看的。缓存

但其实这样并不能做为实际的使用率。由于有了缓存机制,具体算法以下:
空闲内存=free(141)+buffers(74)+cached(6897)
已用内存=total(7866)-空闲内存
由此算出空闲内存是7112M,已用内存754M,这才是真正的使用率,也可参考-/+ buffers/cache这行信息也是内存正确使用率。bash


3)缓存区分buffers和cached区别
内核在保证系统能正常使用物理内存和数据量读写状况下来分配缓冲区大小。
buffers用来缓存metadata及pages,能够理解为系统缓存,例如,vi打开一个文件。
cached是用来给文件作缓存,能够理解为数据块缓存,例如,dd if=/dev/zero of=/tmp/test count=1 bs=1G 测试写入一个文件,就会被缓存到缓冲区中,当下一次再执行这个测试命令时,写入速度会明显很快。ide


4)Swap用途
Swap意思是交换分区,一般咱们说的虚拟内存,是从硬盘中划分出的一个分区。当物理内存不够用的时候,内核就会释放缓存区(buffers/cache)里一些长时间不用的程序,而后将这些程序临时放到Swap中,也就是说若是物理内存和缓存区内存不够用的时候,才会用到Swap。性能


swap清理:
swapoff -a && swapon -a
注意:这样清理有个前提条件,空闲的内存必须比已经使用的swap空间大测试


5)释放缓存区内存的方法
    a)清理pagecache(页面缓存)spa

# echo 1 > /proc/sys/vm/drop_caches     或者 # sysctl -w vm.drop_caches=1code


  b)清理dentries(目录缓存)和inodes

orm

# echo 2 > /proc/sys/vm/drop_caches     或者 # sysctl -w vm.drop_caches=2


  c)清理pagecache、dentries和inodes

# 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)对象和它们占用的内存

# sync



vfs_cache_pressure=100    这个是默认值,内核会尝试从新声明dentries和inodes,并采用一种相对于页面缓存和交换缓存比较”合理”的比例。--------------------友情提示一下----------------------
上面操做在大多数状况下都不会对系统形成伤害,只会有助于释放不用的内存。
可是若是在执行这些操做时正在写数据,那么实际上在数据到达磁盘以前就将它从文件缓存中清除掉了,这可能会形成很很差的影响。那么若是避免这种事情发生呢?
所以,这里不得不提一下/proc/sys/vm/vfs_cache_pressure这个文件,告诉内核,当清理inoe/dentry缓存时应该用什么样的优先级。

减小vfs_cache_pressure的值,会致使内核倾向于保留dentry和inode缓存。
增长vfs_cache_pressure的值,(即超过100时),则会致使内核倾向于从新声明dentries和inodes

 


总之,vfs_cache_pressure的值:
小于100的值不会致使缓存的大量减小
超过100的值则会告诉内核你但愿以高优先级来清理缓存。
 
其实不管vfs_cache_pressure的值采用什么值,内核清理缓存的速度都是比较低的。
若是将此值设置为10000,系统将会将缓存减小到一个合理的水平。
相关文章
相关标签/搜索