FastCFS POSIX API简介
Posted Huazie
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了FastCFS POSIX API简介相关的知识,希望对你有一定的参考价值。
FastCFS POSIX API简介
本篇文章转载于 FastCFS 作者 余庆 大佬的 FastDFS分享与交流 公众号。
刚发布的 FastCFS V3.2 提供系统调用 API(如 open、write、writev、read、readv、close 等)和 C API(如fopen、fwrite、fread、fclose等)两大类 POSIX API,应用程序可以通过这两类API 使用 FastCFS 存储。FastCFS 在 POSIX API 名称前面加上前缀 fcfs_,比如 fcfs_open、fcfs_read 等等,函数原型及用法和 POSIX API 完全一致。
FastCFS 可以通过 FUSE mount 为本地文件目录,为什么还要推出 POSIX API 呢?
应用程序直接调用 FastCFS 提供的 POSIX 接口,主要有两大好处:
- 减少 FUSE 这个中间环节,部署和运维更加简单方便;
- 直接在用户态调用接口,不存在 FUSE 在用户态和内核态的交互行为,性能更高,CPU 占用明显降低(fused 进程对 CPU 消耗比较大)。单机实测发现随机写IOPS 提升 20+%,随机读大约提升 5%。
C/C++ 使用 FastCFS POSIX API
FastCFS 提供的动态库和头文件,可以采用装包或者源码编译方式,推荐使用装包方式。CentOS 和 RHEL 下包名为 FastCFS-api-devel,Debian 和 Ubuntu 下包名为 fastcfs-api-dev。动态库 为 /usr/lib64/libfcfsapi.so
,你的程序在编译时需要增加 动态库选项 -lfcfsapi。源码需要引用两个头文件,如下所示:
#include "fastcfs/api/std/papi.h"
#include "fastcfs/api/std/capi.h"
程序初始化调用:
// 必须放置在daemon_init, fork或clone调用之后
fcfs_posix_api_init_start();
或者:
// 可以放置在daemon_init, fork或clone调用之前
fcfs_posix_api_init();
// 必须放置在daemon_init, fork或clone调用之后
fcfs_posix_api_start();
程序退出前需要调用 fcfs_posix_api_stop()
完成收尾工作。示例程序参见 FastCFS 项目下的 src/api/tests/test_papi_copy.c
不修改程序代码的情况下,可以使用 FastCFS 提供的 preload 动态库访问 FastCFS 存储。使用示例如下:
LD_PRELOAD=/usr/lib64/libfcfspreload.so
ls -l /opt/fastcfs/fuse
或者:
export LD_PRELOAD=/usr/lib64/libfcfspreload.so
ls -l /opt/fastcfs/fuse
注意:第二种方式下环境变量 LD_PRELOAD 一直生效,除非退出终端或者执行:
unset LD_PRELOAD
动态库使用的配置文件默认为 /etc/fastcfs/fcfs/fuse.conf
,可以通过环境变量 FCFS_PRELOAD_CONFIG_FILENAME 设置。
受限于 glibc 实现方式,preload 机制对于部分 Linux 命令会失效,比如 md5sum、dd。因此我们提供的这种方式是试验性的,感兴趣的朋友可以进行测试和验证。下面列举 preload 机制失效的 4 种场景:
- 静态编译(不采用动态库方式);
- 程序设置了 suid 标志;
- 通过汇编调用函数(比如 glibc 打开文件通过汇编调用 syscall);
- 采用了内联函数(比如 glibc 的 feof_unlocked 和 ferror_unlocked 等函数)。
友情提示 :
- CentOS 7 下内核对 FUSE 文件属性缓存无效,CentOS 8(Linux Kernel 4.18)没问题。推荐使用 Linux Kernel 4.18 及更高版本;
- Linux 内核在每次写入时都会去获取名为 security.capability 的文件扩展属性(xattr),这将明显影响文件写入性能。除非应用程序真正需要文件扩展属性(如调用了 setxattr、getxattr 或 listxattr 等 API),否则不要将 FastCFS 的fuse.conf 中的配置项 xattr_enabled 设置为 true!
以上是关于FastCFS POSIX API简介的主要内容,如果未能解决你的问题,请参考以下文章