[转帖]Linux磁盘I/O(二):使用vm.dirty_ratio和vm.dirty_background_ratio优化磁盘性能
文件缓存是一项重要的性能改进,在大多数情况下,读缓存在绝大多数情况下是有益无害的(程序可以直接从RAM中读取数据)。写缓存比较复杂,Linux内核将磁盘写入缓存,过段时间再异步将它们刷新到磁盘。这对加速磁盘I/O有很好的效果,但是当数据未写入磁盘时,丢失数据的可能性会增加。
当然,也存在缓存被写爆的情况。还可能出现一次性往磁盘写入过多数据,以致使系统卡顿。这些卡顿是因为系统认为,缓存太大用异步的方式来不及把它们都写进磁盘,于是切换到同步的方式写入。
这些都是可控制的选项,根据工作负载和数据,你可以决定如何设置它们:
$ sysctl -a | grep dirty
vm.dirty_background_bytes = 0
vm.dirty_background_ratio = 10
vm.dirty_bytes = 0
vm.dirty_ratio = 20
vm.dirty_writeback_centisecs = 500
vm.dirty_expire_centisecs = 3000
vm.dirtytime_expire_seconds = 43200
vm.dirty_background_ratio是内存可以填充脏数据的百分比。这些脏数据稍后会写入磁盘,pdflush/flush/kdmflush这些后台进程会稍后清理脏数据。比如,我有32G内存,那么有3.2G的脏数据可以待着内存里,超过3.2G的话就会有后台进程来清理。vm.dirty_ratio是可以用脏数据填充的绝对最大系统内存量,当系统到达此点时,必须将所有脏数据提交到磁盘,同时所有新的I/O块都会被阻塞,直到脏数据被写入磁盘。这通常是长I/O卡顿的原因,但这也是保证内存中不会存在过量脏数据的保护机制。vm.dirty_background_bytes和vm.dirty_bytes是另一种指定这些参数的方法。如果设置_bytes版本,则_ratio版本将变为0,反之亦然。vm.dirty_expire_centisecs指定脏数据能存活的时间。在这里它的值是30秒。当pdflush/flush/kdmflush在运行的时候,他们会检查是否有数据超过这个时限,如果有则会把它异步地写到磁盘中。毕竟数据在内存里待太久也会有丢失风险。vm.dirty_writeback_centisecs指定多长时间pdflush/flush/kdmflush这些进程会唤醒一次,然后检查是否有缓存需要清理。
可以通过下面方式看内存中有多少脏数据:一共有106页的脏数据
$ 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
方法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磁盘I/O(二):使用vm.dirty_ratio和vm.dirty_background_ratio优化磁盘性能的更多相关文章
- Linux虚拟内存(swap)调优篇-“swappiness”,“vm.dirty_background_ratio”和“vm.dirty_ratio”
Linux虚拟内存(swap)调优篇-“swappiness”,“vm.dirty_background_ratio”和“vm.dirty_ratio” 作者:尹正杰 版权声明:原创作品,谢绝转载 ...
- Linux磁盘分区(二):删除
***********************************************声明************************************************ 原创 ...
- linux磁盘管理系列二:软RAID的实现
磁盘管理系列 linux磁盘管理系列一:磁盘配额管理 http://www.cnblogs.com/zhaojiedi1992/p/zhaojiedi_linux_040_quota.html l ...
- [转帖]linux下使用 du查看某个文件或目录占用磁盘空间的大小
linux下使用 du查看某个文件或目录占用磁盘空间的大小 du -ah --max-depth= 去年用过一次 后来忘记了.. 命令这个东西 熟能生巧.. https://www.cnblogs.c ...
- Linux学习之CentOS(二十六)--Linux磁盘管理:LVM逻辑卷的创建及使用
在上一篇随笔里面 Linux学习之CentOS(二十五)--Linux磁盘管理:LVM逻辑卷基本概念及LVM的工作原理,详细的讲解了Linux的动态磁盘管理LVM逻辑卷的基本概念以及LVM的工作原理, ...
- Linux磁盘分区(二)之挂载卸载常用命令
Linux磁盘分区(二)之挂载卸载常用命令 转自:https://blog.csdn.net/qq_36183935/article/details/81053383 https: ...
- Linux学习之CentOS(二十八)--RAID原理基础及Linux下软件RAID配置
一.RAID的原理基础 在 讲解RAID的原理基础之前,我们首先来了解一下传统磁盘的劣势.我们知道一台PC机种都会包含CPU.内存.主板.硬盘.网卡等硬件,影响计算机性能的 组建包括:CPU.主板总线 ...
- linux系统基础(二)
磁盘管理(一) Linux设备认识 /dev/cdrom /dev/sr0 /dev/mouse /dev/sda /dev/hda IDE硬盘(支持4块):hd(a-d) [非IDE硬盘]SCSI硬 ...
- Linux内存管理(二)
Linux内存管理之二:Linux在X86上的虚拟内存管理 本文档来自网络,并稍有改动. 前言 Linux支持很多硬件运行平台,常用的有:Intel X86,Alpha,Sparc等.对于不能够通用的 ...
- [转帖]linux 内存管理——内核的shmall 和shmmax 参数
(转)linux 内存管理——内核的shmall 和shmmax 参数 内核的 shmall 和 shmmax 参数 SHMMAX= 配置了最大的内存segment的大小 ------>这个 ...
随机推荐
- 在Global Mapper中导入点的文本格式
目录 有时候想在Global Mapper快速显示一个点的具体位置,来不及去创建一个具体的矢量文件.一个最快速的方式就是将这个点写在文本文件中导入: 13149831.629692005 281725 ...
- 神经网络入门篇:详解深层网络中的前向传播(Forward propagation in a Deep Network)
深层网络中的前向传播 先说对其中一个训练样本\(x\)如何应用前向传播,之后讨论向量化的版本. 第一层需要计算\({{z}^{[1]}}={{w}^{[1]}}x+{{b}^{[1]}}\),\({{ ...
- 解读登录双因子认证(MFA)特性背后的TOTP原理
摘要:随着互联网密码泄露事件频发,越来越多的产品开始支持多因子认证(MFA),TOTP则是MFA领域里最普遍的一种实现方式,本文介绍TOTP的原理和华为云的实践经验. 原理 TOTP(Time-Bas ...
- 云小课|MRS基础原理之Hue组件介绍
阅识风云是华为云信息大咖,擅长将复杂信息多元化呈现,其出品的一张图(云图说).深入浅出的博文(云小课)或短视频(云视厅)总有一款能让您快速上手华为云.更多精彩内容请单击此处. 摘要:Hue是一组WEB ...
- 海量监控数据处理如何做,看华为云SRE案例分享
摘要:openGemini的设计和优化都是根据时序数据特点而来,在面对海量运维监控数据处理需求时,openGemini显然更加有针对性. IT运维诞生于最早的信息化时代.在信息化时代,企业的信息化系统 ...
- 盘点华为云GaussDB(for Redis)六大秒级能力
摘要:盘点高斯Redis的秒级能力,包括扩容.备份.删除.启动等. 本文分享自华为云社区<华为云GaussDB(for Redis)揭秘第20期:六大秒级能力盘点>,作者: 高斯Redis ...
- npm install过程中遇到typings deprecated的warning该怎么处理
摘要:在项目里进行npm install操作的时候,发现typings.json文件里的一些定义文件爆出了已经弃用的警告,怎么办? 本文分享自华为云社区<npm install过程中遇到typi ...
- 带你掌握Visual Studio Code的格式化程序
摘要:Visual Studio Code 中的所有语言都可以使用其中一种自动格式化程序进行格式化,并且 Python 扩展还支持 linter. 本文分享自华为云社区<Visual Studi ...
- centos8 测地卸载php5.6 与卸载php7
centos8 yum php 默认安装 php7.1.2 我想卸载php7 ,安装php5.6 yum remove php 无法彻底卸载干净.必须强制删除,使用下面命令查看全部php软件包 rpm ...
- 【Django-Vue】手机号是否存在接口 多方式登录接口 腾讯云短信介绍和申请 api与sdk
目录 昨日回顾 今日内容 0 登录注册功能设计 1 短信登录接口 视图类 2 多方式密码登录接口 视图类 序列化类 路由 3 腾讯云短信介绍和申请 3.1api与sdk 补充 练习 昨日回顾 # 你的 ...