一、问题分析:

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

只有当前系统全局的脏页数超过阀值并且当前的磁盘脏页数目也超过阀值,才认为需要等待脏页的回写,否则,直接退出循环,继续进行后续的写操作。通过这种修改,只有在当前磁盘的脏页数目超过阀值,才会在当前磁盘上等待脏页回写。当系统中有多个后备存储器时,多个后备存储器之间互相不影响,各自管理各自的脏页数目,使系统对脏页的处理更加的合理。

linux-2&period;6&period;26内核中ARM中断实现详解&lpar;转)

转载:http://www.cnblogs.com/leaven/archive/2010/08/06/1794293.html 更多文档参见:http://pan.baidu.com/s/1dDvJ ...

【内核】linux2&period;6版本内核编译配置选项(二)

目录 Linux2.6版本内核编译配置选项(一):http://infohacker.blog.51cto.com/6751239/1203633 Linux2.6版本内核编译配置选项(二):http ...

【内核】linux2&period;6版本内核编译配置选项(一)

Linux 2.6.19.x 内核编译配置选项简介 作者:金步国 版权声明 本文作者是一位自由软件爱好者,所以本文虽然不是软件,但是本着 GPL 的精神发布.任何人都可以自由使用.转载.复制和再分发, ...

Suse环境下编译linux-2&period;6&period;24内核

Suse环境下编译linux-2.6.24内核 1.下载linux-2.6.24内核源码: https://mirrors.edge.kernel.org/pub/linux/kernel/v2.6/ ...

raid5两块硬盘离线怎么办&quest; 强制上线失败如何恢复数据

服务器故障描述: 客户使用Dell 2850服务器组建了raid5磁盘阵列,阵列中包含有6块硬盘(SCSI硬盘,单盘容量300G),服务器操作系统为linux Redhat4:文件系统为ext3文件系 ...

Raid5两块硬盘掉线可以恢复数据吗&lowbar;raid数据恢复案例分享

本案例中发生故障的存储类型是HP P2000,虚拟化平台为vmware exsi,共有10块硬盘组成raid5(硬盘容量为1t,其中6号盘是热备盘),由于某些故障导致阵列中两块硬盘亮黄灯掉线,硬盘无法 ...

6块300G SCSI RAID5&comma;两块硬盘损坏的数据恢复总结

[用户单位]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 是磁盘阵列的其中一个系列,将两块硬盘构成磁盘阵列,可以保证数 ...

随机推荐

ZeroMQ接口函数之 :zmq&lowbar;socket – 创建ZMQ套接字

ZeroMQ API 目录 :http://www.cnblogs.com/fengbohello/p/4230135.html ZeroMQ 官方地址:http://api.zeromq.org/4 ...

LEETCODE —— Binary Tree的3 题 —— 3种非Recursive遍历

Binary Tree Preorder Traversal Given a binary tree, return the preorder traversal of its nodes' valu ...

微软云Azure Website 远程调试

微软云Azure Website 远程调试 是可以的 但是只有48小时,要在后台开启,所以还是很麻烦的啊! 但是安全性提高了,不得不承认哦

nyoj 108 士兵杀敌&lpar;一&rpar;

点击打开链接 士兵杀敌(一) 时间限制:1000 ms  |  内存限制:65535 KB 难度:3 描述 南将军手下有N个士兵,分别编号1到N,这些士兵的杀敌数都是已知的. 小工是南将军手下的军师, ...

Codeforces 149 E&period; Martian Strings

正反两遍扩展KMP,维护公共长度为L时.出如今最左边和最右边的位置. . .. 然后枚举推断... E. Martian Strings time limit per test 2 seconds m ...

activeMQ类别和流程

Point-to-Point (点对点)消息模式开发流程 :        1.生产者(producer)开发流程: 1.1 创建Connection: 根据url,user和password创建一个 ...

js对数组中的数字排序

1 前言 如果数组里面都是数字,如果用原生的sort,默认是按字符串排序的,不符合我们的要求 2 代码 方法1:添加Array的原生方法 Array.prototype.sort2 =function ...

win7 64位安装opencv3&period;0

一.去官网下载opencv3.0 下载Win pack,下载后解压,自己在D盘下新建了文件夹OpenCV3.3_win D:\OpenCV3.3_win,把下载到的Win pack解压到里面.解压或者 ...

ArcGIS自定义工具箱-字段合并

ArcGIS自定义工具箱-字段合并 联系方式:谢老师,135-4855-4328,xiexiaokui#qq.com 目的:用指定字符合并两个字段 用例:湖南/长沙=>湖南省长沙市 数据源: 使 ...

Linux内核分析— —扒开系统调用的三层皮(下)

