dirty_background_ration 与 /proc/sys/vm/dirty_ratio

wappiness的值的大小对如何使用swap分区是有着很大的联系的。swappiness=0的时候表示最大限度使用物理内存,而后才是 swap空间,swappiness=100的时候表示积极的使用swap分区,而且把内存上的数据及时的搬运到swap空间里面。linux的基本默认设置为60,具体以下:php

[root@timeserver ~]# cat /proc/sys/vm/swappiness
60linux

你的内存在使用到100-60=40%的时候,就开始出现有交换分区的使用,内存的速度会比磁盘快不少,这样会加大系统io,同时造的成大量页的换进换出,严重影响系统的性能,因此咱们在操做系统层面,要尽量使用内存,对该参数进行调整。数据库

 

临时调整的方法以下,咱们调成10:
[root@timeserver ~]# sysctl vm.swappiness=10
vm.swappiness = 10
[root@timeserver ~]# cat /proc/sys/vm/swappiness
10

缓存

须要在/etc/sysctl.conf修改,加上:
[root@timeserver ~]# cat /etc/sysctl.conf安全

# Controls the maximum number of shared memory segments, in pages
kernel.shmall = 4294967296
vm.swappiness=10服务器


从新加载app

[root@localhot~]# sysctl -p异步

在linux中,能够经过修改swappiness内核参数,下降系统对swap的使用,从而提升系统的性能。性能

 

在调优数据库 和应用 性能的过程当中须要下降操做系统文件Cache对数据库性能的影响,故调研了一些下降文件系统缓存大小的方法,其中一种是经过修改/proc/sys/vm/dirty_background_ration以及/proc/sys/vm/dirty_ratio两个参数的大小来实现。看了很多相关博文的介绍,不过一直弄不清楚这两个参数的区别在哪里,后来看了下面的一篇英文博客才大体了解了它们的不一样。spa

vm.dirty_background_ratio:这个参数指定了当文件系统缓存脏页数量达到系统内存百分之多少时(如5%)就会触发pdflush/flush/kdmflush等后台回写进程运行,将必定缓存的脏页异步地刷入外存;
 
vm.dirty_ratio:而这个参数则指定了当文件系统缓存脏页数量达到系统内存百分之多少时(如10%),系统不得不开始处理缓存脏页(由于此时脏页数量已经比较多,为了不数据丢失须要将必定脏页刷入外存);在此过程当中不少应用进程可能会由于系统转而处理文件IO而阻塞。
 
以前一直错误的一位dirty_ratio的触发条件不可能达到,由于每次确定会先达到vm.dirty_background_ratio的条件,后来才知道本身理解错了。确实是先达到vm.dirty_background_ratio的条件而后触发flush进程进行异步的回写操做,可是这一过程当中应用进程仍然能够进行写操做,若是多个应用进程写入的量大于flush进程刷出的量那天然会达到vm.dirty_ratio这个参数所设定的坎,此时操做系统会转入同步地处理脏页的过程,阻塞应用进程
 
 
 

关于vm.swappiness 参数设定, 文件缓存是一项重要的性能改进,在大多数状况下,读缓存是一个明显的胜利,与使用RAM的应用程序直接平衡。写缓存比较棘手。Linux内核将磁盘写入缓存,并随着时间的推移异步将它们刷新到磁盘。这对加速磁盘I / O有很好的效果,但风险很大。当数据未写入磁盘时,丢失数据的可能性会增长。

也有不少I / O也有可能压倒缓存。曾经一次将大量数据写入磁盘,而且在尝试处理全部数据时看到系统出现大量暂停?这些暂停是缓存决定异步写入太多数据的结果(做为非阻塞后台操做,让应用程序进程继续),并切换到同步写入(阻塞并使进程等到I / O致力于磁盘)。固然,文件系统也必须保留写入顺序,所以当它开始同步写入时,它首先必须降级缓存。所以长时间停顿。

好处是这些是可控制的选项,根据您的工做负载和数据,您能够决定如何设置它们。让咱们来看看:

$ sysctl -a | grep dirty 
vm.dirty_background_ratio = 10
vm.dirty_background_bytes = 0
vm.dirty_ratio = 20
vm.dirty_bytes = 0
vm.dirty_writeback_centisecs = 500
vm.dirty_expire_centisecs = 300

