深刻理解SPDK之八:性能优化

根笔者最近在SPDK优化上的工做,下面总结了一些能够提高性能的优化点。缓存

永远保持高队列深度

对于NVME SSD和RDMA这种基于completion queue/submittion queue 硬件机制的设备,就应该根据硬件队列执行的特性,始终保持队列中有物理队列深度这么多的请求在跑,这样才可能榨干硬件性能。数据结构

数据结构

在IO路径上若是你须要缓存一段请求,而且只只须要操做它的头和尾。若是是基于C++ 模板,切记:不要使用双向链表,而应该用queue。并发

内存拷贝

大厂的不少基础库中,指望的浅复制,在有些状况下可能包括拷贝操做,针对这个须要仔细筛查。特别是在IO路径上不一样的函数参数传递
的过程当中,尽可能用指针传递。ide

内存分配

IO路径上频繁的内存分配会影响性能,特别是对 spdk 提供的内存分配函数。一种思路是预估请求的多少,预先分配好。函数

占时高的函数

读写程序跑起来的时候,能够用perf 跟踪并记录到热点函数,而后分析
是否符合预期,对于不符合预期的想办法把它的时间占比降下来。笔者经过perf 发现,对一个std::map结构进行判空比较占据了超过5%的比例,后来经过把这个判断放到其余条件以后,性能获得必定改善。性能

IO路径上尽可能避免锁,由于:
对于自旋锁:它很耗CPU;对于互斥锁:它又极可能致使频繁的上下文切换。进而总体上影响性能。优化

去掉没必要要的打印、睡眠、乘法、除法

把IO路径上乘、除、模等须要比较多CPU周期的操做,改形成位的操做;把冗余的日志和睡眠减小乃至都去掉,也会对性能有提高。线程

内连函数、编译选项 -O 优化、热点函数汇编、使用高级指令

这个是常见的公共的优化方法,常见于计算密集型的应用。指针

经过综合上面的措施,笔者把4K粒度的读写从2~3万IOS优化到45万左右IOPS。固然在多个线程并发、队列深度不一样的状况下,是否还能保持如此高的性能还有待验证。日志

相关文章
相关标签/搜索