讲师中心 微信公众号
AI工具推荐 视频效率加速

Linux文件系统缓存机制_IO性能影响解析【教程】

夏辰大大_5280

夏辰大大_5280

发布时间:2025-12-30 20:40:02

|

840人浏览过

|

来源于php中文网

原创

Page Cache 是 Linux 内核强制介入 I/O 路径的内存缓存机制,所有常规 read()/write() 均经过它;它加速重复读、聚合写,但导致 dd 或 cat 测速虚高或二次执行极快;绕过需 O_DIRECT(严格对齐且禁用 mmap),代价是丧失内核优化。

linux文件系统缓存机制_io性能影响解析【教程】

Linux 的文件系统缓存(Page Cache)不是“可选优化”,而是 I/O 路径中默认强制介入的环节——所有常规 read() / write() 系统调用都会经过它,绕不开,也关不掉(除非换接口或改内核)。

Page Cache 是什么,为什么它总在“偷偷”影响你的 dd 或 cat

Page Cache 是内核管理的一块内存区域,用于缓存磁盘文件的页(page),本质是把最近读过或即将写入的数据暂存在 RAM 中。它的存在让重复读变快、顺序写聚合、小写批量刷盘——但也会导致你测出的 dd if=/dev/zero of=test bs=4K count=10000 速度虚高(实际写入还没落盘),或者 cat large.log | grep pattern 第二次快得离谱(全在内存里搜了)。

关键点:

  • open() 默认启用缓存;想绕过必须显式加 O_DIRECT 标志(且要求对齐、不能与 mmap 混用)
  • write() 返回成功 ≠ 数据已写入磁盘,只表示进了 Page Cache;落盘由 pdflush 或 writeback 机制异步触发
  • read() 命中缓存时,耗时是纳秒级;未命中则触发真实磁盘 I/O,毫秒级起步

如何判断当前操作是否受 Page Cache 干扰

别猜,看 /proc/meminfo 和 /proc/sys/vm/stat。最直接的方式是对比两次相同操作的耗时,并观察缓存状态变化:

echo 3 > /proc/sys/vm/drop_caches  # 清空 pagecache + dentries + inodes(仅用于测试!)
time dd if=/dev/sda1 of=/dev/null bs=1M count=1000
cat /proc/meminfo | grep -i "cached\|buffers"

再跑一次 dd,如果第二轮明显更快且 Cached: 值大幅上升,说明 Page Cache 正在起作用。

注意:

python-script-generator
python-script-generator

快速生成专业的 Python 脚本和应用代码。一键创建完整项目结构,支持CLI、API、爬虫、Bot、Django等多种项目类型,包含完整的项目结构、配置文件、依赖管理、测试、README和文档。

下载
  • drop_caches 只清空干净页(clean pages),脏页(dirty pages)仍会保留并等待 writeback
  • Buffers: 是块设备层缓存(如 ext4 日志元数据),和 Page Cache 分属不同层级,但常被一起提及
  • 生产环境禁止周期性执行 drop_caches,它会强制驱逐有效缓存,反而恶化性能

O_DIRECT 能否彻底绕过缓存?代价是什么

可以绕过 Page Cache,但代价显著:每次 I/O 都直通块设备,失去内核缓冲、预读、写聚合等优化。它适合数据库等自己做缓存的场景,不适合普通应用。

使用前提严格:

  • 用户缓冲区地址和长度必须按硬件扇区对齐(通常是 512B 或 4K)
  • 文件 offset 和 read()/write() 长度也需对齐
  • 不能与 mmap() 同一文件混用(可能引发 SIGBUS)
  • 部分文件系统(如 XFS)对 O_DIRECT 支持更稳定;ext4 在某些版本有 bug

示例(Python 中打开文件):

import os
fd = os.open("/tmp/test", os.O_RDWR | os.O_DIRECT)
# 注意:buffer 必须是 memoryview 或 ctypes 数组,且地址对齐

影响 I/O 性能的关键 tunables(不是“调优万金油”)

内核提供了几个可调参数,但多数情况下不该动,默认值已适配通用负载。真要调整,务必结合 iostat -x 1 和 vmstat 1 观察效果:

  • /proc/sys/vm/dirty_ratio:内存中脏页占比上限(默认 20%),超限后进程会阻塞写入直到回写启动
  • /proc/sys/vm/dirty_background_ratio:后台回写启动阈值(默认 10%),设太低会导致频繁唤醒 writeback 线程
  • /proc/sys/vm/vfs_cache_pressure:控制 dentry/inode 缓存回收倾向,值越高越激进(默认 100)

