效能竟然再提升一倍!Redis的一個例項有多快?- keydb.dev

banq發表於2019-06-19

Redis被稱為最快的資料庫之一。但是如果刪除了一些限制,那麼獨立例項的速度會變得多快?我們經常聽說Redis可能會在受到CPU效能限制之前受限於網路或記憶體。根據您的設定,它可以是任何這些。

在本文中,我們將討論如何製作一個幾乎使Redis效能提高一倍的模組!

EQ Alpha推出了KeyDB,這是一個Redis的多執行緒,開源的分支,證明多執行緒可以帶來巨大的效能提升。然而,我們總是困擾另一個主要瓶頸的領域。效能通常被固定在核心中的自旋鎖和系統呼叫中。隨著NIC的大發展,Linux成為處理資料包的瓶頸。使用核心資料包複製,中斷和系統呼叫,通過核心處理的資料受到限制,這屬於“Linux核心空間”; 另一方面,我們在應用程式中執行稱為“使用者空間”的應用程式,所以問題變成是沒有辦法繞過核心?

英特爾開發出了資料平面開發套件(DPDK),提供驅動程式和庫以加速資料包處理工作量。繞過核心的想法允許在使用者空間處理資料流,而Linux處理控制流。

將這個想法付諸實踐,並使用EQ Alpha剛剛釋出的模組進行測試。該模組允許Redis在使用者空間中與NIC進行互動,繞過核心。這使得正常的Redis獨立例項從164,000 ops / sec變為超過300,000 ops / sec,Redis 5.0例項的延遲減少約1.8倍。下圖顯示了每秒運算元與資料大小。測試使用最新版本的Redis(5.0)進行,並新增了Accelerator模組:

效能竟然再提升一倍!Redis的一個例項有多快?- keydb.dev

效能竟然再提升一倍!Redis的一個例項有多快?- keydb.dev

在單個機器例項上可以看到最大的收益(不在同一伺服器上執行節點叢集 - 儘管這裡仍然可以看到一些增益)。在同一伺服器上或作為計算機叢集的一部分執行主/副本也有很大的收益。如果伺服器受CPU限制,則增益可能不高。建議使用具有4個或更多核心的計算機

通過在使用者空間內操作,這些都是可觀的收益。使用此模組可以在此環境中使用Redis例項,而無需修改基本程式碼。Redis將在Unix套接字上執行,從而使dpdk的效能更快。使用環境抽象層(EAL)以及其他堆疊元件,該模組能夠輪詢和解釋資料,而無需中斷處理的開銷。它能夠在自己的框架內執行,並允許您繼續使用Redis的生產版本或該註釋上的任何其他版本的Redis(包括不穩定版本和新版本)。

這個概念很有意思,它充滿了對內部發生的好奇心。那麼在沒有這些限制的情況下執行Redis例項會是什麼樣子?下面是兩個Flamegraph,可以幫助提供配置軟體的視覺化。它們是在使用模組執行Redis時生成的,並且執行它時沒有:

下面是在未修改的Redis上執行常規基準測試時生成的火焰圖。

效能竟然再提升一倍!Redis的一個例項有多快?- keydb.dev

下面是在基準測試期間生成的火焰圖,其中Accelerator模組在後臺執行:

效能竟然再提升一倍!Redis的一個例項有多快?- keydb.dev

希望本文有助於展示您的Redis例項可以解鎖的潛力。EQ Alpha與此模組和KeyDB專案的目標之一是幫助驅動選項,以實現更大,更強大的例項,從而通過能夠處理更多負載來最小化分片和群集的需求。該模組採用獨立模組形式,非常有用,因為無論Redis基本程式碼的下一步版本和未來版本如何,它都可能提供效能提升。

 

相關文章