vm.dirty_background_ratio
 是能够填充“脏”页面的系统内存的百分比 - 仍然须要写入磁盘的内存页 - 在pdflush / flush / kdmflush后台进程启动以将其写入磁盘以前。个人例子是10%,因此若是虚拟服务器有32 GB的内存,那么3.2 GB的数据能够在完成任务以前就位于RAM中。

vm.dirty_ratio 是在必须将全部内容提交到磁盘以前能够用脏页填充的绝对最大系统内存量。当系统到达此点时,全部新的I / O块都会被阻塞,直到脏页被写入磁盘。这一般是长I / O暂停的来源,可是能够防止太多数据在内存中被不安全地缓存。

vm.dirty_background_bytes 和  vm.dirty_bytes 是另外一种指定这些参数的方法。若是设置_bytes版本,则_ratio版本将变为0,反之亦然。

vm.dirty_expire_centisecs 是在须要写入以前缓存中的某些内容。在这种状况下,它是30秒。当pdflush / flush / kdmflush进程启动时,他们将检查脏页的年龄,若是它比这个值旧,它将被异步写入磁盘。因为在内存中保存脏页不安全,所以也能够防止数据丢失。

vm.dirty_writeback_centisecs 是pdflush / flush / kdmflush进程唤醒的频率,并检查是否须要完成工做。

您还能够在/ proc / vmstat中查看页面缓存的统计信息:

$ cat /proc/vmstat | egrep "dirty|writeback" 
nr_dirty 878
nr_writeback 0
nr_writeback_temp 0

 

在个人状况下,我有878个脏页等待写入磁盘。

方法1:减小缓存

与计算机世界中的大多数事情同样,您如何调整这些取决于您要作的事情。在许多状况下,咱们的快速磁盘子系统都有本身的大电池备份NVRAM缓存,所以保留OS页面缓存中的内容是有风险的。让咱们尝试以更及时的方式将I / O发送到阵列,并减小咱们本地操做系统的机会,借用服务行业中的短语,“ 在杂草中”。为此,咱们下降vm.dirty_background_ratio和vm .dirty_ratio经过向/etc/sysctl.conf添加新数字并使用“sysctl -p”从新加载:

vm.dirty_background_ratio = 5 
vm.dirty_ratio = 10

 

这是虚拟机以及基于Linux的虚拟机管理程序的典型方法。 我不建议将这些参数设置为零,由于一些后台I / O能够很好地将应用程序性能与磁盘阵列和SAN上的短期延迟(“尖峰”)分离。

方法2:增长缓存

有些状况下,提升缓存会对性能产生积极影响。这些状况是Linux guest虚拟机中包含的数据并不重要且可能丢失的状况,一般是应用程序反复写入或以可重复的突发形式写入相同文件的状况。理论上,经过容许更多脏页存在于内存中,您将在缓存中反复重写相同的块,而且只须要常常对实际磁盘进行一次写入。为此,咱们提出参数:

vm.dirty_background_ratio = 50 
vm.dirty_ratio = 80

 

有时人们也会增长vm.dirty_expire_centisecs参数以容许更多时间在缓存中。除了数据丢失风险增长以外,若是缓存已满而且须要降级,您还会面临长时间I / O暂停的风险,由于在大型VM上,缓存中会有大量数据。

方法3:两种方式

还有一些状况下,系统必须处理不频繁的突发流量以减慢磁盘(一小时以前的批处理做业,午夜,写入Raspberry Pi上的SD卡等)。在这种状况下,一种方法多是容许全部写入I / O都存放在缓存中,以便后台刷新操做能够随时间异步处理它:

vm.dirty_background_ratio = 5 
vm.dirty_ratio = 80

 

这里后台进程将在达到5%上限时当即开始写入,但系统不会强制同步I / O直到达到80%满。从那里你能够调整系统RAM和vm.dirty_ratio的大小,以便可以使用全部写入的数据。一样,在磁盘上存在数据一致性的权衡,这转化为数据风险。购买UPS并确保在UPS电量耗尽以前能够降级缓存。:)

相关文章
相关标签/搜索