天天看點

【Redis實戰專題】全方位探索Redis的性能監控以及優化指南

作者:小心程式猿QAQ

Redis基本簡介

Redis是一個開源(BSD 許可)、記憶體存儲的資料結構伺服器,可用作資料庫,高速緩存和消息隊列代理。它支援字元串、哈希表、清單、集合、有序集合等資料類型。内置複制、Lua 腳本、LRU收回、事務以及不同級别磁盤持久化功能,同時通過 Redis Sentinel 提供高可用,通過Redis Cluster提供自動分區。

Redis監控名額

Redis本身提供的INFO指令會傳回豐富的執行個體運作監控資訊,這個指令是Redis監控工具的基礎。總體INFO指令的傳回資訊分成以下5大類。

  • 性能名額:Performance
  • 記憶體名額: Memory
  • 基本活動名額:Basic activity
  • 持久性名額: Persistence
  • 錯誤名額:Error

Redis基本的監控指令—INFO 指令

INFO指令在使用時,可以帶一個參數section,這個參數的取值有好幾種,相應的,INFO 指令也會傳回不同類型的監控資訊。如下圖所示:

【Redis實戰專題】全方位探索Redis的性能監控以及優化指南

在監控Redis 運作狀态時,INFO指令傳回的結果非常有用。如果你想了解 INFO 指令的所有參數傳回結果的詳細含義。可以根據Redis中文官方文檔-Info品質以及Redis官方文檔進行介紹說明。這裡,我給你提幾個運維時需要重點關注的參數以及它們的重要傳回結果。

性能名額:Performance指令

無論你是運作單執行個體或是叢集,我建議你重點關注一下stat 、commandstat 、cpu 和 memory 這四個參數的傳回結果,這裡面包含了指令的執行情況(比如指令的執行次數和執行時間、指令使用的 CPU資源),記憶體資源的使用情況(比如記憶體已使用量、記憶體碎片率),CPU 資源使用情況等,這可以幫助我們判斷執行個體的運作狀态和資源消耗情況。

info stats

當執行info stats指令的時候所出現的效果:

【Redis實戰專題】全方位探索Redis的性能監控以及優化指南

分析的大多數結果

total_connections_received:1083173900
total_commands_processed:8313824390
instantaneous_ops_per_sec:271
total_net_input_bytes:1356487222784
total_net_output2bytes:2360788536838
instantaneous_input_kbps:13.49
instantaneous_output_kbps:1.84
rejected_connections: 0
複制代碼           

基礎的相關的資料資訊統計

  • total_connections_received:主要用于統計累計的接收的總體連接配接數。
  • total_commands_processed:主要用于統計累計的指令的處理指令數量。
  • instantaneous_ops_per_sec:瞬時的每秒的請求數量,主要用于跟蹤已處理指令的吞吐量對于診斷Redis執行個體中高延遲的原因至關重要。
  • total_net_input_bytes:主要用于統計網絡輸入的總體位元組數
  • total_net_output_bytes:主要用于統計網絡輸出的總體位元組數
  • instantaneous_input_kbps:瞬時的較高的輸入的kb指。
  • instantaneous_output_kbps:瞬時的較高的輸出的kb指。
  • rejected_connections:被總體的拒接的連接配接數量。

持久性名額: Persistence

當你啟用RDB或AOF功能時,你就需要重點關注下 persistence 參數的傳回結果,你可以通過它檢視到 RDB 或者 AOF 的執行情況。總體介紹一下持久化相關的監控資訊,如下圖所示:

【Redis實戰專題】全方位探索Redis的性能監控以及優化指南

RDB相關的資訊統計

  • rdb_changes_since_last_save:24455275 - 表明上次RDB儲存以後改變的key次數
  • rdb_bgsave_in_progress:0 - 表示目前是否在進行bgsave操作。是為1
  • rdb_last_save_time:1673341911 - 上次儲存RDB檔案的時間戳
  • rdb_last_bgsave_status:ok - 上次儲存的狀态
  • rdb_last_bgsave_time_sec:9 - 上次儲存的耗時
  • rdb_current_bgsave_time_sec:-1 - 目前儲存RDB檔案已花費的時間
  • rdb_last_cow_size:11120640 -

AOF相關的資訊統計

