背景
分佈式系統中讀寫模式的場景裏,存在多個用戶(卷)同時寫的情況。對於單個盤而言,就是可能存在多個線程同時讀寫的場景。傳統的做法可以通過互斥鎖的方式避免併發讀寫的影響,C++也提供了boost::lock_free方式,此外DPDK 也提供了無鎖 ring 的庫。
由於這個隊列是在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應用程序裏。
上面三種方式接口的比較
實測結果分析
可以看到,通過使用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