首頁 >資料庫 >Redis >Redis持久化過程的監控及最佳化

Redis持久化過程的監控及最佳化

齐天大圣
齐天大圣原創
2020-05-23 12:04:371621瀏覽

Redis持久化過程一直是影響redis效能的常見因素,如何監控持久化以及如何優化持久化過程?下面我們就一起來看看吧。

fork的監控及最佳化

不管是使用哪一種持久化,RDB持久化或AOF重寫,主行程都會fork出一個子進程,在子進程裡完成rdb檔案的生成或aof的重寫。 fork操作對於作業系統來說屬於比較重的操作。 fork階段,redis會阻塞一段時間。阻塞時間和redis資料佔用的記憶體大小成正比關係,每1G記憶體fork耗時在20毫秒。

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

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

優化fork的方法:

  • 控制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實例持久化進行隔離。

以上是Redis持久化過程的監控及最佳化的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn