news 2026/8/18 16:08:28

为什么缓存会占满内存?Linux Page Cache原理与hcache的答案

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
为什么缓存会占满内存?Linux Page Cache原理与hcache的答案

为什么缓存会占满内存?Linux Page Cache原理与hcache的答案

【免费下载链接】hcacheshowing top X biggest cache files global项目地址: https://gitcode.com/gh_mirrors/hc/hcache

很多运维和开发者都遇到过这样的困惑:明明没跑什么大程序,free命令却显示内存被buff/cache吃掉了大半,这正是Linux Page Cache(页缓存)的"杰作"。要找出究竟哪些文件霸占了内存缓存,开源工具hcache给出了答案——它能在全系统范围内列出占用缓存最大的前 N 个文件(showing top X biggest cache files globally)。本文先带你理解 Linux Page Cache 原理,再手把手学会用 hcache 定位"缓存大户",彻底告别内存焦虑。


📌 Linux Page Cache是什么?为什么缓存会"占满"内存

Page Cache 是 Linux 内核的核心优化机制:当你读取磁盘上的文件时,内核会把文件内容以 **4KB 大小的页(page)**为单位缓存在内存中;下次再读同一文件,直接命中内存,速度提升几个数量级。写入文件时数据也会先进缓存,再由内核异步刷回磁盘。

所以执行free时看到这样的输出并不奇怪:

total used free shared buff/cache available Mem: 15.6Gi 2.1Gi 1.2Gi 302Mi 12.3Gi 13.2Gi

关键认知:buff/cache占满不是坏事。Page Cache 是"可回收"内存,当应用程序真正需要内存时,内核会立刻回收缓存页供其使用。真正要关注的是available列——它才是程序实际可用的内存。

🔍 真正的问题:到底哪些文件占用了 Page Cache?

缓存总量知道了,但新问题来了:哪些文件是缓存主力?

  • free只能看总量,说不清细节;
  • ps aux只能看进程内存,看不到文件缓存;
  • lsof只能一个一个文件地查,效率极低。

传统工具 pcstat 可以查询单个文件或单个进程的缓存情况,但结果不排序、无法全局俯瞰。hcache 正是为了解决这个痛点而诞生。

🚀 hcache是什么?一款 Page Cache 排行榜分析工具

hcache 是从 pcstat fork 出来的增强版,核心创新就是新增了--top参数。它的工作原理堪称优雅:

  1. 遍历系统所有进程,读取/proc/<pid>/maps拿到每个进程映射了哪些文件,实现见 main.go;
  2. 借助mincore(2) 系统调用,逐页判断每个文件哪些页(Page)正在缓存中,原理注释见 main.go;
  3. 按缓存大小排序,输出 Top N 结果,核心逻辑在 main.go 的top()函数。

进程信息的解析(RSS、二进制路径等)位于 pkg/utils/process_linux.go,各种表格与 JSON 输出格式则统一在 formats.go 中处理,代码结构非常清晰,值得 Go 学习者阅读。

⚡ hcache安装教程:最快的一键编译方法

hcache 采用 Go 编写,需要Go 1.12 及以上版本,安装只需三步:

git clone https://gitcode.com/gh_mirrors/hc/hcache cd hcache make build

构建完成后,把二进制复制到系统路径即可全局使用:

sudo cp hcache /usr/local/bin/

构建配置见 Makefile,项目还提供了 debian/control 和 rpm/hcache.spec 打包配置,方便在不同发行版上分发安装。

🧰 hcache用法详解:--top 一键找出缓存大户

安装完成后,一条命令就能看全局缓存排行:

sudo hcache --top 10

常用参数一览:

参数作用
-top [X]全局显示缓存占用最大的前 X 个文件(核心功能)
-pid [pid]查看指定进程打开文件的缓存情况
-bname只显示文件名,缩短超长路径的输出
-json输出 JSON 格式,方便脚本解析
-terse紧凑的机器可解析输出
-histo用 Unicode 块字符绘制直方图
-nohdr不打印表头

⚠️ 注意:-pid-top不能同时使用

📊 实战案例:读懂 hcache 输出结果

sudo hcache --top 3为例,输出如下:

+-------------------------------------------------+----------------+-------------+----------------+-------------+---------+ | Name | Size | Pages | Cached Size | Cached Pages| Percent | +-------------------------------------------------+----------------+-------------+----------------+-------------+---------+ | /opt/apps/com.visualstudio.code/files/code/code | 125.409M | 32105 | 92.593M | 23704 | 73.833 | | /usr/lib/i386-linux-gnu/libLLVM-11.so.1 | 74.384M | 19043 | 48.057M | 12303 | 64.606 | +-------------------------------------------------+----------------+-------------+----------------+-------------+---------+

