Linux 释放cache化缓存

Linux 释放cache化缓存


原文  https://blog.csdn.net/tomspcc/article/details/78131468node


机械硬盘的读写速率大多在 70M/s 左右,若是把常常读写的文件放在内存中,这会大幅提升文件的读写速率,提升系统的效率。尤为是访问量大的网站,这样解决了磁盘IO的问题
不过如今都是固态硬盘,常见的读写速率是 0.5G/s ~ 1 G/s ~ 3.5G/s 或者更高,不过这速度在内存的速度上仍是很逊色的,听说DDR3,内存数据带宽就=12.8GB/s

对于我的使用的小内存VPS,cache内存持久占用太高,仍是影响速度的linux

swap分区的做用:
Linux内核为了提升读写效率与速率,会将文件在内存中进行缓存,这部份内存就是Cache Memory(缓存内存)。即便你的程序运行结束后,Cache Memory也不会自动释放。这就会致使你在Linux系统中程序频繁读写文件后,你会发现可用物理内存变少。当系统的物理内存不够用的时候,就须要将物理内存中的一部分空间释放出来,以供当前运行的程序使用。那些被释放的空间可能来自一些很长时间没有什么操做的程序,这些被释放的空间被临时保存到Swap空间中,等到那些程序要运行时,再从Swap分区中恢复保存的数据到内存中。这样,系统老是在物理内存不够时,才进行Swap交换。因此swap分区不被占用或者占用不多,说明如今系统内存够用,运行还算良好,不会影响系统运行。
首先,当物理内存不足以支撑系统和应用程序(进程)的运做时,这个Swap交换分区能够用做临时存放使用率不高的内存分页,把腾出的内存交给急需的应用程序(进程)使用。有点相似机房的UPS系统,虽然正常状况下不须要使用,可是异常状况下, Swap交换分区仍是会发挥其关键做用。
其次,即便你的服务器拥有足够多的物理内存,也有一些程序会在它们初始化时残留的极少再用到的内存分页内容转移到 swap 空间,以此让出物理内存空间。对于有发生内存泄漏概率的应用程序(进程),Swap交换分区更是重要,由于谁也不想看到因为物理内存不足致使系统崩溃。
最后,如今不少我的用户在使用Linux,有些甚至是PC的虚拟机上跑Linux系统,此时可能经常使用到休眠(Hibernate),这种状况下也是推荐划分Swap交换分区的。
其实少许使用Swap交换空间是不会影响性能,只有当RAM资源出现瓶颈或者内存泄露,进程异常时致使频繁、大量使用交换分区才会致使严重性能问题。另外使用Swap交换分区频繁,还会引发kswapd0进程(虚拟内存管理中, 负责换页的)耗用大量CPU资源,致使CPU飙升。

buffers和cache的区别:
为了提升磁盘存取效率, Linux作了一些精心的设计, 除了对dentry进行缓存(用于VFS,加速文件路径名到inode的转换),还采起了两种主要Cache方式:Buffer Cache和Page Cache。前者针对磁盘块的读写,后者针对文件inode的读写。这些Cache有效缩短了I/O系统调用(好比read,write,getdents)的时间。
磁盘的操做有逻辑级(文件系统)和物理级(磁盘块),这两种Cache就是分别缓存逻辑和物理级数据的。
Page cache其实是针对文件系统的,是文件的缓存,在文件层面上的数据会缓存到page cache。文件的逻辑层须要映射到实际的物理磁盘,这种映射关系由文件系统来完成。当page cache的数据须要刷新时,page cache中的数据交给buffer cache,由于Buffer Cache就是缓存磁盘块的。可是这种处理在2.6版本的内核以后就变的很简单了,没有真正意义上的cache操做。
Buffer cache是针对磁盘块的缓存,也就是在没有文件系统的状况下,直接对磁盘进行操做的数据会缓存到buffer cache中,例如,文件系统的元数据都会缓存到buffer cache中。

Buffer:缓冲区,一个用于存储速率不一样步的设备或优先级不一样的设备之间传输数据的区域。经过缓冲区,可使进程之间的相互等待变少,从而使从速率慢的设备读入数据时,速率快的设备的操做进程不发生间断。
缓冲(buffers)是根据磁盘的读写设计的,把分散的写操做集中进行,减小磁盘碎片和硬盘的反复寻道,从而提升系统性能。linux有一个守护进程定 期清空缓冲内容(即写如磁盘),也能够经过sync命令手动清空缓冲。
简单说来,page cache用来缓存文件数据,buffer cache用来缓存磁盘数据。在有文件系统的状况下,对文件操做,那么数据会缓存到page cache,若是直接采用dd等工具对磁盘进行读写,那么数据会缓存到buffer cache。
因此咱们看linux,只要不用swap的交换空间,就不用担忧本身的内存太少.若是经常swap用不少,可能你就要考虑加物理内存了.这也是linux看内存是否够用的标准.

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。
若是 cache 的值很大,说明cache住的文件数不少。若是频繁访问到的文件都能被cache住,那么磁盘的读IO bi会很是小。
缓存(cached)是把读取过的数据保存起来,从新读取时若命中(找到须要的数据)就不要去读硬盘了,若没有命中就读硬盘。其中的数据会根据读取频率进行组织,把最频繁读取的内容放在最容易找到的位置,把再也不读的内容不断日后排,直至从中删除。

