日本熟妇hd丰满老熟妇,中文字幕一区二区三区在线不卡 ,亚洲成片在线观看,免费女同在线一区二区

文檔

排查Redis實例內存使用率高的問題

更新時間:

當Redis內存不足時,可能導致Key頻繁被逐出、響應時間上升、QPS(每秒訪問次數)不穩定等問題,進而影響業務運行。如果發現Redis內存占滿或收到內存告警,可參考本文判斷內存占用是否長期過高、內存占用是否突然上升、是否發生內存傾斜,并通過拆分大Key,設置過期策略,升級規格等方法解決問題。

內存使用率高的現象分類

內存使用率高,通常分為以下三種情況:

  • 內存使用率在較長一段時間內一直處于較高水位。通常,當內存使用率超過95%時需要及時關注。

  • 內存使用率一直較低,但從某個時間點開始突然上升至較高水位,甚至達到100%。

  • 實例整體的內存使用率較低,但某個數據分片節點內存使用率接近100%

請根據不同情況,分別采取措施降低內存使用率。

內存使用率長期處于高水位的解決辦法

  1. 查詢現有的Key是否符合業務預期,及時清理無用的Key。

  2. 通過緩存分析功能,分析大Key分布和Key的TTL過期策略。具體操作,請參見離線全量Key分析

    1. 分析Key是否有合理的TTL策略。

      說明

      以下示例中,所有的Key均未設置過期時間,建議根據業務需求來衡量,并在應用端設置合理的過期時間。

      圖 4. Key的過期時間分布示例Key的過期時間分布示例

    2. 對大Key進行評估,然后在業務側對大Key進行拆分。

      圖 5. 大Key分析示例大Key分析示例

  3. 根據業務需求,設置合理的數據逐出策略(即調整maxmemory-policy參數的值)。具體操作,請參見設置實例參數

    說明

    云數據庫Redis默認的數據逐出策略為volatile-lru,更多信息,請參見數據逐出策略介紹

  4. 根據業務需求,設置合理的過期Key主動刪除的執行頻率(即調整hz參數的值)。具體操作,請參見調整Redis定期任務的執行頻率

    說明

    hz的取值建議在100以內,如果該值過大將對CPU的使用率產生較大影響。您也可以設置為自動調整(要求Redis實例的大版本為5.0及以上版本),具體操作,請參見自動調整Redis定期任務的執行頻率

  5. 經過上述步驟優化后,內存使用率依舊較高,可評估升級至更大內存的規格,以承載更多數據并改善性能。具體操作,請參見變更實例配置

    說明

    在正式升級實例的規格前,您可以先購買一個按量付費的實例,測試要升級到的目標規格是否能夠滿足業務的負載需求,測試完成后可將其釋放。關于如何釋放實例,請參見釋放按量付費實例

內存使用率突然上升的解決辦法

問題原因

內存使用率突然升高的主要原因如下:

  • 短時間內大量寫入新數據。

  • 短時間內大量創建新連接。

  • 突發訪問產生大量流量超過網絡帶寬,導致輸入緩沖區和輸出緩沖區積壓。

  • 客戶端處理速度跟不上Redis的處理速度,導致輸出緩沖區積壓。

解決方案

請依次排查內存使用率突然升高的原因,并參考對應的解決方案解決問題。

排查是否寫入大量新數據

排查方法:

查看Redis性能監控的入流量寫QPS。如果入流量與寫QPS的趨勢與內存使用率的趨勢一致,說明大量的數據寫入導致內存使用率突然升高。

解決方案:

  1. 通過設置Key的過期時間自動清理不再需要的Key,或手動刪除不再需要的Key。

  2. 升級實例規格,通過增加內存容量緩解內存使用率升高的問題。詳情請參見變更實例配置

  3. 如果您的實例為標準版,擴容內存規格后仍無法解決內存使用率高的問題,可以考慮升級為集群版,將數據分布到多個數據分片節點上,減輕單個數據分片節點的內存壓力。詳情請參見變更實例配置

排查是否創建大量新連接

排查方法:

