深入理解SPDK之九:DPDK中的無鎖隊列

背景

分佈式系統中讀寫模式的場景裏,存在多個用戶(卷)同時寫的情況。對於單個盤而言,就是可能存在多個線程同時讀寫的場景。傳統的做法可以通過互斥鎖的方式避免併發讀寫的影響,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應用程序裏。

上面三種方式接口的比較

深入理解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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章