linux2.6.37内核接两个硬盘导致读写效率变低的问题
一、问题分析:
通过跟踪定位write系统调用的实现发现,在每次调用a_ops->write_end之后,都会去调用balance_dirty_pages_ratelimited,该函数负责检查当前系统总的脏页数是否超过阀值(ratelimit_pages),如果超过,就会去调用balance_dirty_pages去刷新脏页。ratelimit_pages表示每个cpu脏页的阀值,超过此阀值,balance_dirty_pages_ratelimited函数就会去查看是否需要强制回写脏页。
balance_dirty_pages函数会去读取系统物理内存全局的脏页数目、当前的后备存储器(如磁盘)上的脏页数目,并与其阀值做比较,从而判断是否需要回写脏页,主要的代码如下:
for (;;) {
dirty_exceeded =
(bdi_nr_reclaimable + bdi_nr_writeback > bdi_thresh)
|| (nr_reclaimable + nr_writeback > dirty_thresh);
if (!dirty_exceeded)
break;
if (!bdi->dirty_exceeded)
bdi->dirty_exceeded = 1;
if (bdi_nr_reclaimable > bdi_thresh) {
writeback_inodes_wb(&bdi->wb, &wbc);
pages_written += write_chunk - wbc.nr_to_write;
trace_wbc_balance_dirty_written(&wbc, bdi);
if (pages_written >= write_chunk)
break; /* We've done our duty */
}
__set_current_state(TASK_UNINTERRUPTIBLE);
io_schedule_timeout(pause);
pause <<= 1;
if (pause > HZ / 10)
pause = HZ / 10;
}
bdi_nr_reclaimable:当前后备存储器的脏页数目。
bdi_nr_writeback:当前后备存储器正在回写的脏页数目。
bdi_thresh:当前后备存储区的脏页阀值,超过此阀值就需要回写脏页。
nr_reclaimable:系统全局的脏页数目。
nr_writeback:系统全局的正在回写的脏页数目。
dirty_thresh:系统全局的脏页阀值。
上述代码中dirty_exceeded的计算可能出现下面的这种情况:
nr_reclaimable + nr_writeback > dirty_thresh
bdi_nr_reclaimable + bdi_nr_writeback < bdi_thresh
这种情况下dirty_exceeded=1,此时系统中全局的脏页数目超过阀值,但是当前后备存储器的脏页数目并未超过阀值,此时该函数就会一直在此循环等待,等待后台flush线程定期的回写脏页,直到全局脏页数降低到阀值以下,该函数才会结束循环,而此时write系统调用才会返回,所以就会导致从应用层来看,写硬盘速度变慢。而此时的io_schedule_timeout会被计算到iowait中,所以会出现iowait 100%的情况。
这种做法是很不合理的,内核把所有磁盘的脏页全局对待了,没有严格按照目标磁盘来划分,如果当时系统比较忙,全局的脏页数超过了阀值,所有需要写盘的进程都需要等待,直到脏页的数量降低至阀值以下,这样严重影响了系统写盘的性能。在出现上述情况时,当前磁盘的脏页数目低于阀值,应该立刻返回,根本不用等待脏页回写。
二、解决方法
1、通过调整proc下相关参数
/proc/sys/vm/dirty_ratio
这个参数控制一个进程在文件系统中的文件系统写缓冲区的大小,单位是百分比,表示系统内存的百分比,表示当一个进程中写缓冲使用到系统内存多少的时候,再有磁盘写操作时开始向磁盘写出数据。增大之会使用更多系统内存用于磁盘写缓冲,也可以极大提高系统的写性能。
/proc/sys/vm/dirty_background_ratio
这个参数控制内核的flush进程何时刷新磁盘。单位是百分比,表示系统总内存的百分比,意思是当磁盘的脏数据达到系统内存多少的时候,flush开始把脏数据刷新到磁盘。增大会使用更多系统内存用于磁盘写缓冲,也可以极大提高系统的写性能。
/proc/sys/vm/dirty_writeback_centisecs
这个参数表明内核的flush线程每隔多久被唤醒并执行把脏数据写出到硬盘。单位是 1/100 秒。缺省数值是500,也就是 5秒。如果你的系统是持续地写入动作,那么实际上还是降低这个数值比较好,这样可以把尖峰的写操作削平成多次写操作。
/proc/sys/vm/dirty_expire_centisecs
这个参数声明Linux内核写缓冲区里面的脏数据多久了之后,flush 进程就开始考虑写到磁盘中去。单位是 1/100秒。缺省是30000,也就是 30 秒的数据就算旧了,将会刷新磁盘。对于特别重载的写操作来说,这个值适当缩小也是好的,但也不能缩小太多,因为缩小太多也会导致IO提高太快。
通过调整以上四个值,会提高硬盘的写速度,丢帧的数目也能降到一定的比例,但是始终无法彻底解决该问题。
2、在balance_dirty_pages中使用更加严格的判断机制
由于使用上述判断dirty_exceeded的机制,只要系统中存在多个IO目标设
备(后备存储器),如果1个目标设备性能出现降低,导致脏页回写变慢,就会严重影响到其他目标设备的性能。而实际上,应该把磁盘上的脏页分开来进行处理,只有各自的磁盘上累积的脏页比较多,才需要等待后台刷新,否则就可以直接跳出循环函数,继续写磁盘。而在linux3.2的版本上,应用了更加严格的判断dirty_exceeded的机制,参照高版本内核的修改,修改linux2.6.37的内核:
dirty_exceeded =
(bdi_nr_reclaimable + bdi_nr_writeback > bdi_thresh)
&& (nr_reclaimable + nr_writeback > dirty_thresh);
只有当前系统全局的脏页数超过阀值并且当前的磁盘脏页数目也超过阀值,才认为需要等待脏页的回写,否则,直接退出循环,继续进行后续的写操作。通过这种修改,只有在当前磁盘的脏页数目超过阀值,才会在当前磁盘上等待脏页回写。当系统中有多个后备存储器时,多个后备存储器之间互相不影响,各自管理各自的脏页数目,使系统对脏页的处理更加的合理。
from:http://sunjiangang.blog.chinaunix.net/uid-9543173-id-3571758.html
linux2.6.37内核接两个硬盘导致读写效率变低的问题的更多相关文章
- linux-2.6.26内核中ARM中断实现详解(转)
转载:http://www.cnblogs.com/leaven/archive/2010/08/06/1794293.html 更多文档参见:http://pan.baidu.com/s/1dDvJ ...
- 【内核】linux2.6版本内核编译配置选项(二)
目录 Linux2.6版本内核编译配置选项(一):http://infohacker.blog.51cto.com/6751239/1203633 Linux2.6版本内核编译配置选项(二):http ...
- 【内核】linux2.6版本内核编译配置选项(一)
Linux 2.6.19.x 内核编译配置选项简介 作者:金步国 版权声明 本文作者是一位自由软件爱好者,所以本文虽然不是软件,但是本着 GPL 的精神发布.任何人都可以自由使用.转载.复制和再分发, ...
- Suse环境下编译linux-2.6.24内核
Suse环境下编译linux-2.6.24内核 1.下载linux-2.6.24内核源码: https://mirrors.edge.kernel.org/pub/linux/kernel/v2.6/ ...
- raid5两块硬盘离线怎么办? 强制上线失败如何恢复数据
服务器故障描述: 客户使用Dell 2850服务器组建了raid5磁盘阵列,阵列中包含有6块硬盘(SCSI硬盘,单盘容量300G),服务器操作系统为linux Redhat4:文件系统为ext3文件系 ...
- Raid5两块硬盘掉线可以恢复数据吗_raid数据恢复案例分享
本案例中发生故障的存储类型是HP P2000,虚拟化平台为vmware exsi,共有10块硬盘组成raid5(硬盘容量为1t,其中6号盘是热备盘),由于某些故障导致阵列中两块硬盘亮黄灯掉线,硬盘无法 ...
- 6块300G SCSI RAID5,两块硬盘损坏的数据恢复总结
[用户单位]XXXX网站[数据恢复故障描述]DELL POWEREDGE 2850服务器,内置6块300G SCSI硬盘 ,组成RAID5,安装LINUX REDHAT 4操作系统,存储大量照片,文件 ...
- 成功案例分享:raid5两块硬盘掉线数据丢失恢复方法
1. 故障描述 本案例是HP P2000的存储vmware exsi虚拟化平台,由RAID-5由10块lT硬盘组成,其中6号盘是热备盘,由于故障导致RAID-5磁盘阵列的两块盘掉线,表现为两块硬 ...
- 如何用两块硬盘做磁盘阵列的教程Raid 1
如今,市面上的大部分服务器都自带有阵列卡.只要有两块以上硬盘,我们就可以利用服务器自带的阵列卡做磁盘阵列.Raid 1 为例.Raid 1 是磁盘阵列的其中一个系列,将两块硬盘构成磁盘阵列,可以保证数 ...
随机推荐
- 拿来主义:layPage分页插件的使用
布衣之谈 所谓插件,大概就是项目中可插可拔的比较小功能化的组件:这些功能组件若能力可及,自己也可以完成——也即自己造轮子,但翻看各种技术社区,相关领域的神人们往往会有更好的实现方案贡献出来,这个时候你 ...
- spring加载xml的六种方式
因为目前正在从事一个项目,项目中一个需求就是所有的功能都是插件的形式装入系统,这就需要利用Spring去动态加载某一位置下的配置文件,所以就总结了下Spring中加载xml配置文件的方式,我总结的有6 ...
- 关于ES6 的对象解构赋值
之 前写了关于ES6数组的解构 现在 go on ; 解构不仅可以用于数组,还可以用于对象: 对象的解构和数组有一个重要的不同.数组的元素是按次序排列的,变量的取值是由他的位置决定的:而对象的属性没有 ...
- 在一个没有设置宽高的容器中,为什么设置position:absolute后就可以全屏显示了?
此场景适用于移动端百分比布局,背景全屏显示. 在一个没有设置宽高的容器中设置背景,想要背景全屏显示,设置bcakground-size:100%;后还需设置position:absolut; 原因: ...
- javaIO流实现文件拷贝
package com.java.demo; import java.io.*; public class CopyDemo { public static void main(String[] ar ...
- nginx 安装及简单配置(适用 小白)
一.nginxNginx是一个异步框架的 Web服务器,也可以用作反向代理,负载平衡器 和 HTTP缓存,Nginx可以部署在网络上使用FastCGI脚本.SCGI处理程序.WSGI应用服务器或Phu ...
- 简明shell入门
- [NOIp 2017]逛公园
Description 策策同学特别喜欢逛公园.公园可以看成一张$N$个点$M$条边构成的有向图,且没有 自环和重边.其中1号点是公园的入口,$N$号点是公园的出口,每条边有一个非负权值, 代表策策经 ...
- [Codeforces 863E]Turn Off The TV
Description Luba needs your help again! Luba has n TV sets. She knows that i-th TV set will be worki ...
- [SDOI2010]古代猪文
题目背景 “在那山的那边海的那边有一群小肥猪.他们活泼又聪明,他们调皮又灵敏.他们自由自在生活在那绿色的大草坪,他们善良勇敢相互都关心……” ——选自猪王国民歌 很久很久以前,在山的那边海的那边的某片 ...