redis之效能優化
1
redis-cli命令的 --stat選項
關於stat選項,官網也是介紹的比較簡單。使用redis-cli命令加上stat選項可以實時監視redis例項,比如當前節點記憶體中快取的 key總數以及每秒處理請求數等。stat預設每隔一秒會輸出一行資訊,如果需要改變頻率可使用-i <interval> 指定頻率,單位為秒,如--stat -i 100。需要配合-h選項使用。
關於requests與connections官方也沒有介紹,自己結合本地和線上的輸出,做了對比得出的結論。
------- data ------ --------------------- load -------------------- - child - keys mem clients blocked requests connections97146 6.82G 1724 0 60068357585 (+49536) 93936323 97146 6.82G 1724 0 60068403702 (+46117) 93936323 97146 6.82G 1724 0 60068451875 (+48173) 93936323 97146 6.82G 1724 0 60068496037 (+44162) 93936323
- keys:當前節點快取的key總數
- mem:當前節點快取總的佔用記憶體
- clients:當前節點的活躍連線數,或者說未斷開連線的總連線數
- blocked:當前節點正在等待阻塞命令的數量
- requests:當前處理的請求數,與上一次請求數相減可知1秒所處理的請求,或者說所執行的命令數。
- connections:是歷史連線總數,即到目前為止,一共新建了多少個連線。與前一次相減,可以得出一秒內新建的連線數。
Requests列括號裡的數是每間隔所處理的命令數。比如當前60068496037減去前一次60068451875 等於44162,由於stat預設頻率是每秒輸出一次,44162就是每秒執行4萬多條命令。正好是括號裡面的數字,也因此可以知道,括號裡面的數字代表每秒(interval)執行的命令數。
當然--stat每秒輸出一次結果也是一條命令,所以在沒有任何請求的情況下,你看到的requests是自增的,可以本地起個redsi服務,然後使用redis-cli --stat觀察下輸出。
Blocked並不是排隊等待執行的命令數,而是客戶端執行阻塞命令的總數。比如BLPOP。
Connections也是很有用的引數,如果發現connections與前一次的差值很大,且很頻繁,那就要看下程式碼中連線池配置是否生效了。
網路延遲也是我們要關注的問題
redis-cli命令--latency選項可以測試當前伺服器與redis某個節點的網路延遲。
>src/redis-cli --latency -h 172.31.1.1 min: 0, max: 12, avg: 0.25 (1047 samples)
avg:0.25,即延遲為250μs。如果通過外網連線網路延遲會很高,比如跨機房的redis呼叫,延遲高的情況下使用redis反而比使用本地硬碟讀寫效能更差。
還有其它影響redis效能的因素,比如記憶體的使用,持久化策略等。
AOF持久化策略影響效能問題
如果資料不需要持久化,或者要求不嚴格,建議直接禁用掉AOF持久化策略,同時RDB快照的儲存時間間隔也要調高一些,比如一小時一次,以此達到更高的效能。
# 是否開啟持久化策略 # (支援同時開啟RDB和AOF,即混合策略) appendonly no # yes: 在aof重寫期間不做fsync刷盤操作,可能丟失整個AOF重寫期間的資料, no-appendfsync-on-rewrite yes # fsync針對單個檔案操作(比如AOF檔案),做強制硬碟同步,fsync將阻塞直到寫入硬碟完成後返回,保證了資料持久化。 # always:每次寫入都要同步AOF檔案。 # no:同步硬碟操作由作業系統負責,通常同步週期為30秒,資料安全性無法保證。 # everysec:由專門執行緒每秒同步一次fsync。理論上只有在系統突然宕機的情況下丟失1秒的資料。 appendfsync no #當前aof檔案大小與上次重寫後文件大小的比值超過該值時進行重寫,200即等於之前的2倍 auto-aof-rewrite-percentage 200 #當aof檔案大小大於該值時程序重寫,以減小aof檔案佔用的磁碟空間 auto-aof-rewrite-min-size 64mb
1)主執行緒負責寫入AOF緩衝區。
2)AOF執行緒負責每秒執行一次同步磁碟操作,並記錄最近一次同步時間。
3)主執行緒負責對比上次AOF同步時間。如果距上次同步成功時間在2秒內,主執行緒直接返回;如果距上次同步成功時間超過2秒,主執行緒將會阻塞,直到同步操作完成。
如果系統fsync緩慢,將會導致Redis主執行緒阻塞影響效率。
上次我將一千兩百萬記錄的ip庫資料寫入redis時,就因為開啟了aof持久化策略,由於大批量資料的寫入,導致aof檔案幾乎每秒重寫一次,後面改為1g時重寫也因為檔案過大重寫時間長,沒有一次能夠成功將一千兩百萬資料成功寫入的。