Linux 文件缓存是一项重要的性能改进,在大多数情况下,读缓存在绝大多数情况下是有益无害的(程序可以直接从RAM中读取数据)。写缓存比较复杂,Linux内核将磁盘写入缓存,过段时间再异步将它们刷新到磁盘。这对加速磁盘I/O有很好的效果,但是当数据未写入磁盘时,丢失数据的可能性会增加。

当然,也存在缓存被写爆的情况,还可能出现一次性往磁盘写入过多数据,以致使系统卡顿。这些卡顿是因为系统认为,缓存太大用异步的方式来不及把它们都写进磁盘,于是切换到同步的方式写入。

这些都是可控制的选项,根据工作负载和数据,可以决定如何设置它们:

sysctl -a | grep dirty

$ sysctl -a | grep dirty

vm.dirty_background_bytes = 0

vm.dirty_background_ratio = 10

vm.dirty_bytes = 0

vm.dirty_expire_centisecs = 3000

vm.dirty_ratio = 20

vm.dirty_writeback_centisecs = 500

vm.dirtytime_expire_seconds = 43200

或者

# sysctl -a | grep dirty

sysctl: reading key "net.ipv6.conf.all.stable_secret"

sysctl: reading key "net.ipv6.conf.default.stable_secret"

sysctl: reading key "net.ipv6.conf.eth0.stable_secret"

sysctl: reading key "net.ipv6.conf.eth1.stable_secret"

sysctl: reading key "net.ipv6.conf.lo.stable_secret"

vm.dirty_background_bytes = 0

vm.dirty_background_ratio = 10

vm.dirty_bytes = 0

vm.dirty_expire_centisecs = 3000

vm.dirty_ratio = 30

vm.dirty_writeback_centisecs = 500

以上参数的源文件位置为:

ls -l /proc/sys/vm/dirty_*

# ls -l /proc/sys/vm/dirty_*

-rw-r--r-- 1 root root 0 Oct 15 22:05 /proc/sys/vm/dirty_background_bytes

-rw-r--r-- 1 root root 0 Sep 26 07:59 /proc/sys/vm/dirty_background_ratio

-rw-r--r-- 1 root root 0 Oct 15 22:05 /proc/sys/vm/dirty_bytes

-rw-r--r-- 1 root root 0 Oct 15 22:05 /proc/sys/vm/dirty_expire_centisecs

-rw-r--r-- 1 root root 0 Sep 26 07:59 /proc/sys/vm/dirty_ratio

-rw-r--r-- 1 root root 0 Oct 15 22:05 /proc/sys/vm/dirty_writeback_centisecs

参数解析:

1、vm.dirty_background_ratio

内存可以填充脏数据的百分比。这些脏数据稍后会写入磁盘,pdflush/flush/kdmflush这些后台进程会稍后清理脏数据。比如,我有32G内存,那么有3.2G(10%的比例)的脏数据可以待着内存里,超过3.2G的话就会有后台进程来清理。

2、vm.dirty_ratio

可以用脏数据填充的绝对最大系统内存量,当系统到达此点时,必须将所有脏数据提交到磁盘,同时所有新的I/O块都会被阻塞,直到脏数据被写入磁盘。这通常是长I/O卡顿的原因,但这也是保证内存中不会存在过量脏数据的保护机制。

3、vm.dirty_background_bytes和vm.dirty_bytes

另一种指定这些参数的方法。如果设置 xxx_bytes版本,则 xxx_ratio版本将变为0,反之亦然。

4、vm.dirty_expire_centisecs

指定脏数据能存活的时间。在这里它的值是30秒。当 pdflush/flush/kdmflush 在运行的时候,他们会检查是否有数据超过这个时限,如果有则会把它异步地写到磁盘中。毕竟数据在内存里待太久也会有丢失风险。

5、vm.dirty_writeback_centisecs

指定多长时间 pdflush/flush/kdmflush 这些进程会唤醒一次,然后检查是否有缓存需要清理。

可以通过下面方式看内存中有多少脏数据:

cat /proc/vmstat | egrep "dirty|writeback"

$ cat /proc/vmstat | egrep "dirty|writeback"

nr_dirty 106

nr_writeback 0

nr_writeback_temp 0

nr_dirty_threshold 3934012

nr_dirty_background_threshold 1964604

说明:以上结果,显示一共有106页的脏数据

dirty_ratio 与 dirty_background_ratio 区别

文件系统缓存dirty_ratio与dirty_background_ratio两个参数区别

