竹笋

首页 » 问答 » 灌水 » Linux脏数据回刷参数与调优计算机j
TUhjnbcbe - 2023/10/27 17:33:00
白癜风治疗最好医院电话 https://wapyyk.39.net/hospital/89ac7_map.html

简介

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

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

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

Linux视频教程基础Shell高级编程实战/Nginx/redis运维在线课程淘宝¥88购买已下架

配置概述

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

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

XXX_ratio和XXX_bytes是同一个配置属性的不同计算方法,优先级XXX_bytesXXX_ratio可用内存并不是系统所有内存,而是freepages+reclaimablepages脏数据超时表示内存中数据标识脏一定时间后,下次回刷进程工作时就必须回刷回刷进程既会定时唤醒,也会在脏数据过多时被动唤醒。dirty_background_XXX与dirty_XXX的差别在于前者只是唤醒回刷进程,此时应用依然可以异步写数据到Cache,当脏数据比例继续增加,触发dirty_XXX的条件,不再支持应用异步写。配置示例

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

场景1:尽可能不丢数据

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

/*此配置不一定适合您的产品,请根据您的实际情况配置*/dirty_background_ratio=5dirty_ratio=10dirty_writeback_centisecs=50dirty_expire_centisecs=

这样的配置有以下特点:

当脏数据达到可用内存的5%时唤醒回刷进程当脏数据达到可用内存的10%时,应用每一笔数据都必须同步等待每隔ms唤醒一次回刷进程内存中脏数据存在时间超过1s则在下一次唤醒时回刷由于发生交通事故时,行车记录仪随时可能断电,事故前1~2s的数据尤为关键。因此在保证性能满足不丢帧的情况下,尽可能回刷数据。

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

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

场景2:追求更高性能

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

这样的配置有以下特点:

当脏数据达到可用内存的50%时唤醒回刷进程当脏数据达到可用内存的80%时,应用每一笔数据都必须同步等待每隔20s唤醒一次回刷进程内存中脏数据存在时间超过s则在下一次唤醒时回刷与场景1相比,场景2的配置通过增大Cache,延迟回刷唤醒时间来尽可能缓存更多数据,进而实现提高性能

场景3:突然的IO峰值拖慢整体性能

什么是IO峰值?突然间大量的数据写入,导致瞬间IO压力飙升,导致瞬间IO性能狂跌,对行车记录仪而言,有可能触发视频丢帧。

这样的配置有以下特点:

当脏数据达到可用内存的5%时唤醒回刷进程当脏数据达到可用内存的80%时,应用每一笔数据都必须同步等待每隔5s唤醒一次回刷进程内存中脏数据存在时间超过30s则在下一次唤醒时回刷这样的配置,通过增大Cache总容量,更加频繁唤醒回刷的方式,解决IO峰值的问题,此时能保证脏数据比例保持在一个比较低的水平,当突然出现峰值,也有足够的Cache来缓存数据。

内核代码实现

知其然,亦要知其所以然。翻看内核代码,寻找配置的实现,细细品味不同配置的细微差别。

基于内核代码版本:5.5.15

sysctl文件

在kernel/sysctl.c中列出了所有的配置文件的信息。

为了避免文章篇幅过大,我只列出了关键的3个配置项且不深入代码如何实现。

我们只需要知道,我们修改/proc/sys/vm配置项的信息,实际上修改了对应的某个全局变量的值。

每个全局变量都有默认值,追溯这些全局变量的定义

总结如下:

回刷进程

通过psaux,我们总能看到writeback的内核进程

这实际上是一个工作队列对应的进程,在default_bdi_init()中创建。

回刷进程的核心是函数wb_workfn(),通过函数wb_init()绑定。

唤醒回刷进程的操作是这样的

表示唤醒的回刷任务在工作队列writeback中执行,这样,就把工作队列和回刷工作绑定了。

我们暂时不探讨每次会回收了什么,

1
查看完整版本: Linux脏数据回刷参数与调优计算机j