本文将介绍如何通过修改Alibaba Cloud Linux 2/3系统中/proc/sys/vm/
目录下的参数文件,实现对系统脏页水位以及回写控制的调优。
背景信息
在 Linux 系统中,页缓存(Page Cache)用于缓存文件系统的读写操作(Buffer I/O)。在缓存写入过程中,数据首先被写入页缓存,然后由系统在特定时机通过回写(Writeback)操作将数据写入非易失性存储。在此过程中尚未执行回写的页缓存被称为脏页(Dirty Page)。为保持系统中脏页的合理水位,系统需要定期执行回写操作,或者在脏页水位达到上限时进行回写。
操作系统限制
Alibaba Cloud Linux 2。
Alibaba Cloud Linux 3。
脏页水位
脏页水位说明
如下图所示,脏页水位总体划分为三个区间:
```
(background writeback)
free run | soft throttle | hard throttle
-------------+---------------+---------------+------------>
^ ^ ^ dirty pages
dirty_background_thresh free_run dirty_thresh
```
无限流(free run)
当系统中脏页水位低于
free_run
阈值(free_run = (dirty_background_thresh + dirty_thresh) / 2)
)时,缓存写脏页的速度不会受到任何限制,此时依赖于系统后台回写任务(kupdate)周期性执行回写任务以控制系统脏页水位。软限流(soft throttle)
系统脏页水位超过
free_run
阈值时,缓存写脏页的速度就会受到一定程度的限流,抑制新增脏页的速度,从而控制系统脏页水位。这一区间被dirty_thresh
参数划分为软限流(soft throttle)与硬限流(hard throttle)两个区间。当系统脏页水位超过
free_run
阈值、但仍在dirty_thresh
阈值以下时,称为软限流(soft throttle)。此时只有当前执行缓存写操作的文件系统的脏页数量超过该文件系统的配额时,缓存写脏页的速度才会受到限制;每个文件系统的脏页配额,由过去一段时间该文件系统的平均回写带宽占系统总回写带宽的百分比,乘以thresh
阈值得到。硬限流(hard throttle)
当系统脏页水位超过
dirty_thresh
阈值时,称为硬限流(hard throttle)。此时缓存写操作的速度必定受到限制。
脏页水位配置
系统中的脏页水位由thresh
和dirty_background_thresh
参数共同控制。
dirty_background_thresh
您可以通过/proc/sys/vm/dirty_background_bytes
或/proc/sys/vm/dirty_background_ratio
参数来配置dirty_background_thresh
的阈值。
/proc/sys/vm/dirty_background_bytes
表示dirty_background_thresh
阈值,单位为字节。/proc/sys/vm/dirty_background_ratio
表示dirty_background_thresh
阈值占系统总的可用内存的百分比。
在任一时刻,/proc/sys/vm/dirty_background_bytes
和/proc/sys/vm/dirty_background_ratio
仅有一个参数有效,另一个参数必须为0。当您通过sysctl
设置其中一个参数时,另一个参数值将自动调整为0。dirty_background_thresh
默认值为系统总的可用内存的10%。
通过
dirty_background_bytes
配置阈值大小。查询
dirty_background_bytes
。sysctl -n vm.dirty_background_bytes
配置
dirty_background_bytes
。<value>
需替换为要设置阈值的大小,单位字节。sudo sysctl -w vm.dirty_background_bytes=<value>
通过
dirty_background_ratio
配置阈值占系统总可用内存的百分比。查询
dirty_background_ratio
。sysctl -n vm.dirty_background_ratio
配置
dirty_background_ratio
。<percent>
需替换为要配置阈值占系统总可用内存的百分比,例如20。sudo sysctl -w vm.dirty_background_ratio=<percent>
dirty_thresh
您可以通过/proc/sys/vm/dirty_bytes
或/proc/sys/vm/dirty_ratio
参数来配置thresh
阈值。
/proc/sys/vm/dirty_bytes
表示thresh
阈值,单位为字节。/proc/sys/vm/dirty_ratio
表示thresh
阈值占系统总的可用内存的百分比。
在任一时刻,/proc/sys/vm/dirty_bytes
和/proc/sys/vm/dirty_ratio
仅有一个参数有效,另一个参数必须为0。当您通过sysctl
设置其中一个参数时,另一个参数值将自动调整为0。thresh
默认值为系统总的可用内存的20%。
通过
/proc/sys/vm/dirty_bytes
配置阈值大小。查询
dirty_bytes
。sysctl -n vm.dirty_bytes
配置
dirty_bytes
。<value>
需替换为要设置阈值的大小,单位字节。sudo sysctl -w vm.dirty_bytes=<value>
通过
/proc/sys/vm/dirty_ratio
配置阈值占系统总可用内存的百分比。查询
dirty_ratio
。sysctl -n vm.dirty_ratio
配置
dirty_ratio
.<percent>
需替换为要配置阈值占系统总可用内存的百分比,例如20。sudo sysctl -w vm.dirty_ratio=<percent>
后台周期性性回写
当系统中脏页水位低于free_run
阈值(free_run = (dirty_background_thresh + dirty_thresh) / 2)
)时,缓存写脏页的速度不会受到任何限制,此时依赖于系统后台回写任务(kupdate)周期性执行回写任务以控制系统脏页水位。
dirty_writeback_centisecs
/proc/sys/vm/dirty_writeback_centisecs
描述周期性回写任务的周期,以百分之一秒(centisecond)为单位。该参数为0表示关闭周期性回写任务,默认值为500(即周期性回写任务的周期默认为5秒 )。
查询
dirty_writeback_centisecs
。sysctl -n vm.dirty_writeback_centisecs
配置
dirty_writeback_centisecs。
<value>
需替换为您要设置的回写任务的周期。sudo sysctl -w vm.dirty_writeback_centisecs=<value>
dirty_expire_centisecs
周期性回写任务不会无条件对所有的脏页执行回写操作,而仅对超时的脏页执行回写。当文件第一次写入脏页起,在经过一定周期后文件中仍存在脏页时,该文件即被视为超时状态。周期性回写任务的职责是对这些超时的脏页进行回写。
/proc/sys/vm/dirty_writeback_centisecs
描述了这一超时周期,以百分之一秒(centisecond)为单位。该参数的默认值为3000(即超时周期默认为30秒)。
查询
dirty_expire_centisecs
sysctl -n vm.dirty_expire_centisecs
配置
dirty_expire_centisecs
sudo sysctl -w vm.dirty_expire_centisecs=<value>