背景

分布式系统中读写模式的场景里,存在多个用户(卷)同时写的情况。对于单个盘而言,就是可能存在多个线程同时读写的场景。传统的做法可以通过互斥锁的方式避免并发读写的影响,C++也提供了boost::lock_free方式,此外DPDK 也提供了无锁 ring 的库。还有开源库concurrent queue 也提供了无锁队列。

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

四种接口的异同

C++:std::mutex

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

boost:lock_free

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

DPDK lockless ring

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

concurent queue

参考链接:
https://github.com/cameron314/concurrentqueue

主要操作接口:


主要操作如下:

上面几种方式接口的比较

实测结果分析

可以看到,通过使用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