檔案狀态監控相關的參數

  • aof_enabled : 一個标志值,記錄了 AOF 是否處于打開狀态,1代表打開。
  • aof_rewrite_in_progress : 一個标志值,記錄了伺服器是否正在建立AOF檔案。
  • aof_rewrite_scheduled : 一個标志值,記錄了在 RDB 檔案建立完畢之後,是否需要執行預約的 AOF 重寫操作。
  • aof_last_rewrite_time_sec : 最近一次建立 AOF 檔案耗費的時長。
  • aof_current_rewrite_time_sec : 如果伺服器正在建立 AOF 檔案,那麼這個域記錄的就是目前的建立操作已經耗費的秒數。
  • aof_last_bgrewrite_status : 一個标志值,記錄了最近一次建立 AOF 檔案的結果是成功還是失敗。

info clients

【Redis實戰專題】全方位探索Redis的性能監控以及優化指南

主要辨別已連接配接用戶端的資訊,它包含以下域:

connected_clients:406
client_recent_max_input_buffer:4
client_recent_max_output_buffer:0
blocked_clients:40
複制代碼           

針對于用戶端的相關的結果資訊介紹說明:

  • connected_clients : 已連接配接用戶端的數量(不包括通過從屬伺服器連接配接的用戶端)
  • client_longest_output_list : 目前連接配接的用戶端當中,最長的輸出清單
  • client_longest_input_buf : 目前連接配接的用戶端當中,最大輸入緩存
  • blocked_clients : 正在等待阻塞指令(BLPOP、BRPOP、BRPOPLPUSH)的用戶端的數量

info commandstats

主要用于統計相關的指令指令的執行速度以及相關的指令執行頻率。

【Redis實戰專題】全方位探索Redis的性能監控以及優化指南

部分記錄了各種不同類型的指令的執行統計資訊,比如指令執行的次數、指令耗費的 CPU 時間、執行每個指令耗費的平均 CPU 時間等等。對于每種類型的指令,這個部分都會添加一行以下格式的資訊:

cmdstat_multi:calls=2792,usec=188,usec_per_call=0.07
複制代碼           
  • cmdstat_multi:代表着指令名稱:cmdstat_指令名稱
  • calls:代表着指令執行次數
  • usec:執行的指令時間(微秒)
  • usec_per_call:每秒的調用次數,用于計算頻次

info cpu

cpu 部分記錄了 CPU 的計算量統計資訊,它包含以下域:

【Redis實戰專題】全方位探索Redis的性能監控以及優化指南
  • used_cpu_sys : Redis 伺服器耗費的系統 CPU時間 。
  • used_cpu_user : Redis 伺服器耗費的使用者 CPU時間 。
  • used_cpu_sys_children : 背景程序耗費的系統 CPU時間 。
  • used_cpu_user_children : 背景程序耗費的使用者 CPU時間 。

user_cpu_sys 和user_cpu_sys_children

user_cpu_sys是Redis主程序消耗,user_cpu_sys_children是背景程序消耗(背景包括RDB檔案的消耗,master,slave同步産生的消耗等等)

  • user指的是指令在 使用者态(User Mode)所消耗的CPU時間
  • sys指的是指令在 核心态(Kernel Mode)所消耗的CPU時間。

發現這4個CPU名額是一個統計名額,比如used_cpu_sys是将所有Redis主程序在核心态所占用的CPU時間求和累計起來,是以它會随着Redis啟動的時間長度不斷累計上升,并在你重新開機Redis服務後清0。

info memory

memory 部分記錄了伺服器的記憶體資訊,它包含以下域

【Redis實戰專題】全方位探索Redis的性能監控以及優化指南
  • used_memory : 由Redis配置設定器配置設定的記憶體總量,以位元組(byte)為機關
  • used_memory_human : 以使用者可讀的格式傳回Redis配置設定的記憶體總量
  • used_memory_rss : 從作業系統的角度,傳回 Redis 已配置設定的記憶體總量(俗稱常駐集大小)。這個值和 top 、 ps 等指令的輸出一緻。
  • used_memory_peak : Redis的記憶體消耗峰值(以位元組為機關)
  • used_memory_peak_human : 以使用者可讀的格式傳回 Redis 的記憶體消耗峰值
  • used_memory_lua : Lua引擎所使用的記憶體大小(以位元組為機關)
  • mem_fragmentation_ratio : used_memory_rss 和 used_memory 之間的比率
  • mem_allocator : 在編譯時指定的, Redis 所使用的記憶體配置設定器。可以是 libc 、 jemalloc 或者 tcmalloc 。

在理想情況下, used_memory_rss 的值應該隻比 used_memory 稍微高一點兒。 當 rss > used ,且兩者的值相差較大時,表示存在(内部或外部的)記憶體碎片。 記憶體碎片的比率可以通過 mem_fragmentation_ratio 的值看出。