这两天在调优数据库性能的过程中,需要降低操作系统文件Cache对数据库性能的影响,故调研了一些降低文件系统缓存大小的方法,其中一种是通过修改 /proc/sys/vm/dirty_background_ratio 以及 /proc/sys/vm/dirty_ratio 两个参数的大小来实现。看了不少相关博文的介绍,不过一直弄不清楚这两个参数的区别在哪里,后来看了下面的一篇英文博客才大致了解了它们的不同。

vm.dirty_background_ratio:这个参数指定了当文件系统缓存脏页数量达到系统内存百分之多少时(如5%)就会触发pdflush/flush/kdmflush等后台回写进程运行,将一定缓存的脏页异步地刷入外存磁盘上;

vm.dirty_ratio:这个参数则指定了当文件系统缓存脏页数量达到系统内存百分之多少时(如10%),系统不得不开始处理缓存脏页(因为此时脏页数量已经比较多,为了避免数据丢失需要将一定脏页刷入外存磁盘上);在此过程中很多应用进程可能会因为系统转而处理文件IO而阻塞。

之前一直错误的以为dirty_ratio的触发条件不可能达到,因为每次肯定会先达到vm.dirty_background_ratio的条件,后来才知道自己理解错了。确实是先达到vm.dirty_background_ratio的条件后触发flush进程进行异步的回写操作,但是这一过程中应用进程仍然可以进行写操作,如果多个应用进程写入的量大于flush进程刷出的量那自然会达到vm.dirty_ratio这个参数所设定的阈值,此时操作系统会转入同步地处理脏页的过程,阻塞应用进程。

Linux 磁盘I/O优化

1、减少缓存

在很多情况下,有快速的磁盘子系统,它们有自己的大电池支持的NVRAM缓存,所以将东西保存在系统页面缓存中是有风险的。让我们尝试以更及时的方式向磁盘发送I/O,并减少本地操作系统(借用服务行业的话)“陷入困境”的机会。为了做到这一点,我们减小/etc/sysctl.conf中vm.dirty_background_ratio和vm.dirty_ratio的数值,并执行 sysctl -p命令:

vm.dirty_background_ratio = 5

vm.dirty_ratio = 10

这是基于Linux的虚拟机管理程序的典型方法。

不建议将这些参数设置为0,一些后台I/O可以很好地将应用程序性能与磁盘阵列在SAN(“峰值”)上的较短时间的较高延迟解耦。

2、增加缓存

在某些情况下,显著提高缓存对性能有积极的影响。在这些情况下,Linux客户机上包含的数据不是关键的,可能会丢失,而且应用程序通常会重复或以可重复的方式写入相同的文件。理论上,通过允许内存中存在更多脏页,你将在缓存中一遍又一遍地重写相同的块,只需要每隔一段时间向实际磁盘写一次。为此,我们提出了以下参数:

vm.dirty_background_ratio = 50

vm.dirty_ratio = 80

有时候还会提高vm.dirty_expire_centisecs 这个参数的值,来允许脏数据更长时间地停留。除了增加数据丢失的风险之外,如果缓存已满并需要同步,还会有长时间I/O卡顿的风险,因为在大型虚拟机缓存中有大量数据。

3、增减都用

有时候系统需要应对突如其来的高峰数据,它可能会拖慢磁盘。

比如说:每小时或者午夜进行批处理作业、在Raspberry Pi上写SD卡等等。

这种情况下,可以允许大量的写I/O存储在缓存中,这样后台刷新操作就可以慢慢异步处理它:

vm.dirty_background_ratio = 5

vm.dirty_ratio = 80

这个时候,系统后台进程在脏数据达到5%时就开始异步清理,但在80%之前系统不会强制同步写磁盘。在此基础上,你只需要调整RAM和vm.dirty_ratio大小以便能缓存所有的写数据。当然,磁盘上的数据一致性也存在一定风险。

总结

无论你选择哪种方式,都应该始终收集数据来支持你的更改,并帮助你确定是在改进还是变得更糟。

可以从应用程序,/proc/vmstat, /proc/meminfo, iostat, vmstat 以及 /proc/sys/vm 里面获得大量有用信息。

