---
title: 调整脏数据刷新策略，减小磁盘的I/O压力
description: "PageCache中需要回写到磁盘的数据为脏数据。在应用程序通知系统保存脏数据时，应用可以选择直接将数据写入磁盘（O_DIRECT），或者先写到PageCache（非O_DIRECT模式）。非O_DIRECT模式，对于缓存在PageCache中的数据的操作，都在内存中进行，减少了对磁盘的操作。"
url: https://www.hikunpeng.com/document/detail/zh/perftuning/tuningtip/kunpengtuning_12_0038.html
sourcePath: /source/zh/perftuning/tuningtip/kunpengtuning_12_0038.html
indexId: e43461dddb8831b742a9a22225cb9ec35a49243a166f7145bd7d69c6e3e980aa58
---
# 调整脏数据刷新策略，减小磁盘的I/O压力

#### 原理

PageCache中需要回写到磁盘的数据为脏数据。在应用程序通知系统保存脏数据时，应用可以选择直接将数据写入磁盘（O_DIRECT），或者先写到PageCache（非O_DIRECT模式）。非O_DIRECT模式，对于缓存在PageCache中的数据的操作，都在内存中进行，减少了对磁盘的操作。


#### 修改方式

系统中提供了以下参数来调整策略：

1. /proc/sys/vm/dirty_expire_centisecs此参数用于表示脏数据在缓存中允许保留的时长，即时间到后需要被写入到磁盘中。此参数的默认值为30s（3000 个0.01秒）。如果业务的数据是连续性的写，可以适当调小此参数，这样可以避免I/O集中，导致突发的I/O等待。可以通过echo命令修改：
  1 echo 2000 > /proc/sys/vm/dirty_expire_centisecs

2. /proc/sys/vm/dirty_background_ratio脏页占用总内存最大的比例（以memfree+Cached-Mapped为基准），超过这个值，pdflush线程会刷新脏页面到磁盘。增加这个值，系统会分配更多的内存用于写缓冲，因而可以提升写磁盘性能。但对于磁盘写入操作为主的业务，可以调小这个值，避免数据积压太多最后成为瓶颈，可以结合业务并通过观察await的时间波动范围来识别。此值的默认值是10，可以通过echo来调整：
  1 echo 8 > /proc/sys/vm/dirty_background_ratio

3. /proc/sys/vm/dirty_ratio为脏页占用总内存最大的比例，超过这个值，系统不会新增脏页面，文件读写也变为同步模式。文件读写变为同步模式后，应用程序的文件读写操作的阻塞时间变长，会导致系统性能下降。此参数的默认值为40，对于写入为主的业务，可以增加此参数，避免磁盘过早地进入到同步写状态。

如果增加了脏数据的缓存大小和时间，在意外断电情况下，丢失数据的概率会增加。因此对于需要立即存盘的数据，应该采用O_DIRECT模式避免关键数据的丢失。
