/proc/sys/vm下的那些dirty* - 知乎

/proc/sys/vm下的那些dirty* - 知乎

类型
Linux
URL
是否整理吸收
Date
今天,简单介绍一下/proc/sys/vm下的那些以dirty开头的参数具体有什么作用。
首先,这些参数都定义在kernel/sysctl.c中,下面依次进行介绍。
1)dirty_background_bytes/dirty_background_ratio
dirty_bytes/dirty_ratio
上面4个参数与回写阈值相关,如下代码可较清晰的看出逻辑,dirty_bytes/dirty_ratio用来设置thresh的值(当dirty_bytes不为0时,则dirty_bytes生效,dirty_ratio不生效),dirty_background_bytes/dirty_background_ratio用来设置bg_thresh的值(当dirty_background_bytes不为0时,则dirty_background_bytes生效,dirty_backgroundratio不生效)。其中,thresh/bg_thresh的单位均为page。
thresh和bg_thresh有什么用呢?从名字上看就是阈值,是关于系统中脏页数量的阈值,要搞清其作用,首先要明白什么是脏页,以及脏页是如何产生的。
简言之,脏页是等待被同步到外存设备但目前仍仅驻留在内存中的数据。很明显,一旦重启这些数据就会丢失,因此需要一个机制将脏页合理的同步到外存。
脏页是如何产生的呢?举个例子,进程写文件就会产生脏页(不限于这一条途径)。
进程结构中,成员nr_dirited表明当前进程脏页数量,初始值为0。nr_dirtied_pause是一个限制值,初始为32,即允许128KB脏页。
进程写文件,nr_dirtied值会增加,每写一个page就会增加1,并每次都会在balance_dirty_pages_ratelimited中查看nr_dirtied值是否达到nr_dirtied_pause的限制值,如果达到则启动脏页平衡机制(balance_dirty_pages)。
在脏页平衡中,就会用到thresh和bg_thresh
2)dirty_expire_centisecs
默认值30 * 100,即3000毫秒,是脏数据可持续的最长时间,超过该时间脏数据必须完成同步。
3)dirtytime_expire_seconds
默认值12 * 60 * 60,即12小时。一个inode在12小时内未存在任何更新,则很可能其时间戳在过去的12小时内存在过变更,比如lazy方式更新。因此系统默认以12小时为周期的强制查看inode是否存在时间戳变更,避免文件时间戳更新过于迟滞。
4)dirty_writeback_centisecs
默认500ms,如果inode被标记为dirty,就会确保500ms后唤醒wb进行后台回写,减小该值可加快元数据的同步。

Loading Comments...