---
title: 文件缓存机制选择
description: "内存访问速度要高于磁盘，应用程序在读写磁盘时，通常会经过一些缓存，以减少对磁盘的直接访问，如下图所示："
url: https://www.hikunpeng.com/document/detail/zh/perftuning/tuningtip/kunpengtuning_12_0047.html
sourcePath: /source/zh/perftuning/tuningtip/kunpengtuning_12_0047.html
indexId: 335660464bcf8e2a4eb5c8035c56de4700e41fbe974ad16ac7db3ed2310e8e1158
---
# 文件缓存机制选择

#### 原理

内存访问速度要高于磁盘，应用程序在读写磁盘时，通常会经过一些缓存，以减少对磁盘的直接访问，如下图所示：


clib buffer：是用户态的一种数据缓存机制，在启用clib buffer的情况下，数据从应用程序的buffer拷贝至clib buffer后，并不会立即将数据同步到内核，而是缓冲到一定规模或者主动触发的情况下，才会同步到内核；当读取数据时，会优先从clib buffer查询数据。这个机制能减少用户态和内核态的切换（用户态切换内核态占用一定资源）。

PageCache：是内核态的一种文件缓存机制，用户在读写文件时，先操作PageCache，内核根据调度机制或者被应用程序主动触发时，会将数据同步到磁盘。PageCache机制能减少磁盘访问。


#### 修改方式

应用程序根据自己的业务特点选择合适的文件读写方式：

- fread/fwrite函数使用了clib buffer缓存机制，而read/write并没有使用，因此fread/fwrite比read/write多一层内存拷贝，即从应用程序buffer至clib buffer的拷贝，但是fread/fwrite比read/write有更少的系统调用。因此对于每次读写字节数较大的操作，内存拷贝比系统调用占用更多资源，可以使用read/write来减少内存拷贝；对于每次读写字节数较少的操作，系统调用比内存拷贝占用更多资源，建议使用fread/fwrite来减少系统调用次数。
- O_DIRECT模式没有使用PageCache，因此少了一层内存拷贝，但是因为没有缓冲导致每次都是从磁盘里读取数据。
  O_DIRECT主要适用场景为：应用程序有自己的缓存机制；数据读写一次后，后面不再从磁盘读这个数据。
