嵌入式分享#61:为什么find 首次搜索慢?

描述

正文

两个问题:

(1)为什么find 首次搜索慢?

(2)频繁使用 find 会吃内存吗?

最近在调试 RK3576 Android 系统时,经常需要使用 find -iname XXX 搜索文件,发现了两个有意思的现象:

第一次全局搜索,足足等了 几分钟才出结果;紧接着再执行一遍相同的命令,居然几秒就搞定了!

嵌入式

当时我心里就打了个问号:为啥同一个命令,第一次这么慢,第二次却快到离谱?

更让我有点慌的是 —— 我这一天下来,为了找各种配置文件、安装包,反复执行了几十次 find 命令。这频繁操作,会不会把系统内存 “吃” 掉?

相信不少嵌入式开发、Linux 运维的朋友,都遇到过类似的疑惑。今天就一起看看这是怎么回事?!

1 为什么 find 首次搜索慢?

核心原因:这是 Linux 系统页缓存(Page Cache) 和目录项缓存(Dentry Cache) 共同作用的结果,也是系统刻意做的性能优化。(之前也写过一篇文章《为什么要sync?》)

第 1 次 find:find 命令需要遍历目录、读取文件元数据(文件名、inode、路径等),这些数据原本只存在于硬盘中,磁盘 IO 是慢速操作(毫秒级),所以耗时久;

第 2 次 find:第一次遍历后,Linux 会自动把这些磁盘数据加载到内存的「页缓存」和「目录项缓存」中,第二次搜索直接从内存读取(纳秒/微秒级),速度提升几十到上百倍。

嵌入式

2 频繁使用 find 会不会导致内存空间减少?

结论先行:短期会占用少量内存,但不会“永久减少”,系统会自动回收,无需担心内存耗尽

1. find 占用内存的本质

find 执行时,系统会把遍历过的文件元数据(不是文件内容)加载到「页缓存」中,目的是加速后续同类操作;

这些缓存属于「可回收内存」——Linux 会优先用空闲内存做缓存(反正内存闲着也是闲着),不会占用应用程序的“活跃内存”。

2. 内存不会被永久占用的原因

Linux 内核有一套智能的缓存回收机制:

当系统有其他程序(比如你的应用、apt 安装软件)需要内存时,内核会自动释放「页缓存」占用的内存,分配给需要的程序;

即使频繁执行 find,缓存也只会缓存“最近访问的目录/文件元数据”,不会无限制增长(比如反复搜索同一个目录,缓存不会重复占用更多内存);

可以通过 free -h 查看内存状态:buff/cache 列就是缓存占用的内存,这部分内存是“可用的”,并不是“被占用且无法释放的”。

嵌入式

3 实用优化建议

缩小搜索范围(最有效):不要全局搜索 /,而是指定具体目录,既减少遍历耗时,也减少缓存占用的内存;

排除无关目录:搜索时排除 /proc、/sys、/dev 等虚拟文件系统(这些目录无实际文件,遍历纯耗时间):

 

find / -path /proc -prune -o -path /sys -prune -o -path /dev -prune -o -iname LedControl.apk -print 2>/dev/null
嵌入式

 

4 总结

第一次 find 慢的核心原因 第一次遍历需从磁盘读取文件元数据,第二次直接读内存缓存,这是 Linux 正常的性能优化机制;

频繁用 find 对内存的影响 短期会占用少量内存做缓存,但缓存是可回收的,系统会自动释放,不会导致内存永久减少或耗尽;

优化建议 缩小搜索范围,既能提升速度,也能减少不必要的缓存占用。

你有更好的find优化建议吗?或者你在使用find时遇到过哪些性能问题? 欢迎在评论区交流分享~

(完)

本人专注 Linux 驱动 & Linux/Android BSP 开发调试,可接外包项目/技术支持/问题定位。有需求或交个朋友可加微信:【Chen_WeChat2025】。

审核编辑 黄宇

 

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分