记一次服务器IO过高处理过程

  • Post author:
  • Post category:其他



记一次服务器


IO


过高处理过程


一、背景


在一次上线升级后,发现两台

tomcat

服务器的

IOwait

一直超过

100ms

,高峰时甚至超过

300ms

,检查服务器发现

CPU

负载,内存的使用率都不高。问题可能出现在硬盘读写,而且那块硬盘除了写日志外,没有其他的

IO

操作。最后发现是应用打印的日志信息太多,导致磁盘

IO

负载过高。


二、寻求解决过程


通过查找资料发现,

Linux

是用

pdflush

进程把数据从缓存页写入硬盘的,那么通过修改

pdflush

的一些参数应该可以改善

IO

负载问题。

pdflush

的行为受

/proc/sys/vm

中的参数的控制

pdflush

写入硬盘看两个参数:

1

数据在页缓存中是否超出

30

秒,如果是,标记为脏页缓存,写入磁盘

;

2

脏页缓存是否达到工作内存的

10%;

pdflush

的第一件事是读取

/proc/sys/vm/dirty_expire_centiseconds(default 3000)


声明

Linux

内核写缓冲区里面的数据多“旧”了之后,

pdflush

进程就开始考虑写到磁盘中去。单位是

1/100

秒。缺省是

30000

,也就是

30

秒的数据就算旧了,将会刷新磁盘。对于特别重载的写操作来说,这个值适当缩小也是好的,但也不能缩小太多,因为缩小太多也会导致

IO

提高太快。


当然,如果你的系统内存比较大,并且写入模式是间歇式的,并且每次写入的数据不大(比如几十

M

),那么这个值还是大些的好。


第二件事是判断内存是否到了要写入硬盘的限额,由参数决定:

/proc/sys/vm/dirty_ratio (default 20)


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

/proc/sys/vm/dirty_background_ratio(default 10)


控制文件系统的

pdflush

进程,在何时刷新磁盘。单位是百分比,表示系统内存的百分比,保留过期页缓存(脏页缓存)的最大值。是以

MmeFree+Cached-Mapped

的值为基准的,当超过最大值则缓存页写入磁盘。

pdflush

用于将内存中的内容和文件系统进行同步,比如说

,

当一个文件在内存中进行修改

,pdflush

负责将它写回硬盘。每当内存中的垃圾页(

dirty page

)超过

10%

的时候

,pdflush

就会将这些页面备份回硬盘。增大之会使用更多系统内存用于磁盘写缓冲,也可以极大提高系统的写性能。但是,当你需要持续、恒定的写入场合时,应该降低其数值:

/proc/sys/vm/dirty_writeback_centisecs(default 500)


控制内核的脏数据刷新进程

pdflush

的运行间隔。单位是

1/100

秒。缺省数值是

500

,也就是

5

秒。如果你的系统是持续地写入动作,那么实际上还是降低这个数值比较好,这样可以把尖峰的写操作削平成多次写操作。


对于有高度写入操作的系统

dirty_background_ratio:

主要调整参数。如果需要把缓存持续的而不是一下子大量的写入硬盘,降低这个值。

dirty_ratio




第二调整参数。


如果有大量的写操作,为避免

I/O

的长时间等待,可以设置:

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


另外文件系统数据缓冲需要频繁的内存分配。加大保留内存的值能提升系统速度和稳定。小于

8G

的内存,保留内存为

64M

,大于

8G

的设置为

256M

$ echo 65536 >/proc/sys/vm/min_free_kbytes


三、最终解决方案


修改后效果明显的参数:

/proc/sys/vm/dirty_expire_centiseconds (default 3000)


默认是

30

秒,时间有点长,我把它改成

10


echo 1000 >/proc/sys/vm/dirty_expire_centisecs


修改完后,

IOwait

时间立马下降,平均

40ms~50ms

,是原来的

1/3~1/4


困扰已久的

IO

问题得以解决!


以下是我的修改参数完整列表:

echo 5 > /proc/sys/vm/dirty_ratio
echo 2 >/proc/sys/vm/dirty_background_ratio
echo 100 >/proc/sys/vm/dirty_writeback_centisecs
echo 262144 >/proc/sys/vm/min_free_kbytes
echo 1000 >/proc/sys/vm/dirty_expire_centisecs

转载于:https://blog.51cto.com/12676522/1930316


关闭菜单