深刻理解SPDK之九:DPDK中的无锁队列

背景

分布式系统中读写模式的场景里,存在多个用户(卷)同时写的状况。对于单个盘而言,就是可能存在多个线程同时读写的场景。传统的作法能够经过互斥锁的方式避免并发读写的影响,C++也提供了boost::lock_free方式,此外DPDK 也提供了无锁 ring 的库。html

因为这个队列是在IO路径上,要求访问这个队列高并发、低延时,为此须要评估上面的几种方法的总体性能。并发

三种接口的异同

C++:std::mutex

这个是C++ 标准库提供的在拿不到锁的时候能够等待的无锁队列。less

boost:lock_free

这个是C++ boost 库提供的基于CAS实现的无锁队列,和C++ 标准库中的
queue接口很像,不一样的是,他的队列长度有限。分布式

DPDK lockless ring

这个是DPDK EAL层提供的一个基于CAS (compary and swap) 实现的元素个数有限的无锁 循环队列,一般用在SPDK memory pool中,或者用在和DPDK应用程序里。ide

上面三种方式接口的比较

深刻理解SPDK之九:DPDK中的无锁队列

实测结果分析

深刻理解SPDK之九:DPDK中的无锁队列

能够看到,经过使用DPDK中的无锁队列,可以提升系统总体的IOPS和吞吐。高并发

参考连接

boost::lock_free 和 mutex 在多生产者多消费者场景下的性能:
https://blog.csdn.net/wag2765/article/details/84793967性能

boost:lockfree 用法:
https://www.boost.org/doc/libs/1_55_0/doc/html/lockfree.html.net

相关文章
相关标签/搜索