查看Redis性能監控的連接數。如果連接數突然增長,且與內存使用率的趨勢一致說明大量新建連接導致內存使用率突然升高。

解決方案:

  1. 排查是否存在連接泄漏。

  2. 設置連接超時時間,自動關閉空閑連接。詳情請參見設置客戶端的超時時間

排查是否突發流量導致輸入和輸出緩沖區積壓

排查方法:

  1. 查看性能監控的出入口流量使用率是否達到100%。

  2. 執行MEMORY STATS命令,查看clients.normal占用的內存是否過多。

    說明

    clients.normal反映了所有普通客戶端連接的輸入和輸出緩沖區所占用的內存總量。

解決方案:

  1. 排查業務流量突發原因。

  2. 增加實例的網絡帶寬。詳情請參見手動增加實例帶寬開啟帶寬彈性伸縮

  3. 升級實例規格,以保證輸入輸出緩沖區的使用。詳情請參見變更實例配置

排查是否因客戶端性能問題導致輸出緩沖區積壓

排查方法:

在Redis中,執行MEMORY DOCTOR命令,查看big_client_buf的值。當big_client_buf=1時,代表至少有一個客戶端的輸出緩沖區占用內存較大。

解決方案:

執行CLIENT LIST命令,查看哪個客戶端的輸出緩沖區內存占用量(omem)較大。排查該客戶端應用是否存在性能問題。

數據分片節點內存使用率高的解決方法

現象

如果Redis實例為集群版,您可能從以下一種或幾種現象發現數據分片節點的內存使用率高:

  • 收到了云監控的內存使用率告警。告警信息中顯示某個數據節點的內存使用率高,超過了閾值。

  • 實例診斷報告顯示內存使用率發生傾斜。

  • 在性能監控頁面查看實例的內存使用率和數據節點的內存使用率,發現實例的內存使用率不高,但某個數據分片節點的內存使用率較高。

問題原因

如果實例的內存使用率不高,但某個數據分片節點的內存使用率較高,說明發生了內存傾斜。

解決方案

檢查是否存在大Key,并拆分大Key

查找大Key

通過離線全量Key分析找出大Key。

更多找出大Key的方法,請參見發現并處理Redis的大Key和熱Key

拆分大Key

例如將含有數萬成員的一個HASH Key拆分為多個HASH Key,并確保每個Key的成員數量在合理范圍。在Redis集群架構中,拆分大Key能對數據分片間的內存平衡起到顯著作用。

檢查是否使用了Hash Tag

如果使用了Hash Tag,請根據業務實際情況,評估將一個Hash Tag拆分為多個Hash Tag,使數據更加均勻地分布在不同的數據分片節點上。

擴容實例規格

擴容實例規格,可以增加實例每個分片的內存,是改善內存傾斜的臨時解決方案,具體操作請參見變更實例配置

重要
  • 變配時Redis會進行數據傾斜預檢查,若您選擇的實例規格無法解決內存傾斜問題,Redis會進行攔截與報錯,請您調大實例規格后重試。
  • 在成功升級實例規格后,會改善內存傾斜問題,但可能也引起帶寬傾斜或CPU傾斜。

附錄1:Redis內存占用介紹

Redis的內存占用主要由以下三部分組成:

內存占用

說明

鏈路內存(動態)

主要包括Input Buff、Output Buff、JIT Overhead、Fake Lua Link、Lua執行緩存等,例如可執行INFO命令,通過返回結果的Clients中查看客戶端緩存信息。

說明

Input buff與Output buff與每個客戶端的連接有關,通常較小。當執行客戶端Range類操作或大Key收發較慢時,Input buff與Output buff占用的內存會增大,從而影響數據區,甚至會造成內存溢出OOM(Out Of Memory)。

數據內存

用戶數據區,即實際存儲的Value信息,通常作為重點分析的對象。

管理內存(靜態)

啟動時較小且相對恒定,該區域由管理數據的Hash內存開銷、Repl-buff與aof-buff的內存開銷(約32 MB~64 MB)等構成。

說明

當Key數量特別多時(例如幾億個),會占用較大的內存。

說明

大部分OOM場景是由于動態內存管理失效引起,例如限流時請求堆積導致動態內存快速上升、過于復雜或不合理的Lua腳本也可能導致OOM。云數據庫Redis企業版(Tair)增強了對動態內存的控制,推薦選用。

附錄2:查看內存占用情況的其他方法

使用MEMORY STATS命令查看內存占用情況

在Redis中,執行MEMORY STATS命令查詢內存使用詳情。

Redis實例的內存開銷主要由兩部分組成:

  • 業務數據的內存開銷,該部分一般作為重點分析對象。

  • 非業務數據的內存開銷,例如主備復制的積壓緩沖區、Redis進程初始化消耗的內存等。

返回示例及各參數對應的解釋如下:

說明

下述返回信息中,內存數值的單位為字節。

 1) "peak.allocated" //Redis進程自啟動以來消耗內存的峰值。
 2) (integer) 79492312
 3) "total.allocated" //Redis使用其分配器分配的總字節數,即當前的總內存使用量。
 4) (integer) 79307776
 5) "startup.allocated" //Redis啟動時消耗的初始內存量。
 6) (integer) 45582592
 7) "replication.backlog" //復制積壓緩沖區的大小。
 8) (integer) 33554432
 9) "clients.slaves" //主從復制中所有從節點的讀寫緩沖區大小。
10) (integer) 17266
11) "clients.normal" //除從節點外,所有其他客戶端的讀寫緩沖區大小。
12) (integer) 119102
13) "aof.buffer" //AOF持久化使用的緩存和AOF重寫時產生的緩存。
14) (integer) 0
15) "db.0"  //業務數據庫的數量。
16) 1) "overhead.hashtable.main" //當前數據庫的hash鏈表開銷內存總和,即元數據內存。
    2) (integer) 144
    3) "overhead.hashtable.expires" //用于存儲key的過期時間所消耗的內存。
    4) (integer) 0
17) "overhead.total" //數值=startup.allocated+replication.backlog+clients.slaves+clients.normal+aof.buffer+db.X。
18) (integer) 79273616
19) "keys.count" //當前Redis實例的key總數
20) (integer) 2
21) "keys.bytes-per-key" //當前Redis實例每個key的平均大小,計算公式:(total.allocated-startup.allocated)/keys.count。
22) (integer) 16862592
23) "dataset.bytes" //純業務數據占用的內存大小。
24) (integer) 34160
25) "dataset.percentage" //純業務數據占用的內存比例,計算公式:dataset.bytes*100/(total.allocated-startup.allocated)。
26) "0.1012892946600914"
27) "peak.percentage" //當前總內存與歷史峰值的比例,計算公式:total.allocated*100/peak.allocated。
28) "99.767860412597656"
29) "fragmentation" //內存的碎片率。
30) "0.45836541056632996"

使用MEMORY DOCTOR命令查看內存診斷建議

在Redis中,執行MEMORY DOCTOR命令獲取內存診斷建議。

圖 3. 診斷結果示例診斷結果示例

MEMORY DOCTOR會從以下維度為Redis實例的提供內存診斷建議,您可以根據診斷建議制定相應的優化策略:

    int empty = 0;     /* Instance is empty or almost empty. */
    int big_peak = 0;       /* Memory peak is much larger than used mem. */
    int high_frag = 0;      /* High fragmentation. */
    int high_alloc_frag = 0;/* High allocator fragmentation. */
    int high_proc_rss = 0;  /* High process rss overhead. */
    int high_alloc_rss = 0; /* High rss overhead. */
    int big_slave_buf = 0;  /* Slave buffers are too big. */
    int big_client_buf = 0; /* Client buffers are too big. */
    int many_scripts = 0;   /* Script cache has too many scripts. */

使用MEMORY USAGE命令查看指定Key占用的內存

在Redis中,執行MEMORY USAGE命令查詢指定Key消耗的內存(單位為字節)。

命令執行示例:

MEMORY USAGE Key0089393003

返回信息如下:

(integer) 1000072