Redis重點特性DevOps

FeelTouch發表於2019-04-03

延遲

因為Redis是個單執行緒模型,客戶端過來的命令是按照順序執行的。因此網路問題、慢命令會造成阻塞導致redis效能下降。
如果發生命令阻塞就可以看到每秒命令處理數在明顯下降。要分析解決這個效能問題,需要跟蹤命令處理數的數量和延遲時間。

降低延遲的幾個技巧:

  1. 使用多引數命令
    若是客戶端在很短的時間內傳送大量的命令過來,會發現響應時間明顯變慢,這由於後面命令一直在等待佇列中前面大量命令執行完畢。因此我們可以使用單命令多引數的方式,來減少操作。例如mset
    mget hmset hmget等。
  2. 管道拼接,降低網路延遲
  3. 避免操作大集合的慢命令
1. 檢視redis延遲時間
 $redis-cli.exe -c -h 127.0.0.1 -p 6379 --latency
min: 0, max: 4, avg: 0.26 (11889 samples)
本客戶端操作的平均延遲是260μs

2. 查詢慢日誌
$redis-cli.exe -h 127.0.0.1 -p 6379 slowlog get
1) 1) (integer) 2 #日誌的唯一識別符號
   2) (integer) 1550406289 #被記錄命令的執行時間點,以 UNIX 時間戳格式表示
   3) (integer) 14920 #查詢執行時間,以微秒為單位。例子中命令使用14毫秒。
   4) 1) "CONFIG" #)執行的命令,以陣列的形式排列。
      2) "set"
      3) "maxclients"
      4) "10000"
2) 1) (integer) 1
   2) (integer) 1550404443
   3) (integer) 43756
   4) 1) "keys"
      2) "*"
3) 1) (integer) 0
   2) (integer) 1550403651
   3) (integer) 41940
   4) 1) "keys"
      2) "*"

連線

因為Redis是單執行緒模型(只能使用單核),來處理所有客戶端的請求, 但由於客戶端連線數的增長,處理請求的執行緒資源開始降低分配給單個客戶端連線的處理時間,這時每個客戶端需要花費更多的時間去等待Redis共享服務的響應。

因為Redis是單執行緒模型(只能使用單核),來處理所有客戶端的請求,且Redis預設允許客戶端連線的最大數量是10000。若是看到連線數超過5000以上,那可能會影響Redis的效能。因此監控客戶端連線數是非常重要的,因為客戶端建立連線數的數量可能超出預期的數量,也可能是客戶端端沒有有效的釋放連線。

相關配置項:

maxclients 10000
tcp-backlog 10240 #TCP 監聽的最大容納數量 預設511

記憶體

使用redis經常會因為memory引發一些列的問題。像因為記憶體交換產生的效能問題以及延遲問題等。可以通過一下幾種方式來減少redis記憶體交換的發生

  • 使用Hash
    Redis在儲存小於100個欄位的Hash結構上,其儲存效率是非常高的。官方也建議我們儘可能多的使用Hash儲存。Hash的操作命令是HSET(key,
    fields, value)和HGET。
  • 設定key的過期時間
  • 回收key
    設定要maxmemory,切redis例項啟用了rdb功能就需要將maxmemory設定為系統可使用記憶體的45%,因為快照時需要一倍的記憶體來複制整個資料集,也就是說如果當前已使用45%,在快照期間會變成95%(45%+45%+5%),其中5%是預留給其他的開銷。如果沒開啟快照功能,maxmemory最高能設定為系統可用記憶體的95%。
    當記憶體使用達到設定的最大閥值時,需要選擇一種key的回收策略,即配置檔案中的maxmemory-policy欄位設定
    若是Redis資料集中的key都設定了過期時間,那麼volatile-ttl策略是比較好的選擇。但如果key在達到最大記憶體限制時沒能夠迅速過期,或者根本沒有設定過期時間。那麼設定為allkeys-lru值比較合適,它允許Redis從整個資料集中挑選最近最少使用的key進行刪除(LRU淘汰演算法)。

Redis還提供了一些其他淘汰策略,如下:

volatile-lru:使用LRU演算法從已設定過期時間的資料集合中淘汰資料。
volatile-ttl:從已設定過期時間的資料集合中挑選即將過期的資料淘汰。
volatile-random:從已設定過期時間的資料集合中隨機挑選資料淘汰。
allkeys-lru:使用LRU演算法從所有資料集合中淘汰資料。 allkeys-random:從資料集合中任意選擇資料淘汰。
no-enviction:禁止淘汰資料。

通過設定maxmemory為系統可用記憶體的45%或95%(取決於持久化策略)和設定maxmemory-policy為volatile-ttl或allkeys-lru(取決於過期設定),可以比較準確的限制Redis最大記憶體使用率,在絕大多數場景下使用這2種方式可確保Redis不會進行記憶體交換。倘若你擔心由於限制了記憶體使用率導致丟失資料的話,可以設定noneviction值禁止淘汰資料。

另外一定要配置

/proc/sys/vm/min_free_kbytes 讓系統及時回收記憶體
echo 102400 > /proc/sys/vm/min_free_kbytes 設定100m開始回收記憶體

相關文章