當 used > rss 時,表示Redis的部分記憶體被作業系統換出到交換空間了,在這種情況下,操作可能會産生明顯的延遲。

當 Redis 釋放記憶體時,配置設定器可能會,也可能不會,将記憶體返還給作業系統。如果 Redis 釋放了記憶體,卻沒有将記憶體返還給作業系統,那麼 used_memory 的值可能和作業系統顯示的 Redis 記憶體占用并不一緻。

基本活動名額:Basic activity

如果你在使用主從叢集,就要重點關注下 replication 參數的傳回結果,這裡面包含了主從同步的實時狀态。

info replication

【Redis實戰專題】全方位探索Redis的性能監控以及優化指南

主/從複制資訊

role : 如果目前伺服器沒有在複制任何其他伺服器,那麼這個域的值就是 master ;否則的話,這個域的值就是 slave 。注意,在建立複制鍊的時候,一個從伺服器也可能是另一個伺服器的主伺服器。

如果目前伺服器是一個從伺服器的話,那麼這個部分還會加上以下域:

  • master_host : 主伺服器的 IP 位址。
  • master_port : 主伺服器的 TCP 監聽端口号。
  • master_link_status : 複制連接配接目前的狀态, up 表示連接配接正常, down 表示連接配接斷開。
  • master_last_io_seconds_ago : 距離最近一次與主伺服器進行通信已經過去了多少秒鐘。
  • master_sync_in_progress : 一個标志值,記錄了主伺服器是否正在與這個從伺服器進行同步。

如果同步操作正在進行,那麼這個部分還會加上以下域:

  • master_sync_left_bytes : 距離同步完成還缺少多少位元組資料。
  • master_sync_last_io_seconds_ago : 距離最近一次因為 SYNC 操作而進行 I/O 已經過去了多少秒。

如果主從伺服器之間的連接配接處于斷線狀态,那麼這個部分還會加上以下域:

  • master_link_down_since_seconds : 主從伺服器連接配接斷開了多少秒。

INFO 指令隻是提供了文本形式的監控結果,并沒有可視化,是以,在實際應用中,我們還可以使用一些第三方開源工具,将 INFO 指令的傳回結果可視化。接下來,我要講的 Prometheus ,就可以通過插件将 Redis 的統計結果可視化。

  • 參考資料

Prometheus的Redis-exporter監控

Prometheus監控體系

Prometheus是一套開源的系統監控報警架構。它的核心功能是從被監控系統中拉取監控資料,結合Grafana 工具,進行可視化展示。

監控資料

監控資料可以儲存到時序資料庫中,以便運維人員進行曆史查詢。同時,Prometheus 會檢測系統的監控名額是否超過了預設的門檻值,一旦超過門檻值,Prometheus 就會觸發報警。

對于系統的日常運維管理來說,這些功能是非常重要的。而Prometheus已經實作了使用這些功能的工具架構。我們隻要能從被監控系統中擷取到監控資料,就可以用 Prometheus 來實作運維監控。

Redis-exporter插件

Prometheus 正好提供了插件功能來實作對一個系統的監控,我們把插件稱為 exporter ,每一個 exporter實際是一個采集監控資料的元件。exporter采集的資料格式符合 Prometheus 的要求,Prometheus 擷取這些資料後,就可以進行展示和儲存了。

Redis-exporter

Redis-exporter就是用來監控 Redis的,它将 INFO 指令監控到的運作狀态和各種統計資訊提供給 Prometheus,進而進行可視化展示和報警設定。目前,Redis-exporter 可以支援 Redis 2.0 至 6.0 版本,适用範圍比較廣。

除了擷取 Redis 執行個體的運作狀态,Redis-exporter 還可以監控鍵值對的大小和集合類型資料的元素個數,這個可以在運作 Redis-exporter 時,使用 check-keys 的指令行選項來實作。

此外,我們可以開發一 Lua 腳本,定制化采集所需監控的資料。然後,我們使用 scripts 指令行選項,讓 Redis-exporter 運作這個特定的腳本,進而可以滿足業務層的多樣化監控需求。

Redis-stat 和Redis Live工具

Redis-exporter 相比,這兩個都是輕量級的監控工具。它們分别是用 Ruby 和 Python 開發的,也是将 INFO 指令提供的執行個體運作狀态資訊可視化展示。雖然這兩個工具目前已經很少更新了,不過,如果你想自行開發 Redis 監控工具,它們都是不錯的參考。

原文連結:https://juejin.cn/post/7188186074475135036

繼續閱讀