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. java开发eclipse常见问题(一)The superclass "javax.servlet.http.HttpServlet" was not found on the Java Build Path

    最近刚开始用Eclipse开发,刚开始都是按教程一步一步的新建web工程也没出现什么问题. 今天选了一个新的workspace,建了个web工程发现最简单的jsp页面都报错:The superclas ...

  2. hadoop的kerberos认证

    言归正传,介绍过hadoop的simple认证和kerberos后,我们在这一章介绍hadoop的kerberos认证 我们还使用hadoop集群的机器. OS 版本: Centos6.4 Kerbe ...

  3. 使用Go开发一个简单的服务器程序

    最近有个小项目,需要一个简单的后台程序来支撑,本来想用Nodejs来做,但是由于本人js一直很菜,并且很讨厌callback,虽然我也很喜欢异步模型,但我一直都觉得JS是反人类的.后台就用了go处理, ...

  4. poj2528(线段树+离散化)Mayor's posters

    2016-08-15 题意:一面墙,往上面贴海报,后面贴的可以覆盖前面贴的.问最后能看见几种海报. 思路:可以理解成往墙上涂颜色,最后能看见几种颜色(下面就是以涂色来讲的).这面墙长度为1~1000 ...

  5. sqlite 批量插入, 重复插入(更新)

    [FMDBManager inDatabase:^(FMDatabase *db) { [db shouldCacheStatements]; //开始启动事务 [db beginTransactio ...

  6. poj 2196 Specialized Four-Digit Numbers

    如果一个数字 十进制的各位数的和 == 十六进制的各位数的和 == 十二进制的各位数的和,则输出,从2992到9999 #include <cstdio> int toDD(int n) ...

  7. 轻松学习Linux之进程监视与管理

    前后台进程转换-1 前后台进程转换-2 本文出自 "李晨光原创技术博客" 博客,谢绝转载!

  8. cookie一些简单的操作

    cookie 保存数据      document.cookie=name+'='+value+';expires='+date; //name=shiyou ;expires=Tue Mar 08 ...

  9. Message Forwarding

    [Preprocess] 在使用forwarding机制前,会先经历2个步骤,只有当这2个步骤均失败的情况下,才会激活forwarding. 1.+(BOOL)resolveInstanceMetho ...

  10. shell输出调试信息

    [shell输出调试信息] 1.使用trap命令 trap命令用于捕获指定的信号并执行预定义的命令. 其基本的语法是: trap 'command' signal 其中signal是要捕获的信号,co ...