Linux释放内存会不会丢数据,Linux 脏数据回刷参数与调优

本文详细介绍了Linux内核如何管理内存中的脏数据,包括触发回刷的条件和配置参数。针对不同场景提供了配置示例,如在追求数据安全性时减少Cache并频繁回刷,而在追求性能时增大Cache并延长回刷间隔。此外,还分析了内核代码中的相关实现,以及如何通过调整`dirty_background_ratio`等参数来优化IO性能。
摘要由CSDN通过智能技术生成

简介

我们知道,Linux用cache/buffer缓存数据,且有个回刷任务在适当时候把脏数据回刷到存储介质中。什么是适当的时候?换句话说,什么时候触发回刷?是脏数据达到多少阈值还是定时触发,或者两者都有?

不同场景对触发回刷的时机的需求也不一样,对IO回刷触发时机的选择,是IO性能优化的一个重要方法。

Linux内核在/proc/sys/vm中有透出数个配置文件,可以对触发回刷的时机进行调整。内核的回刷进程是怎么运作的呢?这数个配置文件有什么作用呢?

配置概述

在/proc/sys/vm中有以下文件与回刷脏数据密切相关:

配置文件

功能

默认值

dirty_background_ratio

触发回刷的脏数据占可用内存的百分比

0

dirty_background_bytes

触发回刷的脏数据量

10

dirty_bytes

触发同步写的脏数据量

0

dirty_ratio

触发同步写的脏数据占可用内存的百分比

20

dirty_expire_centisecs

脏数据超时回刷时间(单位:1/100s)

3000

dirty_writeback_centisecs

回刷进程定时唤醒时间(单位:1/100s)

500

对上述的配置文件,有几点要补充的:

XXX_ratio 和 XXX_bytes 是同一个配置属性的不同计算方法,优先级 XXX_bytes > XXX_ratio

可用内存并不是系统所有内存,而是free pages + reclaimable pages

脏数据超时表示内存中数据标识脏一定时间后,下次回刷进程工作时就必须回刷

回刷进程既会定时唤醒,也会在脏数据过多时被动唤醒。

dirty_background_XXX与dirty_XXX的差别在于前者只是唤醒回刷进程,此时应用依然可以异步写数据到Cache,当脏数据比例继续增加,触发dirty_XXX的条件,不再支持应用异步写。

关于同步与异步IO的说明,可以看另一篇博客《Linux IO模型》

更完整的功能介绍,可以看内核文档Documentation/sysctl/vm.txt。

配置示例

单纯的配置说明毕竟太抽象。结合网上的分享,我们看看在不同场景下,该如何配置?

场景1:尽可能不丢数据

有些产品形态的数据非常重要,例如行车记录仪。在满足性能要求的情况下,要做到尽可能不丢失数据。

/* 此配置不一定适合您的产品,请根据您的实际情况配置 */

dirty_background_ratio = 5

dirty_ratio = 10

dirty_writeback_centisecs = 50

dirty_expire_centisecs = 100

这样的配置有以下特点:

当脏数据达到可用内存的5%时唤醒回刷进程

当脏数据达到可用内存的10%时,应用每一笔数据都必须同步等待

每隔500ms唤醒一次回刷进程

内存中脏数据存在时间超过1s则在下一次唤醒时回刷

由于发生交通事故时,行车记录仪随时可能断电,事故前1~2s的数据尤为关键。因此在保证性能满足不丢帧的情况下,尽可能回刷数据。

此配置通过减少Cache,更加频繁唤醒回刷进程的方式,尽可能让数据回刷。

此时的性能理论上会比每笔数据都O_SYNC略高,比默认配置性能低,相当于用性能换数据安全。

场景2:追求更高性能

有些产品形态不太可能会掉电,例如服务器。此时不需要考虑数据安全问题,要做到尽可能高的IO性能。

/* 此配置不一定适合您的产品,请根据您的实际情况配置 */

dirty_background_ratio = 50

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值