咱们在磁盘写操做持续繁忙的服务器上曾经碰到一 个特殊的性能问题。每隔 30 秒,服务器就会遇到磁盘写活动高峰,致使请求处理延迟很是大(超过3秒)。后来上网查了一下资料,经过调整内核参数,将写活动的高峰分布成频繁的屡次写, 每次写入的数据比较少。这样能够把尖峰的写操做削平成屡次写操做。以这种方式执行的效率比较低,由于内核不太有机会组合写操做。但对于繁忙的服务器,写操 做将更一致地进行,并将极大地改进交互式性能。
下面是相关参数的调整:node
1、2.6内核下数据库
一、/proc/sys/vm/dirty_ratio
这个参数控制文件系统的文件系统写缓冲区的大小,单位是百分比,表示系统内存的百分比,表示当写缓冲使用到系统内存多少的时候,开始向磁盘写出数据。增大 之会使用更多系统内存用于磁盘写缓冲,也能够极大提升系统的写性能。可是,当你须要持续、恒定的写入场合时,应该下降其数值,:
echo '1' > /proc/sys/vm/dirty_ratio api
二、/proc/sys/vm/dirty_background_ratio
这个参数控制文件系统的pdflush进程,在什么时候刷新磁盘。单位是百分比,表示系统内存的百分比,意思是当写缓冲使用到系统内存多少的时 候,pdflush开始向磁盘写出数据。增大之会使用更多系统内存用于磁盘写缓冲,也能够极大提升系统的写性能。可是,当你须要持续、恒定的写入场合时, 应该下降其数值,:
echo '1' > /proc/sys/vm/dirty_background_ratio服务器
三、/proc/sys/vm/dirty_writeback_centisecs
这个参数控制内核的脏数据刷新进程pdflush的运行间隔。单位是 1/100 秒。缺省数值是500,也就是 5 秒。若是你的系统是持续地写入动做,那么实际上仍是下降这个数值比较好,这样能够把尖峰的写操做削平成屡次写操做。设置方法以下:
echo "100" > /proc/sys/vm/dirty_writeback_centisecs 若是你的系统是短时间地尖峰式的写操做,而且写入数据不大(几十M/次)且内存有比较多富裕,那么应该增大此数值:
echo "1000" > /proc/sys/vm/dirty_writeback_centisecs性能
四、/proc/sys/vm/dirty_expire_centisecs
这个参数声明Linux内核写缓冲区里面的数据多“旧”了以后,pdflush进程就开始考虑写到磁盘中去。单位是 1/100秒。缺省是 30000,也就是 30 秒的数据就算旧了,将会刷新磁盘。对于特别重载的写操做来讲,这个值适当缩小也是好的,但也不能缩小太多,由于缩小太多也会致使IO提升太快。
echo "100" > /proc/sys/vm/dirty_expire_centisecs
固然,若是你的系统内存比较大,而且写入模式是间歇式的,而且每次写入的数据不大(好比几十M),那么这个值仍是大些的好。线程
五、/proc/sys/vm/vfs_cache_pressure
该文件表示内核回收用于directory和inode cache内存的倾向;缺省值100表示内核将根据pagecache和swapcache,把directory和inode cache保持在一个合理的百分比;下降该值低于100,将致使内核倾向于保留directory和inode cache;增长该值超过100,将致使内核倾向于回收directory和inode cache
缺省设置:100 进程
六、/proc/sys/vm/min_free_kbytes
该文件表示强制Linux VM最低保留多少空闲内存(Kbytes)。 缺省设置:724(512M物理内存) 内存
七、/proc/sys/vm/nr_pdflush_threads
该文件表示当前正在运行的pdflush进程数量,在I/O负载高的状况下,内核会自动增长更多的pdflush进程。
缺省设置:2(只读) it
八、/proc/sys/vm/overcommit_memory
该文件指定了内核针对内存分配的策略,其值能够是0、一、2。
0, 表示内核将检查是否有足够的可用内存供应用进程使用;若是有足够的可用内存,内存申请容许;不然,内存申请失败,并把错误返回给应用进程。
1, 表示内核容许分配全部的物理内存,而无论当前的内存状态如何。
2, 表示内核容许分配超过全部物理内存和交换空间总和的内存(参照overcommit_ratio)。
缺省设置:0io
九、/proc/sys/vm/overcommit_ratio
该文件表示,若是overcommit_memory=2,能够过载内存的百分比,经过如下公式来计算系统总体可用内存。
系统可分配内存=交换空间+物理内存*overcommit_ratio/100 缺省设置:50(%)
十、/proc/sys/vm/page-cluster
该文件表示在写一次到swap区的时候写入的页面数量,0表示1页,1表示2页,2表示4页。 缺省设置:3(2的3次方,8页)
十一、/proc/sys/vm/swapiness
该文件表示系统进行交换行为的程度,数值(0-100)越高,越可能发生磁盘交换。
五.总结
1.经过这四个参数,能够控制脏数据在内存中占用多大比例写入磁盘文件系统;
2.脏数据在内存中最多能够存在多长时间,超过这个时间就写入磁盘;
3.单个任务在内存中的脏数据所占内存比例多大则写入磁盘;
4.pdflush内核线程执行的频率。
六.注意
1. 区分 dirty_background_ratio 与 dirty_ratio 的不一样 。
2. 数据库系统 ORACLE 和 MySQL的性能调优不少都是基于OS层面的。即便数据库进行调优,具体参数还得受限于OS。由于RDBMS 安装在 OS上。
七.经过下面命令查看这四个参数
find /proc/sys/vm -name dirty* -print | while read name; do echo $name ;cat ${name}; done
例如:
[root@localhost Desktop]# find /proc/sys/vm -name dirty* -print | while read name; do echo $name ;cat ${name}; done
/proc/sys/vm/dirty_expire_centisecs
2999
/proc/sys/vm/dirty_writeback_centisecs
499
/proc/sys/vm/dirty_ratio
40
/proc/sys/vm/dirty_background_ratio
10
[root@localhost Desktop]#
八.调整方法
1.(法一) vi /etc/sysctl.conf
而后修改便可好比
vm.dirty_ratio = 30
sysctl -p 生效(重启有效)
2.(法二) echo 30 > /proc/sys/vm/dirty_ratio
echo 30 > /proc/sys/vm/dirty_ratio
这种方法重启无效