2个版本
0.0.0-b1 | 2023年5月5日 |
---|
#1059 in 文件系统
41KB
803 行
roracache
(只读预读缓存)是一个FUSE文件系统,它提供了文件系统树中某个部分的缓存版本。
简而言之,如果您有一个非常慢的网络共享 /mnt/bigbox
,您可以使用 roracache /mnt/bigbox /mnt/bigbox_fast
,并且对 /mnt/bigbox_fast
的任何访问都将与对 /mnt/bigbox
的访问相同,除了会有大量的激进缓存和预读。
roracache
专门设计用于在网络上共享媒体收藏,并且不希望忍受各种文件对话框等操作速度极慢,或者您的媒体播放软件永远不会缓冲足够的数据以抵御短暂的连接中断而不会以其他方式出现异常。(看着你,VLC。)
如果标准输出是终端,roracache
将使用 liso
显示友好的状态显示,显示哪些文件已打开以及它们的缓冲状态。如果您不希望这样,请将标准输出重定向到 /dev/null
。
需求
- Rust编译器
- FUSE
- FreeBSD:系统自带
fusefs
,但可能需要添加到您的loader.conf
。 - Linux:FUSE几乎总是随Linux系统一起提供。(如果它没有,您可能已经知道如何解决这个问题。)
- macOS:获取 macFUSE。
- OpenBSD:系统自带
fuse
。 - Windows:抱歉,由于其本质,FUSE需要UNIX系统。
- FreeBSD:系统自带
安装
cargo install roracache
注意事项
roracache
不支持写入。它是一个只读缓存。roracache
如果文件身份大量改变,则很容易混淆,例如通过添加、删除、调整大小、重写等。它特别注意不到文件内容的变化。roracache
将在几分钟内注意到大多数类型的变化,但特别是它将 永远 注意不到符号链接目标的变化。(如果它没有快速注意到变化,只需按 Ctrl+C 并重新运行roracache
。)roracache
将所有UNIX权限扁平化。任何设置了执行位的底层文件或目录都被视为r-xr-xr-x
,而所有其他文件或目录都被视为r--r--r--
。所有文件都将由roracache
进程的 uid 和 gid 拥有。roracache
不支持扩展属性,或 macOS 上的额外文件属性。底层文件上的所有扩展属性都被简单地忽略。roracache
每个打开的文件可能会浪费高达 ¾GiB 的匿名内存,尽管不会超过文件的大小。 (鉴于积极的缓存是roracache
的整个目的,这种内存是否真的浪费是有争议的。但这个数量无法配置,这确实很烦人。)roracache
完全虚构inode编号。inode 1 是挂载的根,inode编号从那里依次虚构。roracache
忽略文件系统边界。roracache
不支持特殊文件。 (它支持文件、目录和符号链接。仅此而已。所有其他类型的inode都将被审查。)roracache
不缓存错误。这 应该 意味着错误情况与底层文件系统的速度相同,同时允许快速恢复“我忘记挂载我的媒体共享”这类错误。roracache
如果读取或查找失败,将会恐慌。没有借口;这只是我偷懒。抱歉。roracache
如果使用状态显示,会浪费一些CPU时间。相比IO量或与解码你缓存的媒体相比,浪费的CPU时间非常少,但在非常弱小的设备上可能会引起关注。roracache
做了很多不必要的内存复制。对此我无能为力。其中一些额外的复制是Rust绑定到FUSE的设计不可避免的后果,另一个是FUSE设计缺陷的不可避免的后果。roracache
最佳性能不佳。在我的测试机器上,它只拉取了大约一百兆比特。这应该足够用于除了最荒谬的过度冗余媒体文件之外的所有文件。至少,它没有用太多CPU来做这件事。它的大部分时间都在等待IO。(注意:面对过载的CPU或慢速IO,它的最坏情况性能非常好,这正是 整个目的。)roracache
没有尝试在相同文件的多个打开之间进行合作。预期的用例在大多数时间只有一个文件被打开。你的用例越不像那样,你的操作系统内置的缓存就越能为你提供更好的服务。roracache
只能缓冲文件的连续区域。如果你快速前后移动,它将执行大量的额外IO。影响应该非常小,因为它只在不是执行其他IO时执行预读取,并且更倾向于在当前缓冲区即将耗尽时读取哪个文件。roracache
的源代码 丑陋且难以理解。整个代码都是在生日那天为别人写的一个礼物,大部分是在深夜完成的。
法律声明
roracache
版权所有 2023,Solra Bizna,并许可以下之一:
- Apache许可证,版本2.0(LICENSE-APACHE 或 http://www.apache.org/licenses/LICENSE-2.0)
- MIT许可证(LICENSE-MIT 或 http://opensource.org/licenses/MIT)
由您选择。
除非您明确声明,否则根据Apache-2.0许可证定义的,您有意提交给包含在 roracache
中的任何贡献,将按照上述方式双许可,没有任何附加条款或条件。
依赖项
~7–18MB
~213K SLoC