说明:IO调优,对IO操作较频繁的服务效果比较明显,比如说数据库类型(mysql,oracle)。


1. pdflush刷新脏数据条件


cached中的脏数据满足如下几个条件中一个或者多个的时候就会被pdflush刷新到磁盘:

(1)数据存在的时间超过了dirty_expire_centisecs(默认30s)时间

(2)脏数据所占内存 /(MemFree + Cached - Mapped) > dirty_background_ratio。也就是说当脏数据所占用的内存占(MemFree + Cached - Mapped)内存的内存的比例超过dirty_background_ratio的时候会触发pdflush刷新脏数据。

   可以看出这两个参数是有联系的。比如把dirty_expire_centisecss设置较小,那么pdflush就会刷新脏数据的频率就会增加,这样就会使得脏数据所占总内存的比例不会达到dirty_background_ratio,从而使得dirty_background_ratio参数没有什么作用。相反,如果dirty_background_ratio参数设置很小同时dirty_expire_centisecs设置较大,可能在达到过期时间之前脏数据就被pdflush刷新到磁盘中。


2. 参数调优


如果系统的cached中脏数据量很大,会产生两个问题:

(1)缓存的数据越多,丢数据的风险越大。

(2)会定期出现IO峰值,这个峰值时间会较长,在这期间所有新的写IO性能会很差(极端情况直接被hang住)。

后一个问题对写负载很高的应用会产生很大影响。


如何调节内核IO参数来优化IO写性能?

(1)首先调优dirty_background_ratio(默认为10%)

    把这个参数适当调小,这样可以使得cached主的脏数据减少,把原来一个大的IO刷新操作变为多个小的IO刷新操作,从而把IO写峰值削平。对于cached很大或者磁盘很慢的场景,应该把这个值设置的小一点。调节方法:echo 5 > /proc/sys/vm/dirty_background_ratio 把这个百分比更新为5% (注意这里所占的百分比是针对于:MemFree + Cached - Mapped而言的,并不是相对于MemTotal)


(2)第二步调节dirty_ratio参数(默认为20%)

    把这个参数适当调小,原理通(1)类似。如果cached的脏数据所占比例(这里是占MemTotal的比例)超过这个设置,系统会停止所有的应用层的IO写操作,等待刷完数据后恢复IO。所以万一触发了系统的这个操作,对于用户来说影响非常大的。


(3)第三步调节dirty_expire_centisecs参数(默认3000,即30s)(这个参数表示page cache中的数据多久标记为脏)

    这个参数调节可能意义不大。调小这个参数并不保证可以很快的把脏数据刷新下去,因为这里会有个IO拥塞问题。如果在一个dirty_expire_centisecs周期内没有刷完脏数据就会导致这个参数失效了。理想情况我们希望一个dirty_expire_centisecs刷完脏数据,但如果cached的脏数据较多或者磁盘较慢的时候就会导致IO拥塞问题。一般使用默认值就好。


(4)第四步调节dirty_writeback_centisecs参数(默认500,即5s)(这个参数调节pdflush被唤醒的频率,即控制每隔多久把内存里的脏数据往磁盘里刷)

    理论上调小这个参数,可以提高pdflush工作频率,从而尽快把脏数据刷新到磁盘上。但是这一样会遇到第三步IO拥塞问题。所以这个参数效果也不尽如人意。一般使用默认值就好。


3. Swapping调优


    swap空间是一块磁盘空间,操作系统使用这块空间保存从内存中换出的操作系统不常用page数据,这样可以分配出更多的内存做page cache。这样通常会提升系统的吞吐量和IO性能,但同样会产生很多问题。页面频繁换入换出会产生IO读写、操作系统中断,这些都很影响系统的性能。这个值越大操作系统就会更加积极的使用swap空间。


查看与调节swappiness方法如下:

cat /proc/sys/vm/swappiness 

查看这个参数的配置(默认值是60),也就是说,你的内存在使用到100-60=40%的时候,就开始出现有交换分区的使用。大家知道,内存的速度会比磁盘快很多,这样子会加大系统io,同时造的成大量页的换进换出,严重影响系统的性能,所以我们在操作系统层面,要尽可能使用内存,对该参数进行调整。


临时调整的方法:

echo 0 > /proc/sys/vm/swappiness 禁止操作系统使用任何的swap空间

echo 100 > /proc/sys/vm/swappiness 操作系统会尽量使用swap空间

或者

sysctl vm.swappiness=10


永久调整的方法:

echo 'vm.swappiness=10' >> /etc/sysctl.conf && sysctl -p



swappiness设置一个适当值对于系统性能也会有明显的影响。

swappiness很小时,系统能并发的进程或者线程就会减少,但每个进程或者线程运行的速度较快,cpu利用率较好。

swappiness很大时,系统并发好,但每个进程或者线程速度较慢。较多IO读写和系统中断会消耗很多cpu资源,此时系统效率较低。

所以如果希望提高服务器的并发量,对服务的相应时间要求不很高的场景可以适当的把swappiness调节的高些。对于并发量不大但希望相应时间小的应用场景可以适当的调小这个参数,比如个人电脑可以直接禁掉swap。