linux降低磁盘的读,Linux磁盘I/O优化:vm.dirty_ratio - 米扑博客相关推荐

  1. linux cp 排除文件,cp、tar命令排除文件和子目录 - 米扑博客

    测试树形目录 $ cd mimvp-blog/ $ tree . |____111.txt |____222.txt |____333.txt |____folder01 | |____111.txt ...

  2. linux 指令效率,Linux15个命令,大幅提高工作效率 - 米扑博客

    Linux 15个命令神器 ag.tig.mycli.jq.shellcheck.fzf.fpp.htop.glances.axel.sz/rz.cloc.tmux.script/scriptrepl ...

  3. linux快速切换目录命令,Linux在命令行快速切换目录 - 米扑博客

    今天在微博上看到一个用命令行快速切换目录的文章,比之前自己的解决方案好了非常多,必须记录下来分享下. 每天在命令行下,一大部分的工作都是一遍又一遍的输入 cd ~/some/very/deep/oft ...

  4. 十大实用linux脚本,5个超实用的Shell脚本 - 米扑博客

    分享5个shell脚本实例,大家可以借鉴下里面的思路,看下有没另外一种实现方式. 1.定时清空文件内容,定时记录文件大小 #!/bin/bash ########################### ...

  5. linux将文件的第二列求和,awk实现第一列相乘,第二列求和,并相加 - 米扑博客...

    AWK 取了三位创始人 Alfred Aho,Peter Weinberger,  Brian Kernighan 的Family Name的首字符,学习AWK有一本相当经典的书<The AWK ...

  6. linux去除内容重复行,Linux删除文本中的重复行 - 米扑博客

    在进行文本处理的时候,我们经常遇到要删除重复行的情况.那怎么解决呢? 下面就是三种常见方法? 第一,用sort+uniq,注意,单纯uniq是不行的,uniq对于重复行不上下连续时不起作用 因此,先对 ...

  7. linux var log目录作用,Linux系统/var/log/journal/垃圾日志清理 - 米扑博客

    CentOS系统中有两个日志服务,分别是传统的 rsyslog 和 systemd-journal # ls -l /etc/logrotate.d/ -rw-r--r-- 1 root root 9 ...

  8. Linux磁盘I/O(二):使用vm.dirty_ratio和vm.dirty_background_ratio优化磁盘性能

    文件缓存是一项重要的性能改进,在大多数情况下,读缓存在绝大多数情况下是有益无害的(程序可以直接从RAM中读取数据).写缓存比较复杂,Linux内核将磁盘写入缓存,过段时间再异步将它们刷新到磁盘.这对加 ...

  9. Linux动态频率调节系统CPUFreq之一:概述【转】-- 非常好的博客

    转自:http://blog.csdn.net/droidphone/article/details/9346981 目录(?)[-] sysfs接口 软件架构 cpufreq_policy cpuf ...

最新文章

  1. android游戏开发框架libgdx的使用(六)--演员和演出
  2. [转载]WebForm下使用 jQuery.loadUserControl异步load用户控件
  3. 直播预告丨深耕用户价值,实战保险业数字化升级
  4. JimuReport积木报表—分版设计解决什么问题?
  5. JS-DOM-节点-获取元素-文档结构-元素的属性
  6. Java8 中的 Optional
  7. ASP.NET Identity系列01,揭开神秘面纱
  8. NoSQL、memcached介绍、安装memcached、查看memcached状态
  9. pe卸载win10更新补丁_Win10怎么卸载有问题更新补丁|Win10卸载更新补丁
  10. Google要退出中国了
  11. 人工智能与机器学习密不可分,和图像处理、模式识别有什么关系?
  12. 计算机毕业设计-SSM商场餐厅管理系统-JavaWeb商场餐厅管理系统
  13. P6364 1024 程序员节发橙子 ( 正序 反序遍历不降序 )
  14. 数据分析09|数据转换
  15. 大数据分析」最详细的大数据分析师技能图谱详解与零基础自学内容大全
  16. 连载:面向对象葵花宝典:思想、技巧与实践(27) - 动态模型设计
  17. 前端Vue页面加水印方法(带源码)
  18. mysql 辅键_mysql 的主辅配置
  19. 前端题基础练习总结。。。。
  20. 浅析MOS管工作原理及特性

热门文章

  1. 计算机导论以python为舟大纲,清华大学出版社-图书详情-《计算机科学导论——以Python为舟(第3版)》...
  2. RocketMQ-02
  3. 服务级别协议(SLA)与运行水平协议(OLA)
  4. ORB+GMS、FREAK+GMS、BRISK+GMS、AKAZE+GMS特征点结合使用方法
  5. java.lang.IllegalArgumentException: DrawerLayout must be measured with MeasureSpec.EXACTLY.
  6. 【OpenSSL 之五】:HMAC算法分析
  7. 我的世界java平台缺少证书_tomcat配置https以及配置完成后提示服务器缺少中间证书(已解决)...
  8. 7. 内部集成电路总线接口I²C
  9. 洛谷P1331 海战 题解
  10. 成都五月花计算机专业学校正规吗,成都市|成都市五月花计算机专业学校怎么样...