huchengze / chdfs-fuse

chdfs fuse tool

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

chdfs-fuse

简介

chdfs-fuse能让您在Linux系统中把Tencent CHDFS挂载到本地文件系统中,您能够便捷的通过本地文件系统操作CHDFS上的内容,实现数据的共享。

功能

chdfs-fuse基于fuse底层接口实现,主要功能包括:

  • 支持POSIX文件系统的大部分功能,包括文件读写,目录操作,权限设置等
  • MD5校验保证数据完整性

安装

安装依赖

为保障最优性能,建议linux kernel 5.0.0+。

Ubuntu 14.04+:

sudo apt-get install fuse

CentOS 6.5+:

sudo yum install fuse

二进制文件

为方便用户使用,提供了二进制可执行程序chdfs-fuse。下载地址

运行

挂载

  • 普通模式
#添加可执行权限
chmod +x ./bin/chdfs-fuse
#创建本地挂载目录
mkdir /mnt/chdfstest
#挂载CHDFS至本地目录
nohup ./bin/chdfs-fuse /mnt/chdfstest/ --config=./conf/config.toml &

如需销毁文件系统,执行以下命令(请谨慎操作):

rm -r /mnt/chdfstest/*
  • 调试模式(查看fuse接口调用)
#显示详细的fuse接口调用
nohup ./bin/chdfs-fuse -debug /mnt/chdfstest/ --config=./conf/config.toml &
  • 允许其他用户访问
#允许其他用户访问
nohup ./bin/chdfs-fuse -debug -allow_other /mnt/chdfstest/ --config=./conf/config.toml &
  • 同步模式
#内存的任何修改都会实时同步到CHDFS
nohup ./bin/chdfs-fuse -debug -o sync /mnt/chdfstest/ --config=./conf/config.toml &

如果遇到类似“/mnt/chdfstest: Transport endpoint is not connected”等字样,通常是由于强杀进程导致无法重新挂载,建议先取消挂载再挂载:

 umount /mnt/chdfstest
 nohup ./bin/chdfs-fuse /mnt/chdfstest/ -config=./conf/config.toml &

取消挂载

#取消挂载
umount /mnt/chdfstest/
#或者
#fusermount -u /mnt/chdfstest/

1.umount命令只能root账户使用,否则会遇到"Operation not permitted"等字样,建议使用fusermount -u取消挂载。

2.如果遇到类似“umount: /mnt/chdfstest/: target is busy.”等字样,通常是由于挂载点正在被使用,导致无法直接卸载,建议先查看在使用的进程:

fuser -mv /mnt/chdfstest/

再杀死占用的进程:

fuser -kv /mnt/chdfstest/

再次查看(仅剩kernel占用为止):

fuser -mv /mnt/chdfstest/

再使用卸载命令:

umount /mnt/chdfstest/

注意:

  • 可以使用fuser -kv /mnt/chdfstest/进行kill进程。
  • 也可以使用kill命令杀掉对应的进程 。
  • 强制kill进程可能会导致数据丢失,请确保数据得到有效备份后,再进行相关操作。

配置样例

[proxy]
url="http://f4mxxxxxxxx-xxxx.chdfs.ap-beijing.myqcloud.com"

[client]
mount-point="f4mxxxxxxxx-xxxx"
mount-sub-dir="/"
renew-session-lease-time-sec=10

[cache]
update-sts-time-sec=30
cos-client-timeout-sec=5
inode-attr-expired-time-sec=30
[cache.read]
block-expired-time-sec=10
max-block-num=256
read-ahead-block-num=15
max-cos-load-qps=1024
load-thread-num=128
select-thread-num=64
rand-read=false
[cache.write]
max-mem-table-range-num=32
max-mem-table-size-mb=64
max-cos-flush-qps=256
flush-thread-num=128
commit-queue-len=100
max-commit-heap-size=500
auto-merge=true
auto-sync=false
auto-sync-time-ms=1000

[log]
level="info"

[log.file]
filename="./log/chdfs.log"
log-rotate=true
max-size=2000
max-days=7
max-backups=100

配置介绍

名称 默认值 描述
proxy.url - 远程挂载地址,例:http://f4mxxxxxxxx-xxxx.chdfs.ap-beijing.myqcloud.com
security.ssl-ca-path - CA路径,例:/etc/ssl/certs/ca-bundle.crt
client.renew-session-lease-time-sec 10 会话续租时间(s)
client.mount-point - 远程挂载点,例:f4mxxxxxxxx-xxxx
client.mount-sub-dir 根目录 挂载子目录
client.user 当前用户名 用户名
client.group 当前组名 组名
client.force-sync false 强制sync开关,不依赖“-o sync”
cache.update-sts-time-sec 30 数据读写临时密钥刷新时间(s)
cache.cos-client-timeout-sec 5 数据上传/下载超时时间(s)
cache.inode-attr-expired-time-sec 30 inode属性缓存有效时间(s)
cache.read.block-expired-time-sec 10 【读操作】单Fd数据读缓存有效时间(s)(block粒度)
cache.read.max-block-num 256 【读操作】单Fd数据读缓存block最大数量
cache.read.read-ahead-block-num 15 【读操作】单Fd预读block数量(read-ahead-block-num < max-block-num)
cache.read.max-cos-load-qps 1024 【读操作】多Fd数据下载最大QPS(QPS * 1MB < 网卡带宽)
cache.read.load-thread-num 128 【读操作】多Fd数据下载worker数量
cache.read.select-thread-num 64 【读操作】多Fd元数据查询worker数量
cache.read.rand-read false 【读操作】随机读场景开关
cache.write.max-mem-table-range-num 32 【写操作】单Fd当前数据写缓存range最大数量
cache.write.mem-table-size-mb 64 【写操作】单Fd当前数据写缓存最大容量(MB)
cache.write.max-cos-flush-qps 256 【写操作】多Fd数据上传最大QPS(QPS * 4MB < 网卡带宽)
cache.write.flush-thread-num 128 【写操作】多Fd数据上传worker数量
cache.write.commit-queue-len 100 【写操作】单Fd元数据提交队列长度
cache.write.max-commit-heap-size 500 【写操作】单Fd元数据提交最大容量(无需设置)
cache.write.auto-merge true 【写操作】单Fd写时自动合并文件碎片开关
cache.write.auto-sync false 【写操作】单Fd写时自动刷脏页开关
cache.write.auto-sync-time-ms 1000 【写操作】单Fd写时自动刷脏页时间周期(ms)
log.level info 日志级别
log.file.filename default.log 日志文件名
log.file.log-rotate true 日志分割
log.file.max-size - 单个日志文件最大容量(MB)
log.file.max-days - 单个日志文件保存最长时间(天)
log.file.max-backups - 历史日志文件最多文件数量

局限性

  • 暂不支持链接操作和扩展属性设置,已实现fuse底层接口如下:
    • StatFS
    • LookUpInode
    • GetInodeAttr
    • SetInodeAttr
    • MkDir
    • CreateFile
    • Rename
    • RmDir
    • Unlink
    • OpenDir
    • ReadDir
    • ReleaseDirFd
    • OpenFile
    • ReadFile
    • WriteFile
    • SyncFile
    • FlushFile
    • ReleaseFileFd
  • 不支持单文件并发写
  • 数据读操作不是强一致,即时读取的数据存在有效时间,下次读取时命中会返回

内存回收策略

chdfs-fuse用go语言实现,runtime在释放内存时默认行为是MADV_FREE。读写文件完成后,若观察到chdfs-fuse占用的内存没有下降,表示此时gc的内存空间没有返回给操作系统,但不影响其他进程运行,若其他进程抢占内存空间,chdfs-fuse占用的内存会迅速下降。 当然,释放内存也可以强制采用MADV_DONTNEED行为,读写文件完成后,gc的内存空间会返回给操作系统。

GODEBUG=madvdontneed=1 nohup ./bin/chdfs-fuse /mnt/chdfstest/ --config=./conf/config.toml
  • MADV_DONTNEED 表示应用程序不希望很快访问此地址范围。
  • MADV_FREE 表示应用程序不需要此地址范围中包含的信息,但可以立即重用这些页面。

性能测试(单客户端)

chdfs-fuse配置 场景 用例 强制sync 带宽 IOPS 时延
[cache]
update-sts-time-sec=30
cos-client-timeout-sec=5
inode-attr-expired-time-sec=30
[cache.read]
block-expired-time-sec=10
max-block-num=128
read-ahead-block-num=15
#请指定合适的qps参数
max-cos-load-qps=4096
load-thread-num=128
select-thread-num=64
rand-read=false
[cache.write]
max-mem-table-range-num=32
max-mem-table-size-mb=64
#请指定合适的qps参数
max-cos-flush-qps=1024
flush-thread-num=128
commit-queue-len=100
max-commit-heap-size=500
auto-merge=false
auto-sync=false
单进程大块顺序读 fio -direct=1 -ioengine=libaio -iodepth=1 -rw=read -bs=1M -size=1G -numjobs=1 -runtime=120 -time_based=1 -group_reporting -directory="/mnt/chdfstest/fio" -name=1p_1M_Read_Testing 452MiB/s 451 2.21ms
多进程大块顺序读 fio -direct=1 -ioengine=libaio -iodepth=1 -rw=read -bs=1M -size=1G -numjobs=16 -runtime=120 -time_based=1 -group_reporting -directory="/mnt/chdfstest/fio" -name=16p_1M_Read_Testing 2113MiB/s 2112 7.56ms
单进程大块顺序写 fio -direct=1 -ioengine=libaio -iodepth=1 -rw=write -bs=1M -size=1G -numjobs=1 -runtime=120 -time_based=1 -group_reporting -directory="/mnt/chdfstest/fio" -name=1p_1M_Write_Testing false 433MiB/s 432 2.31ms
true 1372KiB/s 1 746.44ms
多进程大块顺序写 fio -direct=1 -ioengine=libaio -iodepth=1 -rw=write -bs=1M -size=1G -numjobs=16 -runtime=120 -time_based=1 -group_reporting -directory="/mnt/chdfstest/fio" -name=16p_1M_Write_Testing false 2108MiB/s 2107 7.59ms
fio -direct=1 -ioengine=libaio -iodepth=1 -rw=write -bs=1M -size=1G -numjobs=100 -runtime=120 -time_based=1 -group_reporting -directory="/mnt/chdfstest/fio" -name=100p_1M_Write_Testing true 59.7MiB/s 59 1664.4ms
[cache.read]
block-expired-time-sec=10
max-block-num=128
read-ahead-block-num=15
#请指定合适的qps参数
max-cos-load-qps=20480
load-thread-num=512
select-thread-num=256
rand-read=true
单进程小块随机读 fio -direct=1 -ioengine=libaio -iodepth=1 -rw=randread -bs=4k -size=1G -numjobs=1 -runtime=120 -time_based=1 -group_reporting -directory="/mnt/chdfstest/fio" -name=1p_4K_RRead_Testing 134KiB/s 33 29.94ms
多进程小块随机读 fio -direct=1 -ioengine=libaio -iodepth=1 -rw=randread -bs=4k -size=1G -numjobs=100 -runtime=120 -time_based=1 -group_reporting -directory="/mnt/chdfstest/fio" -name=100p_4K_RRead_Testing 9652KiB/s 2413 41.08ms
[cache.write]
max-mem-table-range-num=32
max-mem-table-size-mb=64
#请指定合适的qps参数
max-cos-flush-qps=4096
flush-thread-num=128
commit-queue-len=100
max-commit-heap-size=500
auto-merge=false
auto-sync=false
单进程小块随机写 fio -direct=1 -ioengine=libaio -iodepth=1 -rw=randwrite -bs=4k -size=1G -numjobs=1 -runtime=120 -time_based=1 -group_reporting -directory="/mnt/chdfstest/fio" -name=1p_4K_RWrite_Testing false 1233KiB/s 308 3.24ms
true 73.6KiB/s 18 54.35ms
多进程小块随机写 fio -direct=1 -ioengine=libaio -iodepth=1 -rw=randwrite -bs=4k -size=1G -numjobs=16 -runtime=120 -time_based=1 -group_reporting -directory="/mnt/chdfstest/fio" -name=16p_4K_RWrite_Testing false 5884KiB/s 1471 10.86ms
fio -direct=1 -ioengine=libaio -iodepth=1 -rw=randwrite -bs=4k -size=1G -numjobs=100 -runtime=120 -time_based=1 -group_reporting -directory="/mnt/chdfstest/fio" -name=100p_4K_RWrite_Testing true 7917KiB/s 1979 50.42ms

About

chdfs fuse tool

License:MIT License