http://hellojava.info/?p=264&utm_source=tuicool&utm_medium=referral

解决磁盘io紧张的一种临时方法

有些时候可能会碰到一个场景是临时磁盘的io比较紧张,但不会紧张太久,例如在搞活动,做大促什么的时候,这种时候如果出现磁盘io紧张的话,可能会大幅度影响系统的性能,如果机器的内存是充足的话,有一个临时的办法可以用下。

Java在写文件的时候,如果没有强制调用FileChannel.force或FileDescriptor.sync的话,文件内容是不一定会被写到磁盘上的,所以有些同学可能会看到一些用java写的存储类的产品,例如HBase之类的,会强制调用上面的方法确保数据的安全性,而其他多数的java应用在写文件的时候是不会去调用上面的方法的。

在不调用上面的方法的情况下,os会先将写入的文件内容放入内存,当放入内存的数据量大于一定的阈值或刷新的间隔时间到了的话,会开始将内存中的数据写入磁盘,这样的好处非常明显,一方面提升了平时的写入速度,另一方面将很多随机写转为了顺序写,对于有raid卡,并且开启了raid卡cache的,这个时候会再挡一层,会再次降低文件io的消耗。

linux主要通过以下几个参数来控制上面的行为:
vm.dirty_background_ratio
控制内存占用的阈值,这个是一个比例,但计算起来很折腾,是机器上free(包括cached)的内存的比例,而不是物理机,所以如果想更准确的控制的话,可以用下面的参数。
vm.dirty_background_bytes
控制内存占用的阈值,但是具体的数值。
vm.dirty_ratio
控制内存最多占用的比例,这个是物理内存,如果到达了这个比例,将会阻塞住所有的写动作,先把内存中所有的数据刷入磁盘,可以看到这个参数很关键,设置不好的话会导致应用的性能疯狂下降。
vm.dirty_bytes
控制内存最多占用的阈值,具体的字节数。
vm.dirty_writeback_centisecs
控制每隔多久把内存里的数据往磁盘里刷,默认是5s。
vm.dirty_expire_centisecs
控制在往磁盘刷的时候,刷放在内存超过多久的数据,默认是30s,按照上面的默认值每隔5s刷一次,所以其实就是每次刷全部的数据。

在这个机制的基础上,如物理内存是比较充足的,那么其实可以在搞活动等的时候临时调整下参数,给dirty这块区域更多的内存,同时将writeback的时间间隔拉长,如果能够做到空闲的物理内存支撑过搞活动的高峰时间那就完美了,那样的话在那个时候即使写文件动作很多,性能也是相当高的,这个方法需要值得注意的是,当dirty区域内存很大,而且很久才writeback一次,所以在writeback的那段时间会比较耗io,但通常是还好的,因为那个时候很多都会是顺序写。

不过除了上面的参数外,要真正的做到io性能提升,在ext3文件系统的情况下,还需要调整mount分区的写日志数据的方式(具体可以参见这篇文章),默认通常是ordered的方式(可通过cat /proc/mounts来确认),需要修改为writeback方式,这样可以避免ext3日志写造成的io紧张问题,前提是丢了的情况下也可以接受,但这个地方不太好操作的是要修改data的方式,需要remount,在ext3里就意味着要先停掉这个分区所有的写,在ext4里则可以直接动态执行。

ps: 好久没写文章了,还好取消订阅的不多,:),后面计划写一个系列的文章:“JAVA程序员也应该了解的系统知识”,主要是希望能够把Java代码和系统知识结合起来,除了写代码外,还应该知道例如cpu、内存、磁盘、网络等和程序的关系到底是什么。

=============================
欢迎关注微信公众号:hellojavacases

关于此微信号:
分享Java问题排查的Case、Java业界的动态和新技术、Java的一些小知识点Test,以及和大家一起讨论一些Java问题或场景,这里只有Java细节的分享,没有大道理、大架构和大框架。

公众号上发布的消息都存放在http://hellojava.info上。

