如何调优系统的脏页水位以及脏页回写配置

更新时间:2025-03-06 09:54

本文将介绍如何通过修改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)。此时缓存写操作的速度必定受到限制。

脏页水位配置

系统中的脏页水位由threshdirty_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>
  • 本页导读 (1)
  • 背景信息
  • 操作系统限制
  • 脏页水位
  • 脏页水位说明
  • 脏页水位配置
  • 后台周期性性回写
  • dirty_writeback_centisecs
  • dirty_expire_centisecs
文档反馈