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. pku3277 City Horizon

    http://poj.org/problem?id=3277 线段树,离散化,成段更新 #include <stdio.h> #include <stdlib.h> #defi ...

  2. intel xdk 打ios的ipa包

    1.打包 2.点击edit.下载csr文件,然后上传到苹果开发者网址,生成cer文件 上面两步搞完,把最后的按钮设置成"yes" 3.上传配置文件

  3. UVALive 5886 The Grille (模拟)

    The Grille 题目链接: http://acm.hust.edu.cn/vjudge/problem/26634 Description http://7xjob4.com1.z0.glb.c ...

  4. HDU3635Dragon Balls(并查集)

    http://acm.hdu.edu.cn/showproblem.php?pid=3635 题目意思是说n个球在n个城市. 每次操作把编号i的球所在的城市的所有的求全部一道另一城市B 每次询问访问编 ...

  5. HDU2838Cow Sorting(树状数组)

    题目意思是说给你一列数,每次可以将相邻的两个数交换,这一步的代价是这两个数的和,求将所有数排好序的最少代价. 题解: 我们可以这么思考,由于每次都是交换相邻的两个数,所以将一个数放到它自己的位置去后, ...

  6. redis安装配置与测试

    phpredis: https://github.com/nicolasff/phpredis http://www.cnblogs.com/ikodota/archive/2012/03/05/ph ...

  7. UI:UITableView表视图

    表视图 UITableView,iOS中最重要的视图,随处可⻅见. 表视图通常⽤用来管理⼀一组具有相同数据结构的数据. UITableView继承⾃自UIScrollView,所以可以滚动,表视图的每 ...

  8. 2.里氏替换原则(Liskov Substitution Principle)

    1.定义 里氏替换原则的定义有两种,据说是由麻省理工的一位姓里的女士所提出,因此以其名进行命名. 定义1:如果对一个类型为T1的对象o1,都有类型为T2的对象o2,使得以T1所定义的程序P中在o1全都 ...

  9. 使用#pragma阻止一些warnings

    这篇博客的内容都是记的网上的.是流水账.只是记录下来以便日后之有,避免每次重新google. #pragma除了可以用来把不同功能的代码进行分隔组织外还可以用来disable一些warnings.这在 ...

  10. cocos2d-x android java调用C++

    转自:http://www.cnblogs.com/mokey/archive/2013/04/10/3012961.html java调用C++ 1.在jniHelper.java文件中定义一个方法 ...