ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

hcache --top深度解析:如何快速揪出内存中的缓存元凶

hcache --top深度解析:如何快速揪出内存中的缓存元凶 hcache --top深度解析如何快速揪出内存中的缓存元凶【免费下载链接】hcacheshowing top X biggest cache files global项目地址: https://gitcode.com/gh_mirrors/hc/hcache你是不是也遇到过这样的场景服务器内存明明还有很多剩余但free显示 cached 占了十几个 G却根本不知道是哪些文件吃掉了这些缓存hcache正是一款专治这个问题的缓存分析工具——它是 fork 自 pcstat 的开源项目最大的亮点就是hcache --top命令可以一键列出全局占用 page cache 最大的缓存文件排行让你秒速定位内存中的缓存元凶。为什么需要缓存分析工具free 命令看不到的真相Linux 会利用空闲内存缓存磁盘文件这本身是好事能显著提升读写性能。但问题在于free只能告诉你缓存总量/proc/meminfo也只能看到Cached的总数没有任何一个命令能直接告诉你到底是哪个文件占用了最多的缓存。传统排查姿势是先用ps aux猜哪个进程吃内存再用pcstat --pid [pid]逐个看但结果既不排序也不直观效率极低。而 hcache 的--top模式直接扫遍全系统的进程映射文件一次性给出全局缓存文件 TOP 排行随后再用lsof顺藤摸瓜找到幕后黑手即可。hcache --top 快速上手一键查看全局最大缓存文件第一步克隆源码并编译hcache 由 Go 编写需要 Go 1.12 环境源码里自带 Makefile编译只需两步git clone https://gitcode.com/gh_mirrors/hc/hcache cd hcache make build sudo cp hcache /usr/local/bin/第二步运行 --top 查看缓存排行直接执行注意需要 sudo 权限读取所有进程的映射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 | --------------------------------------------------------------------------------------------------------------------一眼就能看出Chrome 的可执行文件占了 120M 缓存是当之无愧的缓存元凶。读懂输出缓存文件分析结果逐列拆解hcache 输出的每一列都很有价值格式化逻辑见 formats.go列名含义Name文件完整路径加-bname后只显示文件名Size文件总大小自动换算成 K/M/G 等单位Pages文件占用的内存页总数Linux 默认页大小 4KCached Size被缓存的部分有多大估算值Cached Pages实际缓存了多少个页Percent缓存占比百分比越高说明该文件越活跃最后一行Sum还会自动汇总所有文件的总量方便你评估整体缓存规模。5 个实用参数组合把 hcache 用出花来除了--tophcache 还继承了 pcstat 的丰富参数灵活组合能覆盖绝大多数排查场景--top 20 --bname只看文件名快速识破伪装路径太长会刷屏用 basename 模式让结果更清爽一眼扫过就能记住关键文件。-json输出 JSON接入监控脚本配合定时任务把缓存排行落库长期观察哪些文件是内存的常驻大胃王。-terse极简输出配合 grep/awk 二次处理逗号分隔的name,size,pages,cached,percent格式方便写管道命令自动告警。-histo直方图模式可视化缓存分布用 Unicode 色块直观展示文件哪些页被缓存、哪些没有适合快速判断缓存是否碎片化终端宽度计算见 winsize.go。--pid 1234锁定单进程深挖特定程序不想要全局排行时直接分析某个进程打开了哪些缓存文件注意它和--top不能同时使用。找到可疑文件后配合系统自带的lsof就能锁定占用它的进程比如lsof /usr/lib/x86_64-linux-gnu/libQtWebKit.so.4.10.2原理浅析hcache 是如何统计缓存的不用读源码也能理解它的核心思路其实只有三步入口逻辑见 main.go枚举全部进程遍历/proc目录下所有数字命名的目录读取每个进程的状态见 pkg/utils/process.go 与 pkg/utils/process_linux.go过滤掉内存占用为 0 的进程。收集被映射的文件解析每个进程的/proc/[pid]/maps把所有以/开头的文件路径汇总去重——这些就是系统当前正在被使用的文件全集。调用 mincore(2) 逐文件统计对每个文件调用mincore系统调用判断它的哪些页默认 4K已经进入 page cache累加后按缓存大小降序排序截取前 N 名输出。整个过程全自动完成不需要你手动去猜进程这也是它比ps pcstat 组合拳高效的原因。值得一提的是mincore是 Linux 特有的系统调用所以 hcache 只支持 Linux 平台CentOS 7、Ubuntu 16.04 及以上均测试通过。常见问题 FAQQ为什么必须用 sudo因为要读取所有进程的/proc/[pid]/maps普通用户权限不足只能看到自己的进程结果会不完整。QCached Size 为什么是估算值page cache 按页统计无法精确换算成字节数hcache 用文件大小 × 缓存占比来估算有参考价值但不保证精确源码中也有注释说明这一点。Q--top和--pid能一起用吗不能两者是互斥模式--top是全局扫描--pid是单进程分析。Q输出乱码/表格错位怎么办老版本终端可以加-plain去掉制表符边框或加-nohdr隐藏表头节省空间。总结hcache 用一句简单的hcache --top就解决了全局缓存文件排行这个老大难问题从free的只见总量到逐文件定位排查内存缓存占用从猜谜游戏变成了按图索骥。无论是日常巡检、性能调优还是排查内存异常占用把它装进你的运维工具箱绝对物超所值。现在就git clone一份源码试试用sudo hcache --top 10看看你机器上最大的缓存元凶是谁吧【免费下载链接】hcacheshowing top X biggest cache files global项目地址: https://gitcode.com/gh_mirrors/hc/hcache创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表