- 論壇徽章:
- 4
|
剛發(fā)布的FastCFS V3.2提供系統(tǒng)調用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 接口,主要有兩大好處:1. 減少FUSE這個中間環(huán)節(jié),部署和運維更加簡單方便;2. 直接在用戶態(tài)調用接口,不存在FUSE在用戶態(tài)和內核態(tài)的交互行為,性能更高,CPU占用明顯降低(fused進程對CPU消耗比較大)。單機實測發(fā)現(xiàn)隨機寫IOPS提升 20+%,隨機讀大約提升 5%。
C/C++使用FastCFS POSIX API
FastCFS提供的動態(tài)庫和頭文件,可以采用裝包或者源碼編譯方式,推薦使用裝包方式。CentOS 和 RHEL下包名為 FastCFS-api-devel,Debian和Ubuntu下包名為 fastcfs-api-dev。動態(tài)庫為/usr/lib64/libfcfsapi.so,你的程序在編譯時需要增加動態(tài)庫選項 -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動態(tài)庫訪問FastCFS存儲。使用示例如下:
LD_PRELOAD=/usr/lib64/libfcfspreload.so ls -l /opt/fastcfs/fuse
或者:
export LD_PRELOAD=/usr/lib64/libfcfspreload.so
ls -l /opt/fastcfs/fuse
注意:第二種方式下環(huán)境變量LD_PRELOAD一直生效,除非退出終端或者執(zhí)行:
unset LD_PRELOAD
動態(tài)庫使用的配置文件默認為/etc/fastcfs/fcfs/fuse.conf,可以通過環(huán)境變量 FCFS_PRELOAD_CONFIG_FILENAME 設置。
受限于glibc實現(xiàn)方式,preload機制對于部分Linux命令會失效,比如 md5sum、dd。因此我們提供的這種方式是試驗性的,感興趣的朋友可以進行測試和驗證。下面列舉preload機制失效的4種場景:
1. 靜態(tài)編譯(不采用動態(tài)庫方式);
2. 程序設置了 suid 標志;
3. 通過匯編調用函數(比如glibc打開文件通過匯編調用syscall);
4. 采用了內聯(lián)函數(比如glibc的 feof_unlocked 和 ferror_unlocked等函數)。
感興趣的朋友請點擊FastCFS開源項目,歡迎大家測試和體驗。
友情提示
* CentOS 7下內核對FUSE文件屬性緩存無效,CentOS 8(Linux Kernel 4.18)沒問題。推薦使用 Linux Kernel 4.18及更高版本;
* Linux內核在每次寫入時都會去獲取文件的擴展屬性(xattr)security.capability,這將明顯影響文件寫入性能。除非應用程序真正需要文件擴展屬性(如調用了setxattr、getxattr或listxattr等API),否則不要將FastCFS的fuse.conf中的配置項xattr_enabled設置為true!
|
|