FastCFS POSIX API简介

Posted Huazie

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了FastCFS POSIX API简介相关的知识,希望对你有一定的参考价值。

FastCFS POSIX API简介

本篇文章转载于 FastCFS 作者 余庆 大佬的 FastDFS分享与交流 公众号。

刚发布的 FastCFS V3.2 提供系统调用 API(如 openwritewritevreadreadvclose 等)和 C API(如fopenfwritefreadfclose等)两大类 POSIX API,应用程序可以通过这两类API 使用 FastCFS 存储。FastCFSPOSIX API 名称前面加上前缀 fcfs_,比如 fcfs_openfcfs_read 等等,函数原型及用法和 POSIX API 完全一致。

FastCFS 可以通过 FUSE mount 为本地文件目录,为什么还要推出 POSIX API 呢?

应用程序直接调用 FastCFS 提供的 POSIX 接口,主要有两大好处:

  1. 减少 FUSE 这个中间环节,部署和运维更加简单方便;
  2. 直接在用户态调用接口,不存在 FUSE 在用户态和内核态的交互行为,性能更高,CPU 占用明显降低(fused 进程对 CPU 消耗比较大)。单机实测发现随机写IOPS 提升 20+%,随机读大约提升 5%

C/C++ 使用 FastCFS POSIX API

FastCFS 提供的动态库和头文件,可以采用装包或者源码编译方式,推荐使用装包方式。CentOSRHEL 下包名为 FastCFS-api-develDebianUbuntu 下包名为 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 命令会失效,比如 md5sumdd。因此我们提供的这种方式是试验性的,感兴趣的朋友可以进行测试和验证。下面列举 preload 机制失效的 4 种场景:

  1. 静态编译(不采用动态库方式);
  2. 程序设置了 suid 标志;
  3. 通过汇编调用函数(比如 glibc 打开文件通过汇编调用 syscall);
  4. 采用了内联函数(比如 glibcfeof_unlockedferror_unlocked 等函数)。

友情提示 :

  • CentOS 7 下内核对 FUSE 文件属性缓存无效,CentOS 8Linux Kernel 4.18)没问题。推荐使用 Linux Kernel 4.18 及更高版本;
  • Linux 内核在每次写入时都会去获取名为 security.capability 的文件扩展属性(xattr),这将明显影响文件写入性能。除非应用程序真正需要文件扩展属性(如调用了 setxattrgetxattrlistxattrAPI),否则不要将 FastCFSfuse.conf 中的配置项 xattr_enabled 设置为 true

以上是关于FastCFS POSIX API简介的主要内容,如果未能解决你的问题,请参考以下文章

FastCFS binlog机制简介

FastCFS binlog机制简介

POSIX简介

FastCFS架构之连接篇

高性能大容量分布式目录服务FastDIR简介

高性能大容量分布式目录服务FastDIR简介