前言:
前幾天,點開自己的部落格,看了一下 CYQ.Data V5系列 都有哪些文章,
發現了一篇2019年寫的:CYQ.Data 對於分散式快取Redis、MemCache高可用的改進及效能測試,於是點進去看了看。
感覺文章中有些表述存有問題,不過不是重點。
重點,看了裡面的測試結論,如果四五年過去了,CYQ.Data 低調的更新,有沒有進步呢?
為了和之前的版本進行對比,好在當年有留下程式碼,就直接拿當年的程式碼來測試一下。
下面就來重新看一下新的測試結果:
測試環境:
本次測試為.Net Windown 版本,下次再測試.Net Core Linux 版本。
Win11 系統:6核16G記憶體
Redis 版本:redis_version:3.2.100
由於單機測試,受執行程式和Redis自身程式等多綜合環境影響,測試結果僅供參考,用娛樂的心態看看即可。
測試程式碼:
見上一篇文章的測試程式碼:點選下載
CYQ.Data Redis 測試結果:
使用 CYQ.Data 當前最新版本:V5.9.2.7
VS2022 中直接執行 Release 版本:
直接執行編繹的exe程式結果:
StackExchange.Redis 測試結果:
使用 StackExchange.Redis 當前最新版本:V2.7.27
考慮到 StackExchange.Redis 預設是單執行緒,因此提前設定最低執行緒池,不然會拋異常。
ThreadPool.SetMinThreads(128, 128);
VS2022 中直接執行 Release 版本:
執行編繹後程式 exe 結果:
redis-benchmark.exe 測試結果:
執行結果1:
執行結果2:
執行結果3:
執行結果4:
總結:
具體的效能指標,應該結合自身業務和生產環境,測試出適合自身要求的指標。
下面就來看看總結詞吧:
1、Redis 自帶測試工具
單執行緒時,能跑到2w/s,為啥6核下,最高也是6w/s出頭,而不是2W*6=12W呢?
Redis 是一個單執行緒的記憶體資料庫,它的效能受限於單個 CPU 核心的處理能力。即使在多核處理器上執行 Redis,它也只能利用其中一個核心進行處理,所以無法直接透過簡單地將單核效能乘以核心數來計算多核效能。
在一個六核處理器上執行 Redis,雖然有多個核心可供利用,但 Redis 本身仍然是單執行緒的,因此最高的吞吐量受限於單個核心的效能。雖然可以同時處理多個請求,但每個請求仍然只能在一個核心上依次執行,不能完全實現效能的線性增長。
此外,Redis 在處理請求時還會涉及到鎖競爭、執行緒切換等開銷,這些因素也會限制其在多核處理器上的效能表現。因此,儘管在多核處理器上執行 Redis 會比單核處理器有一定的效能提升,但不會達到簡單地將單核效能乘以核心數的增長幅度。
2、StackExchange.Redis 測試結果總結:
在VS2002中啟動執行時,單執行緒時,效能特別低,只有4000/s上下,這不禁讓我想起上一份測試的結果,是不是也是受這種執行模式影響。
在直接執行exe程式,單執行緒時,在1W/s左右,8執行緒下到5.2w/s出頭。
16執行緒之後,突飛猛進了,突破 Redis自身極限,達到10-20w/s ?
聽說StackExchange.Redis 從2.X 版本後,重構了程式碼,在資源管夠的情況下,將程式碼從單條提交序列轉批次提交,因此就有了這種測試結果。
3、CYQ.Data Redis 測試結果總結:
在VS中啟動執行,和直接執行啟動,兩者效能相差不大。
單執行緒時,在1.5w/s左右,多執行緒下到5.2w/s,效果基本穩定在5w/s上下。
整體 CYQ.Data Redis 表現是不錯的,常規呼叫效能比 StackExchange.Redis 高一些(去掉它雞賊的批次方式)。
目前 CYQ.Data 未提供批次方法呼叫,後續會考量,是否引入這種自動批次處理方式,或提供批次呼叫入口。
目前機制下,可以透過增加 Redis 服務數量來提升併發效能。