环境说明

以下针对linux操作系统,在centos/RHEL 6、centos/RHEL 7上测试有效。

相关参数

和文件系统写缓存策略相关的主要是下面两个参数,其它相关参考可自行谷歌:

/proc/sys/vm/dirty_ratio

文件系统写缓冲区的大小,单位是百分比,表示系统内存的百分比,表示当写缓冲使用到系统内存多少的时候,开始向磁盘写出数据。增大之会使用更多系统内存用于磁盘写缓冲,也可以极大提高系统的写性能。但是,当需要持续、恒定的写入时,应该降低其数值。

/proc/sys/vm/dirty_background_ratio

控制 pdflush 进程在何时刷新磁盘。单位是百分比,表示系统内存的百分比,意思是当写缓冲使用到系统内存多少的时候, pdflush 开始向磁盘写出数据。增大之会使用更多系统内存用于磁盘写缓冲,也可以极大提高系统的写性能。但是,当需要持续、恒定的写入场合时,应该降低其数值。

对比说明

vm.dirty_background_ratio: 这个参数指定了当文件系统缓存脏页数量达到系统内存百分之多少时(如5%)就会触发pdflush/flush/kdmflush等后台回写进程运行,将一定缓存的脏页异步地刷入外存;

vm.dirty_ratio: 而这个参数则指定了当文件系统缓存脏页数量达到系统内存百分之多少时(如10%),系统不得不开始处理缓存脏页(因为此时脏页数量已经比较多,为了避免数据丢失需要将一定脏页刷入外存);在此过程中很多应用进程可能会因为系统转而处理文件IO而阻塞。

正常都是先达到vm.dirty_background_ratio的条件然后触发flush进程进行异步的回写操作,但是这一过程中应用进程仍然可以进行写操作,如果多个应用进程写入的量大于flush进程刷出的量那自然会达到vm.dirty_ratio这个参数所设定的坎,此时操作系统会转入同步地处理脏页的过程,阻塞应用进程。

也就是说,正常vm.dirty_background_ratio < vm.dirty_ratio才有意义。

在经常有大量写入操作的系统中,应该分别调低这两个参数的值,加快数据刷盘的频率,从而避免因系统同步处理文件IO而导致相关进程处于D状态。

参数修改方法

临时生效方法(重启后失效):

echo 5 >/proc/sys/vm/dirty_background_ratio
echo 10 >/proc/sys/vm/dirty_ratio

或者

sysctl -w vm.dirty_background_ratio=5
sysctl -w vm.dirty_ratio=10

永久生效方法:

echo "vm.dirty_background_ratio = 5" >> /etc/sysctl.conf
echo "vm.dirty_ratio = 10" >> /etc/sysctl.conf
sysctl -p /etc/sysctl.conf

参考:
http://blog.sina.com.cn/s/blog_448574810101k1va.html