標籤:performance redis
情境一:對單一鍵大並發量增加(INC)操作,類比對熱點產品的庫存修改
測試點:
原子性,保證最後的索引值等於所有索引值增加操作的總和效能,
保證在大並發量下寫操作的效能沒有大的降低
| 線程數 |
100次INC操作的平均時間 |
服務端資料 |
| 10 |
140 |
instantaneous_ops_per_sec(每秒處理指示數):342 instantaneous_input_kbps(每秒讀位元組數):10.70 instantaneous_output_kbps(每秒寫位元組數):1.90 used_cpu_sys(系統CPU使用量):0.05 used_cpu_user(使用者CPU使用量):0.03
|
| 50 |
560 |
instantaneous_ops_per_sec(每秒處理指示數):2780 instantaneous_input_kbps(每秒讀位元組數):86.89 instantaneous_output_kbps(每秒寫位元組數):18.20 used_cpu_sys(系統CPU使用量):0.48 used_cpu_user(使用者CPU使用量):0.37
|
| 100 |
1050 |
instantaneous_ops_per_sec(每秒處理指示數):5766 instantaneous_input_kbps(每秒讀位元組數):180.22 instantaneous_output_kbps(每秒寫位元組數):38.60 used_cpu_sys(系統CPU使用量):1.31 used_cpu_user(使用者CPU使用量):0.52
|
| 120 |
1400 |
instantaneous_ops_per_sec(每秒處理指示數):6857 instantaneous_input_kbps(每秒讀位元組數):214.29 instantaneous_output_kbps(每秒寫位元組數):46.87 used_cpu_sys(系統CPU使用量):2.51 used_cpu_user(使用者CPU使用量):0.81
|
| 150 |
1570 |
instantaneous_ops_per_sec(每秒處理指示數):8350 instantaneous_input_kbps(每秒讀位元組數):260.95 instantaneous_output_kbps(每秒寫位元組數):58.74 used_cpu_sys(系統CPU使用量):4.04 used_cpu_user(使用者CPU使用量):1.13
|
結論:
用戶端100次操作的時間隨著線程數增加而增加,但是服務端的處理量並沒有達到極限,CPU的使用量也不高,可見REDIS處理高並發請求沒有問題.
Jvisualvm 分析結果:用戶端處理時間長主要是由於線程切換的代價和網路開銷
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M00/6F/22/wKiom1WSWHbAE0EGAAMuCeJojHo135.jpg" title="visualvmres.png" alt="wKiom1WSWHbAE0EGAAMuCeJojHo135.jpg" />
情境二:資料持久化測試
資料佔用記憶體大小:
400000條資料,鍵長度20,資料長度1. 總共佔用 28.90M
2000000條資料,鍵長度20,資料長度1. 總共佔用138.55M
| 持久化模式 |
資料量 |
用戶端時間 |
服務端資料 |
RDB模式,資料快照定期寫入磁碟 規則:每900秒如果資料改變超過1次則寫入磁碟 每300秒如果資料改變超過10次則寫入磁碟 每60秒如果資料改變超過10000次則寫入磁碟 |
400000次寫 |
148397 ms |
instantaneous_ops_per_sec(每秒處理指示數):2538 instantaneous_input_kbps(每秒讀位元組數):116.52 instantaneous_output_kbps(每秒寫位元組數):12.40 latest_fork_usec:614
|
| 2000000次寫 |
750721ms |
instantaneous_ops_per_sec(每秒處理指示數):2705 instantaneous_input_kbps(每秒讀位元組數):126.80 instantaneous_output_kbps(每秒寫位元組數):13.21 latest_fork_usec:889
|
資料不持久化
|
400000次寫 |
145062 ms |
instantaneous_ops_per_sec(每秒處理指示數):2840 instantaneous_input_kbps(每秒讀位元組數):130.38 instantaneous_output_kbps(每秒寫位元組數):13.87
|
| 2000000次寫 |
746384ms |
instantaneous_ops_per_sec(每秒處理指示數):2723 instantaneous_input_kbps(每秒讀位元組數):127.68 instantaneous_output_kbps(每秒寫位元組數):13.30
|
資料複製到一個節點
|
400000次寫 |
210540ms |
instantaneous_ops_per_sec(每秒處理指示數):2222 instantaneous_input_kbps(每秒讀位元組數):102.00 instantaneous_output_kbps(每秒寫位元組數):112.83 |
| 2000000次寫 |
9249390ms |
instantaneous_ops_per_sec(每秒處理指示數):2126 instantaneous_input_kbps(每秒讀位元組數):99.69 instantaneous_output_kbps(每秒寫位元組數):110.05 |
AOF 模式 Fysnc per second 操作以日誌方式寫入磁碟,每秒將日誌從磁碟緩衝區刷入硬碟
|
400000次寫 |
158809ms |
instantaneous_ops_per_sec(每秒處理指示數):2169 instantaneous_input_kbps(每秒讀位元組數):99.59 instantaneous_output_kbps(每秒寫位元組數):10.59 |
| 2000000次寫 |
765037ms |
instantaneous_ops_per_sec(每秒處理指示數):2656 instantaneous_input_kbps(每秒讀位元組數):124.54 instantaneous_output_kbps(每秒寫位元組數):12.97 |
AOF 模式: Fsync always 操作以日誌方式寫入磁碟,每次操作將日誌從磁碟緩衝刷入硬碟
|
400000次寫 |
583053ms |
instantaneous_ops_per_sec(每秒處理指示數):642 instantaneous_input_kbps(每秒讀位元組數):29.49 instantaneous_output_kbps(每秒寫位元組數):3.14 |
| 2000000次寫 |
3154548ms |
instantaneous_ops_per_sec(每秒處理指示數):613 instantaneous_input_kbps(每秒讀位元組數):28.77 instantaneous_output_kbps(每秒寫位元組數):2.99 |
AOF 模式: Fsync never 操作以日誌方式寫入磁碟,由作業系統決定何時將日誌從磁碟緩衝刷入硬碟
|
400000次寫 |
152612ms
|
instantaneous_ops_per_sec(每秒處理指示數):2725 instantaneous_input_kbps(每秒讀位元組數):125.07 instantaneous_output_kbps(每秒寫位元組數):13.30 |
| 2000000次寫 |
769203ms |
instantaneous_ops_per_sec(每秒處理指示數):2710 instantaneous_input_kbps(每秒讀位元組數):127.03 instantaneous_output_kbps(每秒寫位元組數):13.23 |
RDB模式,資料快照定期寫入磁碟 規則:每900秒如果資料改變超過1次則寫入磁碟 每300秒如果資料改變超過10次則寫入磁碟 每60秒如果資料改變超過10000次則寫入磁碟 使用PIPELINE 大量操作,每10000條COMMIT 一次
|
400000次寫 |
1429ms |
instantaneous_ops_per_sec(每秒處理指示數):131611 instantaneous_input_kbps(每秒讀位元組數):6040.77 instantaneous_output_kbps(每秒寫位元組數):641.57
|
| 2000000次寫 |
6740ms |
instantaneous_ops_per_sec(每秒處理指示數):161782 instantaneous_input_kbps(每秒讀位元組數):7583.55 instantaneous_output_kbps(每秒寫位元組數):791.00 |
結論:
RDB模式和不持久化效能差別並非很大,主要是RDB通過FORK的方式來複製資料,對主進程的讀寫沒有影響.但是單次FORK的開銷較大,而且FORK時會消耗兩倍的記憶體
AOF模式每秒FSYNC和作業系統FSYNC的差別並不大,但是總是FSYNC的效能急劇下降,每秒FSYNC是一個比較合適的選擇,最多丟失1秒鐘的資料,效能也不錯
資料量大對寫操作的效能並沒有太多影響
實測中日誌主從複製對於效能有不小的影響,但由於是單機類比叢集測試,硬體和網路都是共用的,資料可能不準,建議在實際環境中再測試
4百萬資料讀效能仍然在5到7毫秒/條
資料恢複: 4百萬資料,RDB模式初始化需要大約4.12秒時間 (可從redis.log中查到), AOF模式初始化需要大約6.216秒時間
PIPELINE批量處理模式對於寫效能的提升是巨大的,但是使用情境比較有限,一般可以用於初始REDIS資料
REDIS的幾個測試結果