vm.dirty_background_ratio and vm.dirty_ratio的更多相关文章

  1. Linux虚拟内存(swap)调优篇-“swappiness”,“vm.dirty_background_ratio”和“vm.dirty_ratio”

      Linux虚拟内存(swap)调优篇-“swappiness”,“vm.dirty_background_ratio”和“vm.dirty_ratio” 作者:尹正杰 版权声明:原创作品,谢绝转载 ...

  2. vm.dirty_ratio & vm.dirty_background_ratio

    https://lonesysadmin.net/2013/12/22/better-linux-disk-caching-performance-vm-dirty_ratio/ Better Lin ...

  3. Better Linux Disk Caching & Performance with vm.dirty_ratio & vm.dirty_background_ratio

    In previous posts on vm.swappiness and using RAM disks we talked about how the memory on a Linux gue ...

  4. Standard 1.1.x VM与Standard VM的区别

    在Eclipse或MyEclipse中要设置Installed JREs时,有三个选择: - Execution Environment Description - Standard 1.1.x VM ...

  5. Java HotSpot(TM) Client VM 与 server VM 的配置

    在Linux 6.5 下安装Elasticsearch 出现错误: JVM is using the client VM [Java HotSpot(TM) Client VM] but should ...

  6. 1, vm: PropTypes.instanceOf(VM).isRequired

    子模块的文件引入父工程对象时,出现红色warning,提示传入的对象类型不是所要求的类型. 思路是父工程引用的JS包和子模块使用的包不是同一个包,解决办法是父工程和子工程都使用同一个包. resolv ...

  7. VM workstation 与 VM vSphere的区别 [转载]

    在学完vSphere后,想起了VMware Workstation.这两个都是虚拟化的东西,这两者到底有什么本质的不同呢?顺着我的思路我开始将所学过的进行检索期望从中寻到一丝半点的线索.很快大脑中建立 ...

  8. 安装vm,在vm中安装windows10操作系统。

    步骤:双击打开虚拟机文件 根据向导安装  下一步 然后等待安装 安装好了后点击许可证 ZF3R0-FHED2-M80TY-8QYGC-NPKYF YF390-0HF8P-M81RQ-2DXQE-M2U ...

  9. dirty_background_ration 与 /proc/sys/vm/dirty_ratio

    wappiness的值的大小对如何使用swap分区是有着很大的联系的.swappiness=0的时候表示最大限度使用物理内存,然后才是 swap空间,swappiness=100的时候表示积极的使用s ...

随机推荐

  1. SpringMVC + Spring + MyBatis 学习笔记:为MyBatis增加打印SQL功能 (最简化配置)

    系统:WIN8.1 数据库:Oracle 11GR2 开发工具:MyEclipse 8.6 框架:Spring3.2.9.SpringMVC3.2.9.MyBatis3.2.8 1.以下jar包拷贝到 ...

  2. [转]简析 IOS 程序图标的设计

    表现形态**** 在有限的空间里表达出相对应的信息,在IOS 程序图标设计中,直观是第一个解决的问题,不应该出现大多繁琐的修饰,当然还要有很好的视觉表现力,使用户可以更容易理解此应用的实际作用,更轻松 ...

  3. Error when running Swift3 in REPL

    Traceback (most recent call last): File "", line 1, in NameError: name 'run_one_line' is n ...

  4. html5 canvas图片翻转

    <!doctype html> <html> <head> <meta charset="utf-8"> <title> ...

  5. android 开发必用的开源库

    LogReport:  https://github.com/wenmingvs/LogReport,   崩溃日志上传框架 wcl-permission-demo:Android 6.0 - 动态权 ...

  6. 如何判断ios设备是否是高清屏幕

    if([[[UIDevice currentDevice] systemVersion] floatValue] >= 3.2f) { CGRect winRect = [[UIScreen m ...

  7. Dagger学习笔记

    @Inject 提供依赖的构造函数,或者需要依赖的成员变量 @Module 提供依赖,实例化的地方( 使用module实例化,方便测试的时候替换成其他对象,而这也是和构造方法注入的区别,如果用构造方法 ...

  8. java实现图片与base64字符串之间的转换

    package cn.com; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOEx ...

  9. VISIO 2007 修改形状默认字体 自定义模具

    visio 2007的形状的默认字体为8号,比较小,怎样改成默认10号? 首先将一个流程图中所要用的形状都拖到绘图区,然后全选,设置字体为10号,全选,再拖动到形状区,如下图: 点击‘是’,确认修改模 ...

  10. ODBC 是什么

    In computing, ODBC (Open Database Connectivity) is a standard programming language middleware API fo ...