这些参数的作用对象是“缓存策略”,不是“开关”。调错反而会让 Page Cache 更早被踢出,增加磁盘压力。

真正需要关注的,是你的应用是否在误用缓存——比如反复 read() 小文件却不 close,或写完没 fsync() 却以为数据已持久化。

相关文章

数码产品性能查询
数码产品性能查询

该软件包括了市面上所有手机CPU,手机跑分情况,电脑CPU,电脑产品信息等等,方便需要大家查阅数码产品最新情况,了解产品特性,能够进行对比选择最具性价比的商品。

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

PixTV
PixTV Hot

PixTV是一款面向AIGC内容创作的AI视频生成工具。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

讯飞智作

讯飞智作是一款AI视频创作工具,AI文本配音工具,数字人课程、营销视频制作。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

Loomy
Loomy Hot

一款AI工具,主要用于科大讯飞发布的桌面级 AI 助理,比 OpenClaw 更易用、更安全!,适合需要提升相关任务效率的用户。

SkildArt
SkildArt Hot

SkildArt是一款AI文本写作工具,一站式 AI 视觉创作平台。

切问学术

切问学术是一款AI论文写作工具,复旦大学NLP团队推出的AI学术智能体。

UpDream
UpDream Hot

一款AI视频创作工具,主要用于哔哩哔哩推出的自研AI视频创作工具,适合需要提升相关任务效率的用户。

相关专题

更多
counta和count的区别
counta和count的区别

Count函数用于计算指定范围内数字的个数,而CountA函数用于计算指定范围内非空单元格的个数。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2708

2023.11.20

硬盘接口类型介绍
硬盘接口类型介绍

硬盘接口类型有IDE、SATA、SCSI、Fibre Channel、USB、eSATA、mSATA、PCIe等等。详细介绍:1、IDE接口是一种并行接口,主要用于连接硬盘和光驱等设备,它主要有两种类型:ATA和ATAPI,IDE接口已经逐渐被SATA接口;2、SATA接口是一种串行接口,相较于IDE接口,它具有更高的传输速度、更低的功耗和更小的体积;3、SCSI接口等等。

3088

2023.10.19

PHP接口编写教程
PHP接口编写教程

本专题整合了PHP接口编写教程,阅读专题下面的文章了解更多详细内容。

4529

2025.10.17

php8.4实现接口限流的教程
php8.4实现接口限流的教程

PHP8.4本身不内置限流功能,需借助Redis(令牌桶)或Swoole(漏桶)实现;文件锁因I/O瓶颈、无跨机共享、秒级精度等缺陷不适用高并发场景。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

3709

2025.12.29

java接口相关教程
java接口相关教程

本专题整合了java接口相关内容,阅读专题下面的文章了解更多详细内容。

406

2026.01.19

线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

3798

2023.08.10

数据库三范式
数据库三范式

数据库三范式是一种设计规范,用于规范化关系型数据库中的数据结构,它通过消除冗余数据、提高数据库性能和数据一致性,提供了一种有效的数据库设计方法。本专题提供数据库三范式相关的文章、下载和课程。

2465

2023.06.29

如何删除数据库
如何删除数据库

删除数据库是指在MySQL中完全移除一个数据库及其所包含的所有数据和结构,作用包括:1、释放存储空间;2、确保数据的安全性;3、提高数据库的整体性能,加速查询和操作的执行速度。尽管删除数据库具有一些好处,但在执行任何删除操作之前,务必谨慎操作,并备份重要的数据。删除数据库将永久性地删除所有相关数据和结构,无法回滚。

3761

2023.08.14

LLVM自定义Pass怎么写
LLVM自定义Pass怎么写

本专题聚焦LLVM自定义Pass开发,整理Pass类结构、run()方法、PreservedAnalyses、CMake构建、插件注册、-load-pass-plugin加载和测试用例编写流程。

80

2026.09.30

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Buffalo框架快速入门指南
Buffalo框架快速入门指南

共0课时 | 0人学习

Valgrind支持平台说明
Valgrind支持平台说明

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn