天天看點

Redis 6.0 多線程重磅釋出!!!

Redis 6.0 多線程重磅釋出!!!

Redis 6.0在5.2号這個美好的日子裡悄無聲息的釋出了,這次釋出在IT圈猶如一顆驚雷一般,因為這是redis最大的一次改版,首次加入了多線程。

作者Antirez在RC1版本釋出時在他的部落格寫下:

the most “enterprise” Redis version to date // 最”企業級”的

the largest release of Redis ever as far as I can tell // 最大的

the one where the biggest amount of people participated // 參與人數最多的

這次改變,性能有個飛速的提升~

先po出新版和舊版性能圖

從上面可以看到 GET/SET 指令在 4 線程 IO 時性能相比單線程是幾乎是翻倍了。另外,這些資料隻是為了簡單驗證多線程 IO 是否真正帶來性能優化,并沒有針對嚴謹的延時控制和不同并發的場景進行壓測。資料僅供驗證參考而不能作為線上名額,且隻是目前的 unstble分支的性能,不排除後續釋出的正式版本的性能會更好。

Redis 6.0 之前的版本真的是單線程嗎?

Redis基于Reactor模式開發了網絡事件處理器,這個處理器被稱為檔案事件處理器。它的組成結構為4部分:多個套接字、IO多路複用程式、檔案事件分派器、事件處理器。因為檔案事件分派器隊列的消費是單線程的,是以Redis才叫單線程模型。

一般來說 Redis 的瓶頸并不在 CPU,而在記憶體和網絡。如果要使用 CPU 多核,可以搭建多個 Redis 執行個體來解決。

其實,Redis 4.0 開始就有多線程的概念了,比如 Redis 通過多線程方式在背景删除對象、以及通過 Redis 子產品實作的阻塞指令等。

Redis 6.0 之前為什麼一直不使用多線程?

使用了單線程後,可維護性高。多線程模型雖然在某些方面表現優異,但是它卻引入了程式執行順序的不确定性,帶來了并發讀寫的一系列問題,增加了系統複雜度、同時可能存線上程切換、甚至加鎖解鎖、死鎖造成的性能損耗。

Redis 通過 AE 事件模型以及 IO 多路複用等技術,處理性能非常高,是以沒有必要使用多線程。

單線程機制使得 Redis 内部實作的複雜度大大降低,Hash 的惰性 Rehash、Lpush 等等 “線程不安全” 的指令都可以無鎖進行。

Redis 6.0 為什麼要引入多線程呢?

之前的段落說了,Redis 的瓶頸并不在 CPU,而在記憶體和網絡。

記憶體不夠的話,可以加記憶體或者做資料結構優化和其他優化等,但網絡的性能優化才是大頭,網絡 IO 的讀寫在 Redis 整個執行期間占用了大部分的 CPU 時間,如果把網絡處理這部分做成多線程處理方式,那對整個 Redis 的性能會有很大的提升。

優化方向:

提高網絡 IO 性能,典型的實作比如使用 DPDK 來替代核心網絡棧的方式。

使用多線程充分利用多核,典型的實作比如 Memcached。

是以總結起來,Redis 支援多線程主要就是兩個原因:

可以充分利用伺服器 CPU 資源,目前主線程隻能利用一個核。

多線程任務可以分攤 Redis 同步 IO 讀寫負荷。

Redis 6.0 預設是否開啟了多線程?

否,在conf檔案進行配置

io-threads-do-reads yes

io-threads 線程數

官方建議:4 核的機器建議設定為 2 或 3 個線程,8 核的建議設定為 6 個線程,線程數一定要小于機器核數,盡量不超過8個。

Redis 6.0 多線程的實作機制?

流程簡述如下:

主線程負責接收建立連接配接請求,擷取 Socket 放入全局等待讀處理隊列。

主線程處理完讀事件之後,通過 RR(Round Robin)将這些連接配接配置設定給這些 IO 線程。

主線程阻塞等待 IO 線程讀取 Socket 完畢。

主線程通過單線程的方式執行請求指令,請求資料讀取并解析完成,但并不執行。

主線程阻塞等待 IO 線程将資料回寫 Socket 完畢。

解除綁定,清空等待隊列。

該設計有如下特點:

IO 線程要麼同時在讀 Socket,要麼同時在寫,不會同時讀或寫。

IO 線程隻負責讀寫 Socket 解析指令,不負責指令處理。

開啟多線程後,是否會存線上程并發安全問題?

不會,Redis 的多線程部分隻是用來處理網絡資料的讀寫和協定解析,執行指令仍然是單線程順序執行。

Redis 線程中經常提到 IO 多路複用,如何了解?

這是 IO 模型的一種,即經典的 Reactor 設計模式,有時也稱為異步阻塞 IO。

多路指的是多個 Socket 連接配接,複用指的是複用一個線程。多路複用主要有三種技術:Select,Poll,Epoll。

Epoll 是最新的也是目前最好的多路複用技術。采用多路 I/O 複用技術可以讓單個線程高效的處理多個連接配接請求(盡量減少網絡 IO 的時間消耗),且 Redis 在記憶體中操作資料的速度非常快(記憶體内的操作不會成為這裡的性能瓶頸),主要以上兩點造就了 Redis 具有很高的吞吐量。

暫時就到這裡了,部分資料來源網絡,僅做參考。

原文位址

https://www.cnblogs.com/gz666666/p/12901507.html

繼續閱讀