诺亚方舟

沉淀

高并发nginx两个减少磁盘io的策略

一,关闭atime记录

系统每次对文件进行一次系统调用(open(),read(),write()等操作),就会更新文件的atime进行记录,这样子在高并发环境下对磁盘的负载是很高的,因为实际上atime并没什么作用。关闭方法:

 

1
mount -o remount,noatime /dev/sda1

如果不想关闭整个文件系统,而只是想关闭某些文件或目录,可以用chattr来完成。

 

1
chattr -R +A /data/web/wap/

除了noatime选项,nodiratime可以针对目录禁止atime更新,这样ls命令就不会更新目录的atime值了。

二,调节page cache

在 Linux 的内核中,对文件的读写提供一个页面缓冲的机制(Page Cache)。Page Cache 存在于内存中,当要读取一个磁盘文件的内容时,内核首先在 Page Cache 中进行查找,如果要读取的内容已经存在 Page Cache 中,则无需在对磁盘发起实际的读操作。同样在需要写文件时,写操作也只是将内容存放于 Page Cache 中,而 Page Cache 中的更改内容由内核进程 pdflush 周期性的写回磁盘。在默认情况下,pdflush 进程每 5 秒钟醒来一次,进行数据写回操作。这个写回时间值定义在参数 /proc/sys/vm/dirty_writeback_centisecs中。如果在这 5 秒钟之间,发生电源故障或者系统崩溃,可能会引起数据丢失。如果用户的电源供应比较可靠,或者丢数据丢失的风险不是非常在意,可以适当的提高这个数据写回时间。使用如下命令查看系统当前的写回时间值:

1
2
 cat /proc/sys/vm/dirty_writeback_centisecs 
 500

此时间值的单位为 1/100 秒。使用如下命令可以更改此值:

1
 echo 2000 > /proc/sys/vm/dirty_writeback_centisecs

这样,就可以使 pdflush 进程 20 秒才醒来一次,从而减少对磁盘的访问频率。

还有一个参数 /proc/sys/vm/dirty_expire_centisecs控制一个更改过的页面经过多长时间后被认为是过期的、必须被写回的页面,其默认值是 3000(单位也是 1/100 秒)。用户也可以适当的增加此值,使页面更长时间的驻留在内存中。如下命令:

1
 echo 4000 > /proc/sys/vm/dirty_expire_centisecs

pdflush 进程处理的另一种情况是当可用内存量降低的时候,会将一些缓冲页面写回磁盘,释放内存。这个行为是受/proc/sys/vm/dirty_background_ratio参数控制的,此参数的默认值为 10,意思是当所有被更改页面总大小占工作内存超过 10% 时,pdflush 会开始写回工作。用户可以增加这个比例,以增加页面驻留在内存的时间。此参数的更改方法同上面两个参数。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

您可以使用这些HTML标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>