FastDFS软件性能那些事儿

Posted Huazie

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了FastDFS软件性能那些事儿相关的知识,希望对你有一定的参考价值。

FastDFS软件性能那些事儿

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

一直有人问我 FastDFS 的性能如何,我现在就用一句话回答好了:FastDFS 软件本身,不会成为性能瓶颈;FastDFS 集群的性能瓶颈,通常在磁盘 IO。接下来我分享几点 FastDFS 在性能方面做得还不错的地方(使用到的功能组件在基础库 libfastcommon 中)。

1. 使用简洁高效的自研网络框架

v2v4 版本,使用了比较流行的网络框架 libevent。为了去掉这个依赖,并且出于简单高效的考虑,v5 使用了自研的网络框架,支持 LinuxFreeBSDSunOS,其中网络超时管理使用了简单高效的时间轮算法。

2. 使用对象池和连接池

对象池管理内存的方式类似于 Linux 内存管理 SLAB,感兴趣的同学可以查下相关资料。

一个连接对应一个 buffer,称作 task buffer,用于接收和发送网络数据,该 task buffer 可以被业务处理线程读写,避免内存拷贝。task buffer 采用预先分配的做法,目前采用增量的预分配方式,以减少不必要的内存占用。task buffer 的分配本质就是对象池方式。

FastDFS v3 支持合并存储特性,trunk server 管理 trunk 可用空间使用了对象池(注:一个 group 内的 trunk server 由其中一台 storage server 兼任)。

为了消除建立网络连接的开销,tracker serverstorage serverC client SDK 均支持连接池方式。

3. 缓存写入方式

FastDFS 写日志及 binlog 文件,均采用先写入缓存,然后再定时刷到磁盘的方式,建议刷盘时间间隔设置为 1 秒。libfastcommon 通过一个线程实现定时任务调度(定时器)功能,支持动态添加和删除定时任务。

4. 其他编程技巧

1)当前时间采用全局变量,在定时器线程中获取,其他地方直接使用;

2)使用 gcc 内置原子计数函数,避免用锁,比如:__sync_add_and_fetch;

3)预先分配和初始化固定内容的 buffer,比如 ASCII 0 填充的 buffer

4)尽量不使用 memset

5)等等。。。

以上内容整理得比较仓促,相信还有个别遗漏的地方。有阅读过 FastDFSlibfastcommon 代码的朋友,欢迎补充、反馈和交流。

以上是关于FastDFS软件性能那些事儿的主要内容,如果未能解决你的问题,请参考以下文章

性能调优常见的那些事儿-ORACLE上篇

性能优化你必须知道的那些事儿

高性能的那些事儿-缓存设计

Windows中断那些事儿

iOS 性能优化那些繁杂琐碎的事儿

诊断协议那些事儿