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

#### 原理

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


#### 使用方法

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

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

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

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

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