课程主要内容有三点: 在MenuOS中通过添加代码增加自定义的系统调用命令 使用gdb跟踪调试内核 简单分析system_call代码了解系统调用在内核代码中的处理过程 实验——分析system_ca ...

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

  1. Linux确认服务所在磁盘io性能状态

    Linux确认服务所在磁盘io性能状态 1.背景 监控服务应用influxdb在上线前需要检查磁盘io性能,防止磁盘io性能太低影响监控数据量写入延迟. 下面以influxdb服务为例,且数据落盘在/ ...

  2. linux 平均磁盘请求数量,Linux之 iostat 解读磁盘io

    Linux之 iostat 解读磁盘io 发布时间:2020-08-17 22:44:04 来源:ITPUB博客 阅读:88 作者:张冲andy 1.iostat [oracle@orastb log ...

  3. linux 磁盘资源管理以及IO

    柱面:Cylinder :一个环形磁道的面Cylinder =Track,早期的磁盘一个面上有1024个磁柱面:现在磁盘(服务器上的磁盘)做的很大,一个磁面上可以达到十几万的柱面数. 磁道:Track ...

  4. 安装linux可是c盘文件夹失败,虚拟机安装linux系统,会对物理的磁盘有影响吗?怎样保证安全,谢了!...

    匿名用户 1级 2017-11-10 回答 个人硬盘安装SUSE10.1DVD版方法--zt 作者:nanzhao@Linuxfans.org 从刚接触LINUX 上网找安装方面的资料 到自己成功安装 ...

  5. Linux系统监控之磁盘I/O篇

    原文链接地址: http://os.51cto.com/art/201006/207694.htm 磁盘I/O 子系统是Linux 系统中最慢的部分.这个主要是归于CPU到物理操作磁盘之间距离(译注: ...

  6. linux 系统监控、诊断工具之 IO wait

    1.问题: 最近在做日志的实时同步,上线之前是做过单份线上日志压力测试的,消息队列和客户端.本机都没问题,但是没想到上了第二份日志之后,问题来了: 集群中的某台机器 top 看到负载巨高,集群中的机器 ...

  7. 15. Linux系统中的磁盘管理

    Lesson15 Linux系统中的磁盘管理 文章目录 1. 什么是磁盘管理 2. 本地存储设备的识别 3. 设备的挂载和卸载 4. 解决设备正忙情况 5 磁盘分区 5.1 磁盘分区的基础知识 5.2 ...

  8. linux下的CPU、内存、IO、网络的压力测试

    linux下的CPU.内存.IO.网络的压力测试 要远程测试其实很简单了,把结果放到一个微服务里直接在web里查看就可以了,或者同步到其他服务器上 一.对CPU进行简单测试: 1.通过bc命令计算特别 ...

  9. Linux云计算架构-系统调优【CPU、IO、网络、内核参数调优】

    文章目录 Linux云计算架构-系统调优[CPU.IO.网络.内核参数调优] 1. CPU调优 2. IO调优 3. 网络调优 3.1 网络冗余(主备模式) 3.2 负载均衡模式 4. 内核参数调优 ...

最新文章

  1. 华为云大数据存储的冗余方式是三副本_大数据入门:HDFS数据副本存放策略
  2. GWT与Eclipse集成开发初步研究
  3. Linux浏览文件的常用命令
  4. Inna and Sequence
  5. 58.贪心算法练习:  最小新整数
  6. 设备底座几个常见固定方式
  7. 深度剖析RPC框架的核心设计
  8. Science发布基因组比对革新技术:泛基因组学映射工具Giraffe
  9. powershell 停止正在运行的用户应用
  10. 游戏筑基开发之C语言编程技巧
  11. 命名实体识别研究综述
  12. 带你快速玩转canvas——写个折线图
  13. 【系统分析师之路】2019年上系统分析师综合知识真题
  14. 首都师范 博弈论 9 5 6引入精神奖励后的博弈模型
  15. 一位全减器逻辑电路图_一位全减器电路实现方法探讨
  16. Mac删除Python缓存文件
  17. 信创操作系统--统信UOS桌面版(使用Systemd管理系统服务)
  18. chm 已取消到该网页的导航,打不开!
  19. OPC 救援:OPC Rescue Crack
  20. 开源框架Banner实现图片轮播

热门文章

  1. 空气过滤器过滤效率如何计算
  2. Pydantic官方文档
  3. 一诺仪器面试的心得体会
  4. 简单收集微信小程序formId,解决发送模板消息不够用的问题
  5. 人机交互界面UI简介
  6. java中getfield_Java反射中getDeclaredField和getField的区别
  7. 数组push之后赋值给新变量之后输出为数字问题
  8. Qt之QLineEdit
  9. 可观测性的三大支柱:Metrics、Trace、Log
  10. cad 正交使用 水平 垂直 画线