各列含义:

  • Size / Pages:文件总大小与总页数;
  • Cached Size / Cached Pages:已进入 Page Cache 的大小与页数;
  • Percent:缓存占比,越高说明该文件"霸占"缓存越多。

找到嫌疑文件后,再用lsof /usr/lib/.../libQtWebKit.so.4.10.2就能揪出是谁在打开它——这就是 README 里说的 "use lsof to find out the bad guy"(找到那个"坏蛋"进程)。

❓ 常见问题(FAQ)

Q1:缓存占满内存,需要手动清理吗?一般不需要。内核会在内存紧张时自动回收 Page Cache。如果确实想立即释放,可执行echo 3 > /proc/sys/vm/drop_caches,但只建议在测试环境操作。

Q2:为什么要用 sudo 运行 hcache?读取所有进程的/proc/<pid>/maps需要 root 权限,否则只能看到部分信息。

Q3:hcache 和 free 命令有什么区别?free告诉你"有多少缓存",hcache 告诉你"是哪些文件占了缓存",两者互补。

💡 总结

Linux Page Cache 原理并不神秘——它是内核用空闲内存加速文件读写的智慧,而 hcache 则用极简的方式补上了"定位缓存大户"的最后一环。无论你是排查内存告警,还是优化程序启动速度,sudo hcache --top 10都值得成为你的第一条排查命令。下次再有人问"缓存为什么占满内存",把 hcache 的输出甩给他,就是最好的答案。

【免费下载链接】hcacheshowing top X biggest cache files global项目地址: https://gitcode.com/gh_mirrors/hc/hcache

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/18 16:06:50

Andy.scss 进阶指南:如何基于现有代码扩展属于自己的 SASS Mixins

Andy.scss 进阶指南&#xff1a;如何基于现有代码扩展属于自己的 SASS Mixins 【免费下载链接】andy Open-Source Collection of Useful SASS Mixins Library 项目地址: https://gitcode.com/gh_mirrors/an/andy Andy.scss 是一个开源、轻量、零依赖的 SASS Mixins 库&a…

作者头像 李华
网站建设 2026/8/18 16:06:30

FanControl快速上手指南:3分钟掌控Windows风扇转速曲线

FanControl快速上手指南&#xff1a;3分钟掌控Windows风扇转速曲线 【免费下载链接】FanControl.Releases This is the release repository for Fan Control, a highly customizable fan controlling software for Windows. 项目地址: https://gitcode.com/GitHub_Trending/f…

作者头像 李华
网站建设 2026/8/18 16:05:00

AutoCAD字体缺失问题怎么解?FontCenter插件一劳永逸的完整指南

AutoCAD字体缺失问题怎么解&#xff1f;FontCenter插件一劳永逸的完整指南 【免费下载链接】FontCenter AutoCAD自动管理字体插件 项目地址: https://gitcode.com/gh_mirrors/fo/FontCenter 又看到满屏问号了&#xff1f;别急着骂电脑。FontCenter是一款专为AutoCAD打造的…

作者头像 李华
网站建设 2026/8/18 16:04:55

大气层系统从入门到精通:Switch 自制固件完整实战避坑指南

大气层系统从入门到精通&#xff1a;Switch 自制固件完整实战避坑指南 【免费下载链接】Atmosphere-stable 大气层整合包系统稳定版 项目地址: https://gitcode.com/gh_mirrors/at/Atmosphere-stable 你手里的 Switch 其实是一台被层层"上锁"的掌机&#xff1…

作者头像 李华
网站建设 2026/8/18 16:00:16

在ESP32上跑起OpenCV图像处理:新手也能一次成功的完整实战指南

在ESP32上跑起OpenCV图像处理&#xff1a;新手也能一次成功的完整实战指南 【免费下载链接】esp32-opencv Shrinked OpenCV for ESP32 项目地址: https://gitcode.com/gh_mirrors/es/esp32-opencv 想象一下&#xff1a;你花了整个下午写好了一个图像处理算法&#xff0c…

作者头像 李华
网站建设 2026/8/18 15:56:45

NCSA Mosaic 2.7 的开源遗产:它对现代Web的10大深远贡献

NCSA Mosaic 2.7 的开源遗产&#xff1a;它对现代Web的10大深远贡献 【免费下载链接】ncsa-mosaic NCSA Mosaic 2.7 项目地址: https://gitcode.com/gh_mirrors/nc/ncsa-mosaic NCSA Mosaic 2.7 是世界上最早的图形化网页浏览器之一&#xff0c;也是整个现代 Web 生态的…

作者头像 李华