查找/ ls缓存


10

好像我是第一次运行findls在目录上运行,需要一段时间。但是,此后每次都非常快,就好像目录的内容列表已在某处缓存或建立索引一样。

有没有办法在计算机重新启动后保留此缓存?


1
它确实已缓存。Linux使用未使用的内存作为缓存和缓冲区(这是即使具有“足够”的RAM的情况下也应该始终进行一些交换的原因之一)。free命令显示多少可用空间。不确定在重新启动之间进行缓存有多大意义,启动之间可能会有很多变化。如何使cron作业每10,30分钟以最低的优先级运行,以简单地浏览所有文件?应始终保持缓存相对最新。也认为有一种方法(用于内核)可以检测文件更改。
巴德·科珀罗德

Answers:


8

您可以使用vmtouch将文件添加到页面缓存(磁盘缓存)中。

nohup vmtouch -dl <files or directories> &你的/etc/rc.local文件添加和锁定文件插入启动你的页面缓存。如果要将文件添加到页面缓存中,但又不想将其锁定到内存中,请使用该-t标志而不是这些-ld标志。

有关页面缓存的更多信息,请参见此处此处Wikipedia


该命令在Ubuntu中似乎不可用-我可以尝试其他方法吗?
理查德

@Richard自己编译vmtouch很容易:安装build-essential软件包。下载vmtouch.c。运行gcc -O2 -o vmtouch vmtouch.cmake vmtouch,您将获得二进制文件vmtouch,然后可以将其复制到/usr/local/bin或通过进行调用./vmotouch
jofel

@Richard我不使用Ubuntu,所以我没有对此进行测试,也没有任何责任,只是谷歌搜索了“ Ubuntu mvtouch”,提出了这个ppa
terdon

@jofel,是的,它很容易编译-谢谢。我只喜欢在可能的情况下使用软件包。
理查德

@Evan,如果我错了,请纠正我,但是不会将其vmtouch用作启动命令会减慢整个工作速度吗?我的希望是保留跨引导的缓存,而不是(昂贵地)每次重新生成缓存。
理查德

2

我怀疑“重启后保留”。但是,您可以在启动时轻松地重建缓存,这几乎可以完成相同的事情,只是需要很小的延迟。

创建一个文件/etc/cron.d/rebuild-fs-cache,并将以下内容放入其中:

@reboot root /usr/bin/nice -n 19 /usr/bin/ionice -c 3 -t /usr/bin/find / >/dev/null 2>&1

这使用niceionice(默认情况下应安装,并且肯定可以通过软件包管理器获得; Debian 分别将它们放在coreutils和中util-linux)将find进程的优先级降低到尽可能好的水平,这意味着它不应干扰其他任何事情。在您的系统上运行,但需要更长的时间才能完成。find本身将经历stat()所有事情,这迫使内核将文件系统数据从磁盘加载到内存中。

一旦构建了缓存,只要由于操作系统需要内存来存放其他东西而没有清除缓存,就应该对其进行维护。我一直在使用这一段时间和目录列表,即使在大的目录是显著比没有上述cron作业速度更快,虽然我不能举出任何确切的数字。


1
如果您要重新发明轮子,不妨使用locate附带的updatedb来更新定位数据库:en.wikipedia.org/wiki/Locate_
Unix

@laebshade我一点都不用locate,但是我经常使用ls。偶尔find。(此外,find和ls是OP询问的特定命令。)find此处的使用点是,它会调用stat()遍历存储中的所有内容,因此内核必须将元数据加载到内存中。一旦存在,就好象它是在重新启动过程中存储的一样。
CVn
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.