Redis持久化 問題定位與優化(三)

2022-03-14 00:23:24 字數 2861 閱讀 4044

核心知識點:

1.fork操作

a.在rdb或aof重寫時,會執行fork操作建立子程序,fork操作是乙個重量級操作。

b.改善fork操作耗時的手段:避免使用xen、配置redis例項最大使用記憶體、合理配置liunx記憶體使用技術、降低fork操作的頻率。

2.子程序開銷監控與優化

1).cpu

2).記憶體

3).硬碟

3.aof追加阻塞

redis持久化功能一直是影響redis效能的高發地,下面我們結合常見的持久化功能問題進行分析定位和優化。

一、fork操作

當redis做rdb或aof重寫時,乙個必不可少的操作就是執行fork操作建立子程序,對於大多是系統來說fork是乙個重量級操作

雖然fork建立的子程序不需要拷貝父程序的物理記憶體空間,但是會複製父程序的空間記憶體頁表。

例如對於10gb的redis程序,需要複製大約20mb的記憶體頁表,因此fork操作耗時跟程序總記憶體息息相關,

如果使用虛擬化技術,特別是xen虛擬機器,fork操作會更耗時。

fork耗時問題定位:對於高流量的redis例項ops可達5萬以上,

如果fork操作耗時在秒級別將拖慢redis幾萬條命令執行,對線上應用延遲影響非常明顯。

正常情況下,fork耗時應該是每gb消耗20毫秒。可以在info stats統計中查latest_fork_usec指標獲取最近一次fork操作耗時,單位微秒。

如何改善fork操作的耗時:

1)優先使用物理機或者高效支援fork操作的虛擬機器技術,避免使用xen

2)控制redis例項最大可用記憶體,fork耗時跟記憶體量成正比,線上建議每個redis例項記憶體控制在10gb以內。

3)合理配置linux記憶體分配策略,避免物理記憶體不足導致fork失敗。

4)降低fork操作的頻率,如適度放寬aof自動觸發時機,避免不必要的全量複製等

二、子程序開銷監控和優化

子程序負責aof或者rdb檔案的重寫,它的執行過程主要涉及cpu、記憶體、硬碟三部分的消耗。

1.cpu

(1)cpu開銷分析

子程序負責把程序內的資料分批寫入檔案,這個過程屬於cpu密集操作,通常子程序對單核cpu利用率接近90%。

(2)cpu消耗。

redis是cpu密集型操作,不要做繫結單核cpu的操作。由於子程序非常消耗cpu,會和父程序產生單核資源競爭。

不要和其他cpu密集型服務部署在一起,造成cpu過度競爭。

如果部署多個redis例項,盡量保證同一時刻只有乙個子程序執行重寫工作。

2.記憶體

(1)記憶體消耗分析

子程序通過fork操作產生,占用記憶體大小等同於父程序,理論上需要兩倍的記憶體來完成持久化的操作,但是linux有寫時複製機制。

父程序會共享相同的物理記憶體頁,當父程序處理寫請求時會把要修改的頁建立副本,而子程序在fork操作過程中共享整個父程序記憶體快照。

(2)記憶體消耗監控

如果重寫過程中存在記憶體頁操作,父程序負責建立所修改記憶體頁的副本,從日誌中可以看出這部分的記憶體消耗。

父程序維護頁副本消耗同rdb重寫過程類似,不同之處在於aof重寫需要aof重寫緩衝區。

(3)記憶體消耗優化

在linux kernel在2.6.38核心增加了transparent huge pages(thp),支援huge page(2mb)的頁分配,預設開啟。

當開啟時可以降低fork建立子程序的速度,但執行fork之後,如果開啟htp,複製頁單位會從原來4kb變為2mb,會大幅增加重寫期間父程序的記憶體消耗。

3.硬碟

(1)硬碟開銷分析

子程序主要職責是把aof或者rdb檔案寫入硬碟持久化,勢必會造成硬碟寫入壓力,

根據redis重寫aof/rdb的資料量,結合系統工具如sar、iotop等,可分析出重寫期間硬碟負載情況。

(2)硬碟開銷優化

三、aof追加阻塞

當開啟持久化時,常用的同步硬碟的策略是everysec,用於平衡效能和資料安全性。

對於這種方式,redis使用另一條執行緒每秒執行fsync同步硬碟。當系統硬碟資源繁忙時,會造成redis主線程阻塞。

1.阻塞流程分析:

(1)主線程負責寫入aof緩衝區。

(2)aof執行緒負責每秒執行一次同步操作,並記錄最近一次同步時間。

(3)主線程負責每秒執行一次同步磁碟操作,並記錄最近一次同步時間。

通過分析aof阻塞流程可以發現兩個問題:

(1)everysec配置最多可能丟失2秒資料,不是1秒。

(2)如果系統fsync緩慢,將會導致redis主線程阻塞影響效率。

2.aof阻塞問題定位

(1)發生aof阻塞問題,redis會在日誌中記錄其行為。

(2)每當發生aof追加阻塞事件,在info persistence統計中,aof_delayed_fsync指標會累加,檢視這個指標方便定位aof阻塞問題。

(3)aof同步最多允許2秒延遲,當延遲發生時說明硬碟存在高負載問題,可以通過監控工具如iotop,定位消耗硬碟io資源的程序。

redis記憶體優化 事物 持久化

先了解乙個 k v資料的記憶體比例 set kk v111 分兩個部分。每個k v 佔據的空間 bucket佔據的空間 bucket 每個k v 資料之間佔的記憶體 大於 k v 個數的 2的n次方大小的最小值 比如 次處只有1個資料 那麼佔的大小就是 2的1次方 bucket 2bit dicte...

redis持久化 AOF持久化

1.aof持久化原理 aof持久化會將被執行的寫命令寫到aof檔案的末尾。在恢復的時候,redis只要從頭到尾重新執行一次aof檔案包含的所有寫命令 2.配置選項 固態硬碟禁用always選項,在某些情況頻繁讀寫會大大降低固態硬碟的壽命 4.aof檔案的重寫和壓縮 aof檔案裡面記錄了所有的命令而不...

redis持久化之AOF持久化

aof與rdb持久化通過儲存資料庫中的鍵值對來記錄資料庫狀態不同,aof持久化是通過儲存redis伺服器所執行的寫命令來記錄資料庫狀態的。被寫入aof檔案的所有命令都是以redis的命令請求協議格式儲存的。當aof持久化功能處於開啟狀態,伺服器在執行完乙個寫命令之後,會以協議格式將被執行的寫命令追加...