一、问题分析:

通过跟踪定位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

转载于:https://www.cnblogs.com/wangfengju/p/6172381.html

linux2.6.37内核接两个硬盘导致读写效率变低的问题相关推荐

  1. Linux 挂2个磁盘会影响io,linux2.6.37内核接两个硬盘导致读写效率变低的问题

    一.问题分析: 通过跟踪定位write系统调用的实现发现,在每次调用a_ops->write_end之后,都会去调用balance_dirty_pages_ratelimited,该函数负责检查 ...

  2. y700支持m2硬盘_两块硬盘一起读写?奥睿科M.2 NVMe双盘位固态硬盘盒使用

    工作经常用到文件存储与拷贝,而往往文件很大的时候等待的时间太长,烦不胜烦,正好笔者手里有一款500G的m2接口的SSD硬盘,所以一直考虑入手一款好用的移动硬盘盒,在网上比价比来比去最后选择了奥睿科的这 ...

  3. 服务器read坏了两块硬盘,服务器坏了2块硬盘

    关于 服务器坏了2块硬盘的搜索结果 回答 不过 SSD 的储存成本比 HDD 硬盘真的高的不是一块两块&xff0c;而且 SSD 硬盘容量到了 80%就会脏盘性能大幅度下降&xff0c ...

  4. linux内核修改工程环境,linux2.6.33内核移植s3c2410以和交叉环境编译搭建最终修改版.pdf...

    Linux2.6.33 内核移植S3C2410 以及搭建交叉编译环境 (最终修改完善版本) 作者:胡峰 整理亍2010-3-13嵌入式实验室 嵌入式助理工程师 所需软件以及工具:wmware work ...

  5. 为iptables增加layer7补丁(Linux2.6.25内核

    为iptables增加layer7补丁(Linux2.6.25内核) ################################################################ ...

  6. linux26内核,基于AT91RM9200与LINUX2.6.26内核的嵌入式平台开发全过程

    一.ARM9+LINUX开发历程 使用了51系列和MOTOROLA单片机若干年,觉得自己已经跟不上嵌入式发展的时代了.决定开发一种新的硬件平台,综合比较了一下,觉得ARM9+LINUX模式不错.先从头 ...

  7. 基于AT91RM9200与LINUX2.6.26内核的嵌入式平台开发全过程

    一.ARM9+LINUX开发历程 使用了51系列和MOTOROLA单片机若干年,觉得自己已经跟不上嵌入式发展的时代了.决定开发一种新的硬件平台,综合比较了一下,觉得ARM9+LINUX模式不错.先从头 ...

  8. 转载:基于AT91RM9200与LINUX2.6.26内核的嵌入式平台开发全过程

    一.ARM9+LINUX开发历程 使用了51系列和MOTOROLA单片机若干年,觉得自己已经跟不上嵌入式发展的时代了.决定开发一种新的硬件平台,综合比较了一下,觉得ARM9+LINUX模式不错.先从头 ...

  9. linux内核usb驱动框架,基于S3C2440平台的linux2.6.22内核版本的USB驱动框架分析

    基于S3C2440平台的linux2.6.22内核版本的USB驱动框架分析 发布时间:2014-07-18 16:47:31来源:红联作者:linux08071151 driver/usb/host/ ...

最新文章

  1. “蚁人”不再是科幻!MIT最新研究,能把任何材料物体缩小1000倍 | Science
  2. C# 两时间,时间间隔
  3. 三星GalaxyNote20系列全新渲染图曝光:屏下摄像头来了?
  4. python切片表达式3个参数_Python:Base3(函数,切片,迭代,列表生成式)
  5. rpm包安装失败的解决办法
  6. 学好平面设计需要哪些技术功底?
  7. linux 开启bat文件夹,在Linux系统中使用及定制Bat
  8. 语音社交聊天室源码开发,如何实现左滑删除功能
  9. 【processing】Daniel Shiffman编程挑战题解、思维介绍及代码(1)穿越星际效果编译
  10. 2022年2月国产数据库排行榜:冠军宝座面临挑战,OceanBase 重返 TOP3
  11. 22MySQL有哪些“饮鸩止渴”提高性能的方法笔记
  12. 幻灯片相册制作PhotoStage
  13. latte - 拿铁咖啡
  14. 单词接龙 单词接龙的规则是
  15. CIO40: 数字化中心运营管理
  16. SQL server用户
  17. 计算机考研材料哥,【材料哥分享-10期】材料哥:我对考研期间谈恋爱的看法
  18. 检查 CPU 是否支持二级地址转换 - 摘自网络
  19. 制作字幕 ass格式
  20. Python数据分析(7)-numpy数组操作

热门文章

  1. Oracle DBWR,LGWR,CKPT,ARCH 触发条件 总结
  2. 如何根据字典中值的大小,对字典中的项排序
  3. Nginx服务器编译添加SSL模块
  4. 基础语法(IDE:PyCharm)
  5. Windows service无法删除怎么办?
  6. Java:包的使用Pack
  7. Ajax的用法之JQuery
  8. Routeros双adsl线路基于ip分段策略路由
  9. 5. [mmc subsystem] mmc core(第五章)——card相关模块(mmc type card)
  10. 前端(二)之 CSS