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實體持久化進行隔離,
更多學習內容請訪問:
八重櫻:騰訊T3-T4標準精品PHP架構師教程目錄大全,只要你看完保證薪資上升一個臺階(持續更新)
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/33632.html
標籤:PHP
上一篇:PHP獲取多維資料的交集與差集
下一篇:PHP中區分0和空
