FastDFS软件性能那些事儿
Posted Huazie
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了FastDFS软件性能那些事儿相关的知识,希望对你有一定的参考价值。
FastDFS软件性能那些事儿
本篇文章转载于 FastDFS 作者 余庆 大佬的 FastDFS分享与交流 公众号。
一直有人问我 FastDFS 的性能如何,我现在就用一句话回答好了:FastDFS 软件本身,不会成为性能瓶颈;FastDFS 集群的性能瓶颈,通常在磁盘 IO。接下来我分享几点 FastDFS 在性能方面做得还不错的地方(使用到的功能组件在基础库 libfastcommon 中)。
1. 使用简洁高效的自研网络框架
v2 至 v4 版本,使用了比较流行的网络框架 libevent。为了去掉这个依赖,并且出于简单高效的考虑,v5 使用了自研的网络框架,支持 Linux、FreeBSD 和 SunOS,其中网络超时管理使用了简单高效的时间轮算法。
2. 使用对象池和连接池
对象池管理内存的方式类似于 Linux 内存管理 SLAB,感兴趣的同学可以查下相关资料。
一个连接对应一个 buffer,称作 task buffer,用于接收和发送网络数据,该 task buffer 可以被业务处理线程读写,避免内存拷贝。task buffer 采用预先分配的做法,目前采用增量的预分配方式,以减少不必要的内存占用。task buffer 的分配本质就是对象池方式。
FastDFS v3 支持合并存储特性,trunk server 管理 trunk 可用空间使用了对象池(注:一个 group 内的 trunk server 由其中一台 storage server 兼任)。
为了消除建立网络连接的开销,tracker server、storage server 及C client SDK 均支持连接池方式。
3. 缓存写入方式
FastDFS 写日志及 binlog 文件,均采用先写入缓存,然后再定时刷到磁盘的方式,建议刷盘时间间隔设置为 1 秒。libfastcommon 通过一个线程实现定时任务调度(定时器)功能,支持动态添加和删除定时任务。
4. 其他编程技巧
1)当前时间采用全局变量,在定时器线程中获取,其他地方直接使用;
2)使用 gcc 内置原子计数函数,避免用锁,比如:__sync_add_and_fetch;
3)预先分配和初始化固定内容的 buffer,比如 ASCII 0 填充的 buffer;
4)尽量不使用 memset;
5)等等。。。
以上内容整理得比较仓促,相信还有个别遗漏的地方。有阅读过 FastDFS 和libfastcommon 代码的朋友,欢迎补充、反馈和交流。
以上是关于FastDFS软件性能那些事儿的主要内容,如果未能解决你的问题,请参考以下文章