资讯动态

hcache + lsof组合拳:从缓存文件反查进程的完整排查流程

发布时间:2026/8/19 17:22:02 来源:尧图企业网站定制
hcache lsof组合拳从缓存文件反查进程的完整排查流程【免费下载链接】hcacheshowing top X biggest cache files global项目地址: https://gitcode.com/gh_mirrors/hc/hcache当服务器内存告警时free -h会告诉你buff/cache占了十几个 G但没人告诉你是哪个文件、哪个进程吃掉了缓存。本文介绍的 hcache 就是专门解决缓存文件排查问题的开源工具——它能一键列出全局占用 Page Cache 最大的 Top 文件再配合 lsof 从缓存文件反查进程5 分钟内锁定内存元凶。全程无需改代码、无需重启服务一条命令即可完成定位。为什么内存神秘消失先认识 Linux 的 Page CacheLinux 会把读过的磁盘文件缓存在内存中这部分叫Page Cache页缓存。它的本意是加速后续读取本身是好事。但当缓存文件是几个 G 的大文件数据库备份、日志、安装包时就会挤压可用内存甚至触发 OOM。问题在于free只能告诉你缓存的总量无法告诉你缓存的是哪个文件。这正是 hcache 存在的意义——它基于mincore(2)系统调用逐页检查文件是否在内存中从而精确算出每个文件的缓存占比。hcache 是什么专攻缓存文件定位的开源利器hcache 是 pcstat 的一个增强分支核心亮点是新增了--top参数扫描系统上所有进程的内存映射汇总出全局占用缓存最大的前 X 个文件并按缓存大小降序输出。它的工作逻辑很直观遍历所有进程读取/proc/pid/maps拿到每个进程映射的文件列表对应源码 main.go 的getPidMaps过滤掉 RSS 为 0 的进程pkg/utils/process.go用mincore统计每个文件被缓存的页数最后排序输出 Top 列表formats.go。也就是说hcache 帮你完成了最繁琐的收集文件 → 统计缓存环节你只需要盯住输出结果。快速安装 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/make build本质就是执行一条go build见 Makefile产物是当前目录下的hcache可执行文件拷到系统 PATH 后即可全局使用。核心用法一--top 参数快速定位最大的缓存文件这是 hcache 最实用的功能一条命令找出全系统缓存占用最大的文件sudo hcache --top 3输出是一张清晰的表格-------------------------------------------------------------------------------------------------------------------- | Name | Size │ Pages │ Cached Size │ Cached Pages│ Percent | |--------------------------------------------------------------------------------------------------------------------| | /opt/apps/cn.google.chrome/files/chrome | 170.811M | 43728 | 120.652M | 30887 | 70.634 | | /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 | |--------------------------------------------------------------------------------------------------------------------| | Sum | 370.604M | 94876 | 261.301M | 66894 | 70.507 | --------------------------------------------------------------------------------------------------------------------每列含义一目了然文件全路径、文件总大小、总页数、缓存大小、缓存页数、缓存占比。最后的 Sum 行还帮你汇总了总缓存量可以直接和free里看到的 cached 数值互相印证。如果路径太长导致表格挤爆屏幕加上--bname只显示文件名sudo hcache --top 5 --bname核心用法二--pid 查看指定进程的缓存占用如果你已经知道嫌疑进程可以用--pid单独查看它映射的所有文件的缓存情况sudo hcache --pid 20630注意--pid和--top不能同时使用二者是互斥的。查看单进程时输出会按缓存大小排序非常适合分析某个高内存进程到底背了多少个文件。关键一步用 lsof 从缓存文件反查进程拿到了 Top 缓存文件下一步就是从缓存文件反查进程。Linux 自带的lsof可以直接查询哪个进程打开了这个文件lsof /usr/lib/x86_64-linux-gnu/libQtWebKit.so.4.10.2输出示例COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME quiterss 20630 silenceshell mem REG 8,5 36462184 3936610 /usr/lib/x86_64-linux-gnu/libQtWebKit.so.4.10.2一眼就能看到这个缓存文件被 PID 为 20630、名为quiterss的进程打开了。再补一条ps确认进程详情即可ps -fp 20630完整排查流程从缓存文件反查到进程的实战演练把上面的工具串起来就是一套完整的缓存文件排查 → 进程定位流程总共四步确认缓存异常free -h观察 buff/cache 数值若长期居高不下进入下一步找出大缓存文件sudo hcache --top 10拿到缓存占用最大的文件清单反查占用进程对 Top 文件执行lsof 文件路径得到 PID 与进程名确认并处置ps -fp PID确认进程根据业务决定是保留、重启还是清理。整套流程只需 4 条命令、5 分钟以内就能完成比盲目sync echo 3 /proc/sys/vm/drop_caches清缓存要精准得多——因为你终于知道该找谁谈话了。使用注意事项需要 root 权限扫描全部进程的 maps 需要足够权限请用sudo执行否则会报Permission denied类错误数值仅供参考hcache 的缓存大小由文件大小与缓存占比推算而来源码注释中已说明并非字节级精确但用于定位大文件绰绰有余内核兼容性mincore依赖 Linux 2.6.21 内核早期内核可能返回不准确的信息输出格式多样除默认表格外还支持--json配合脚本、--terse机器解析、--histo直方图等格式方便集成进监控告警脚本。总结面对内存明明很多却被缓存占满的难题hcache 补上了 Linux 运维里缺失的一环直接告诉你缓存文件是谁。配合 lsof 从缓存文件反查进程你就能从知道缓存多进化到知道缓存的是什么、被谁占用从而做出准确的处理决策。收藏这套组合拳下次内存告警时你将是团队里最快定位问题的那个人。【免费下载链接】hcacheshowing top X biggest cache files global项目地址: https://gitcode.com/gh_mirrors/hc/hcache创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价