Linux fincore 怎样使用字节单位输出驻留大小
来源:17golang原创
时间:2026-10-30 19:15:57 369浏览 收藏
如果你用 fincore 查看文件缓存,最容易误读的地方是把“驻留页数”当成了“驻留字节数”。解决方法很直接:给命令加上 --bytes,再用 --output 明确脚本要消费的列。这样既能读懂一次排障结果,也能避免默认列在后续版本变化时影响自动化。
官方地址:https://github.com/util-linux/util-linux/blob/master/misc-utils/fincore.1.adoc
需要按字节看驻留大小时,优先使用fincore --bytes 文件;需要进入脚本时,再叠加--output固定列名。--bytes改变的是显示单位,不是把文件重新读入内存。
先分清 fincore 输出的两个单位
fincore 统计的是文件内容当前有多少页驻留在内存中。页数适合观察内核层面的数量,但排查“这个文件占了多少缓存空间”时,字节更容易和文件大小、容量预算放在一起比较。这里的驻留大小是观察结果,不代表文件完整内容一定都在内存里。
默认输出还可能包含缓存页、脏页、回写页等列,具体列集合不应该被脚本悄悄假定。官方手册明确建议在需要稳定输出时使用 --output columns-list,因此本题的两个开关分别解决“单位”和“接口稳定性”问题。
用 --bytes 直接输出驻留字节
先对一个明确的文件查看结果:
# 用字节单位显示文件当前驻留内存,路径替换成实际目标 fincore --bytes ./data/events.log
如果要同时观察多个文件,可以继续把路径放在同一条命令中:
# 多个文件一起统计,便于比较驻留大小 fincore --bytes ./data/events.log ./data/index.db
阅读时重点看输出中的驻留字节列,而不是只看第一列数字。不同 util-linux 版本的默认展示可能有所调整,正式脚本不要依赖“第几列”这种位置判断。

用 --output 给脚本固定列名
需要被 Shell、监控采集器或配置管理脚本读取时,建议显式列出字段。列名以当前命令的 --help 输出为准,下面给出一组围绕文件名、驻留页和驻留字节的写法:
# 固定脚本关心的列,避免依赖默认列顺序 fincore --bytes --output filename,resident,resident_bytes ./data/events.log
如果当前系统的 --help 没有列出某个字段,就不要把它硬写进脚本;先根据本机可用列调整清单。这个检查比复制一条跨发行版的固定命令更稳妥。
若希望去掉表头,可以加 --noheadings,但只有在下游已经知道每一列的含义时才这样做:
# 去掉表头后交给已有的定列解析器,列顺序仍由 --output 决定 fincore --bytes --noheadings --output filename,resident,resident_bytes ./data/events.log

总计和目录统计怎么组合
查看一组文件的合计值时使用 --total:
# 在同一单位下生成文件集合的总计,方便与缓存预算比较 fincore --bytes --total ./data/events.log ./data/index.db
如果目标是目录,需要递归检查目录内文件,可加入 --recursive:
# 递归检查目录中的文件,并按字节单位显示驻留信息 fincore --bytes --recursive ./data
--total 和 --recursive 解决的是范围问题,--bytes 解决的是显示单位问题。把它们分开理解,出现结果不符合预期时更容易定位到底是路径范围还是单位造成的误会。
cachestat、mincore 与权限差异
当前手册说明,fincore 会优先使用 cachestat(2) 统计;如果系统没有该系统调用,且没有强制要求使用它,就会回退到 mincore(2)。因此,同一条命令在不同内核环境中的底层路径可能不同,但 --bytes 仍然是输出层的单位选择。
两者还有一个实际边界:没有写权限时,cachestat(2) 可能返回错误;mincore(2) 出于安全原因可能给出保守的“全部驻留”假数据。遇到权限相关结果时,不要只根据数字判断缓存状态,应同时记录文件权限、内核能力和 fincore 的错误信息。
对多个文件执行统计时,某个文件出错并不一定会让后续文件停止;手册说明 fincore 会把错误写到标准错误并继续处理命令行中的其他文件。这正是批量排障时要分别保存标准输出和标准错误的原因。
给自动化脚本留下稳定入口
把前面的原则合并起来,可以得到一条更适合脚本维护的命令:
# 明确单位、列名和目录范围,便于后续解析与复查 fincore --bytes --recursive --output filename,resident,resident_bytes ./data
落地时再补三点:第一,脚本启动阶段用 fincore --help 确认当前发行版支持的列名;第二,不要把默认输出当成稳定接口;第三,把标准错误单独记录,避免把权限问题误当成零驻留或全驻留。
如果只需要人工看一次结果,fincore --bytes 文件 已经足够;如果要汇总目录或交给程序解析,就组合 --recursive、--total 或 --output,并在脚本注释中写明单位和列语义。
常见疑问
加了 --bytes 会改变缓存状态吗?
不会。它用于改变输出的计量单位,不是预读、回收或刷新文件缓存的操作。
为什么脚本不应该直接解析默认输出?
因为默认列集合可能变化。显式使用 --output 才能把脚本依赖的字段写清楚。
权限不足时怎样判断结果是否可信?
同时查看标准错误、文件权限以及当前内核是否支持 cachestat;不要把 mincore 的保守结果直接当作精确缓存占用。
总结
--bytes 让 fincore 的驻留数据更容易和文件容量、缓存预算对照;--output 让这份结果成为可维护的脚本接口;--total 与 --recursive 则控制统计范围。掌握这三个层次后,看到“驻留大小”时就不会再把页数、字节数和底层系统调用混成一个概念。
-
392 收藏
-
Golang · Go教程 | 4个月前 | channel · select · Context · Go教程 · 性能排查 · select channel context default time.Ticker Go教程 CPU飙高 for select459 收藏
-
395 收藏
-
Golang · Go教程 | 3个月前 | golang · Timer · 并发编程 · time.After · 性能排查 · time.After go timer Go 1.23 NewTimer Timer.Reset Timer.Stop403 收藏
-
425 收藏
-
329 收藏
-
409 收藏
-
107 收藏
-
251 收藏
-
269 收藏
-
209 收藏
-
332 收藏
-
481 收藏
-
373 收藏
-
279 收藏
-
183 收藏
-
102 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 立即学习 543次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 立即学习 516次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 立即学习 500次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 立即学习 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 立即学习 485次学习