FUSE使用总结

举报
ADG 发表于 2020/11/24 17:22:33 2020/11/24
【摘要】 1.FUSE简介由于近期一个项目用到FUSE实现一个文件系统,所以有一些使用FUSE的经验。现总结如下:FUSE(Filesystem in Userspace)是一个开源项目,它可以为用户提供编写用户态文件系统的接口。运行架构如下:2.性能消耗从架构图可知,用户进程userd访问文件系统userfsd时,需要先从用户态进入内核态,再从内核态到用户态,结果返回时也是从用户态进入内核态,再从内...

1.FUSE简介

由于近期一个项目用到FUSE实现一个文件系统,所以有一些使用FUSE的经验。现总结如下:

FUSEFilesystem in Userspace)是一个开源项目,它可以为用户提供编写用户态文件系统的接口。

运行架构如下:

image.png

2.性能消耗

从架构图可知,用户进程userd访问文件系统userfsd时,需要先从用户态进入内核态,再从内核态到用户态,结果返回时也是从用户态进入内核态,再从内核态到用户态,数据需要多次拷贝。从我们的测试结果看FUSE占用的cpu是整个userfsd占用的cpu30%左右。

3.业务处理不支持固定的线程池

FUSE的处理每个请求时会从预留的线程里找是否有空闲的线程,如果没有就会起新的线程来响应请求。这种处理方式导致为了避免频繁起新的线程需要将保留idle线程的参数max_idle_threads设的比较大,但这个值比较大时,线程之间的切换开销也不小。

4.启动参数auto_unmount有缺陷

使用auto_unmount启动参数会让userfsd fork一个叫fusermount3的进程,但userfsd在代码里没有调用waitpid,这样编码的话,fusermount3异常退出的时候容易产生僵尸进程; 不过只退了fusermount3, 还不影响dbfsd的功能,但如果这个时候dbfsd也发生异常退出的话,挂载点目录就用不了,需要手工处理。

同时如果使用该参数,在非root用户启动userfsd时需要赋予fusermount3管理权限。所以建议不使用该参数。

5.文件被打开时该文件被删除

FUSE有个硬删除的选项,需要代码指定,缺省是false。如果这个选项设置成true,则即使该文件被一个进程打开了,另外进程也可以直接删除,如果这是正在进行写操作就会直接返回错误。如果这个选项设置成false,则在进程删除文件时,如果这个被打开了,就会将这个文件rename成一个隐藏文件,待打开这个文件的进程把它关闭了才把隐藏文件删除。

6.在非root用户下启动

为了安全考虑一般需要将用户态文件系统进程userfsd起在非root用户下,FUSE支持这种场景。userfsd可以指定allow_other启动选项,同时需要执行”echo user_allow_other >> fuse.conf”命令将user_allow_other放到fuse.conf配置文件里,这样userfsd就可以起在非root用户下了。


【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。