Redis持久化過程的監控及優化

Redis持久化過程一直是影響redis性能的常見因素,如何監控持久化以及如何優化持久化過程呢?下面咱們就一塊兒來看看吧。node

 

fork的監控及優化linux

無論是使用哪一種持久化,RDB持久化或AOF重寫,主進程都會fork出一個子進程,在子進程裏完成rdb文件的生成或aof的重寫。fork操做對於操做系統來講屬於比較重的操做。fork階段,redis會阻塞一段時間。阻塞時間和redis數據佔用的內存大小成正比關係,每1G內存fork耗時在20毫秒。ios

如想知道fork階段的阻塞時間,能夠使用info stats命令,查看latest_fork_usec選項的值,單位是微秒。記住是微秒,不是毫秒。redis

# redis-cli info stats | grep latest
latest_fork_usec:323

  

優化fork的方法:shell

  • 控制redis佔用的內存大小。若佔用內存過大的話,能夠將應用拆分開,在多個服務器上部署,分攤redis的內存佔用。
  • 適當下降fork的操做頻率。

內存的監控緩存

RDB持久化的日誌以下:服務器

……
21692:C 15 May 2020 14:17:06.935 * DB saved on disk
21692:C 15 May 2020 14:17:06.936 * RDB: 2 MB of memory used by copy-on-write
……

  

能夠看到RDB持久化過程消耗了2M內存。架構

AOF持久化日誌以下:性能

……
15786:C 23 May 2020 07:39:59.145 * AOF rewrite: 2MB of memory used by copy-on-write
10679:M 23 May 2020 07:39:59.201 * Background AOF rewrite terminated with success
10679:M 23 May 2020 07:39:59.201 * Residual parent diff successfully flushed to the rewritten AOF (0.02 MB)
10679:M 23 May 2020 07:39:59.201 * Background AOF rewrite finished successfully

  

能夠看到,aof重寫佔用的內存爲2MB+0.02MB=2.02MB學習

如想監控持久化過程當中內存佔用狀況,能夠編寫shell腳本,統計出redis日誌裏相關信息。

硬盤的監控

Redis持久化過程會對硬盤形成壓力,由於持久化後,內存的數據會保存到硬盤中。

linux系統監控硬盤的命令有sar、iostat等,如發現硬盤io壓力超過閥值,再根據redis的日誌對比下持久化的時間,看看是否是因爲redis持久化形成的壓力。

優化方法這裏提兩點:

  • 使用性能好的磁盤,機械硬盤確定比不了固態硬盤。
  • 若是是單機上配置了好幾個redis實例,能夠分別寫入不一樣的磁盤裏,減輕磁盤的寫入壓力。

單機多實例部署

由於redis是單線程架構,若是一個服務器上只部署一個redis實例,那麼對於多核cpu來講是一種浪費。因此,一般會在一個服務器上部署多個redis應用,好比開啓三個redis服務,端口號分別爲6379,6380,6381。6379用來作緩存服務,6380用來作消息隊列,6381用來作標籤及推薦系統。

這樣確實能夠充分利用cpu,但會容易產生問題。若是多個實例同時在進行持久化,那麼對於cpu、內存及影片的壓力是很是大的。好的作法是將他們隔離開來,同一時間只有一個實例在進行持久化。

實現該效果的僞代碼以下:

while (true)
{
 $redisObj = [6379,6380,……];
  
 foreach ($redisObj as $obj) {
 // 該實例是否構成重寫的要求
 if (rewriteConf($ojb)) {
 // 該實例進行持久化
 }
 }
}

  

foreach用來遍歷每個redis實例,而後對該實例是否達到重寫的條件作判斷,知足就開始進行重寫。這樣就能夠將多redis實例持久化進行隔離。

更多學習內容請訪問:

八重櫻:騰訊T3-T4標準精品PHP架構師教程目錄大全,只要你看完保證薪資上升一個臺階(持續更新)

相關文章
相關標籤/搜索