尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

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

为什么缓存会占满内存?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参数。它的工作原理堪称优雅遍历系统所有进程读取/proc/pid/maps拿到每个进程映射了哪些文件实现见 main.go借助mincore(2) 系统调用逐页判断每个文件哪些页Page正在缓存中原理注释见 main.go按缓存大小排序输出 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找到那个坏蛋进程。❓ 常见问题FAQQ1缓存占满内存需要手动清理吗一般不需要。内核会在内存紧张时自动回收 Page Cache。如果确实想立即释放可执行echo 3 /proc/sys/vm/drop_caches但只建议在测试环境操作。Q2为什么要用 sudo 运行 hcache读取所有进程的/proc/pid/maps需要 root 权限否则只能看到部分信息。Q3hcache 和 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),仅供参考
返回列表