手工释放内存区缓存(原本cache就是为了提高系统性能,缓解磁盘的压力,是linux区别于windows的优点所在,若是真有必要可手工释放一下,也不要永久的的让cache做用没法发挥)
# sync; echo 1 > /proc/sys/vm/drop_caches  #释放 pagecache
# sync; echo 2 > /proc/sys/vm/drop_caches    #释放  dentries 和 inodes:
# sync; echo 3 > /proc/sys/vm/drop_caches  #释放 pagecache,dentries 和 inodes:
# sync; echo 0 > /proc/sys/vm/drop_caches  #默认0为不释放,让系统本身调节

操做前要使用sync,强制将内存中内容写入硬盘,包含已修改的 i-node、已延迟的块 I/O 和读写映射文件。这一步是确保第二步的安全性。防止数据或操做丢失。

linux内核2.6的版本执行上述的操做都没问题的,可是到了内核3系列,就不能执行echo 0 >/proc/sys/vm/drop_caches的操做了,这是一个坑,重启才能改回去

# echo 0 >/proc/sys/vm/drop_caches
-bash: echo: write error: Invalid argument
# sysctl -a|grep vm.drop_caches  #内核中有这个参数
vm.drop_caches = 3
# sysctl -w vm.drop_caches=0  #也写不进去,这个在内核2.6系列上面能够的,这也是手工释放内存缓存的另外一种形式(sysctl -w vm.drop_caches=3)
error: "Invalid argument" setting key "vm.drop_caches"
# sysctl -w vm.drop_caches=1  #执行其余的是没问题的,可是就是执行0的插入不能够,要重启服务器。
vm.drop_caches = 1

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

上述只是暂时生效,可是系统重启后,系统仍是按照本身默认的方法去使用缓存,有的网友会写定时任务脚本晚上去释放一下内存cache,还有一种暴力的永久生效的方法,使cache的做用基本没法发挥。

修改/etc/sysctl.conf 添加以下选项后就不会内存持续增长(这些配置摘抄自网上,未作测试,只是记录一下)
vm.dirty_ratio = 1
vm.dirty_background_ratio = 1
vm.dirty_writeback_centisecs = 2
vm.dirty_expire_centisecs = 3
vm.drop_caches = 3
vm.swappiness = 100
vm.vfs_cache_pressure = 163
vm.overcommit_memory = 2
vm.lowmem_reserve_ratio = 32 32 8
kernel.maxvnodes = 3

#下面是相关解释:
/proc/sys/vm/dirty_ratio
这个参数控制文件系统的文件系统写缓冲区的大小,单位是百分比,表示系统内存的百分比,表示当写缓冲使用到系统内存多少的时候,开始向磁盘写出数据。增大之会使用更多系统内存用于磁盘写缓冲,也能够极大提升系统的写性能。可是,当你须要持续、恒定的写入场合时,应该下降其数值,通常启动上缺省是 10。设1加速程序速率

/proc/sys/vm/dirty_background_ratio
这个参数控制文件系统的pdflush进程,在什么时候刷新磁盘。单位是百分比,表示系统内存的百分比,意思是当写缓冲使用到系统内存多少的时候,pdflush开始向磁盘写出数据。增大之会使用更多系统内存用于磁盘写缓冲,也能够极大提升系统的写性能。可是,当你须要持续、恒定的写入场合时,应该下降其数值,通常启动上缺省是 5

/proc/sys/vm/dirty_writeback_centisecs
这个参数控制内核的脏数据刷新进程pdflush的运行间隔。单位是 1/100 秒。缺省数值是500,也就是 5 秒。若是你的系统是持续地写入动做,那么实际上仍是下降这个数值比较好,这样能够把尖峰的写操做削平成屡次写操


/proc/sys/vm/dirty_expire_centisecswindows

这个参数声明Linux内核写缓冲区里面的数据多“旧”了以后,pdflush进程就开始考虑写到磁盘中去。单位是 1/100秒。缺省是 30000,也就是 30秒的数据就算旧了,将会刷新磁盘。对于特别重载的写操做来讲,这个值适当缩小也是好的,但也不能缩小太多,由于缩小太多也会致使IO提升太快。建议设置为 1500,也就是15秒算旧。

/proc/sys/vm/drop_caches
释放已经使用的cache

/proc/sys/vm/page-cluster
该文件表示在写一次到swap区的时候写入的页面数量,0表示1页,1表示2页,2表示4页。

/proc/sys/vm/swapiness
该文件表示系统进行交换行为的程度,数值(0-100)越高,越可能发生磁盘交换。

/proc/sys/vm/vfs_cache_pressure

该文件表示内核回收用于directory和inode cache内存的倾向api

相关文章
相关标签/搜索