- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我正在为远程服务实现 FUSE 文件系统。当用户打开文件时,我会进行网络调用以获取文件的内容。 It appears必须通过 GetAttr
报告文件大小才能打开。
为了知道文件的大小,我必须发出网络调用,并且由于在执行 ls
时会为每个条目调用 GetAttr
,所以我很担心这种设计(如果用户在包含许多项目的目录中执行 ls
,它将必须获取所有文件,即使用户不想打开其中任何一个。
我该如何解决这个问题?我的想法是:
Read
而不是 Open
会有所帮助,但是如果没有大小我就无法让它工作。Open
的 GetAttr
调用与其他调用(包括 ls
),我可以仅在以下情况下发出网络调用需要。我使用 Go 和 go-fuse ,但我认为这无关紧要,因为这是一个一般的 FUSE 问题。
此外,FUSE 文档是非常少的(实际上缺失的)文档。如果熟悉此事的人可以解释 ls
、cd
和 cat
的调用流程,那就太好了——调用了哪些 FUSE 函数订单。
比如为什么既有Open
又有Read
。
更新:
我一直在浏览 SSHFS,它被认为是 FUSE 文件系统的典型示例,它似乎也在 getattr 上通过网络获取文件:https://github.com/libfuse/sshfs/blob/master/sshfs.c#L3167
你怎么看?
最佳答案
您看到的问题是因为内核正在缓冲您的读取,当它这样做时,它使用 inode 的大小来准确计算它必须复制到用户空间的字节数 (https://elixir.bootlin.com/linux/v4.19.7/source/mm/filemap.c#L2137)。所以有不同的解决方法:
从 GetAttr 返回巨大的 st_size
打开文件时,设置 direct_io 标志,这样您就不会使用页面缓存。
关于go - FUSE - 避免在 GetAttr 中计算大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46267972/
我是一名优秀的程序员,十分优秀!