今日聚焦!【Redis實戰專題】「性能監控系列」全方位探索Redis的性能監控以及優化指南

2023-01-14 11:12:25 來源:51CTO博客

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 運行狀態時,INFO命令返回的結果非常有用。如果你想了解 INFO 命令的所有參數返回結果的詳細含義。可以根據??Redis中文官方文檔-Info質量??以及??Redis官方文檔??進行介紹說明。這里,我給你提幾個運維時需要重點關注的參數以及它們的重要返回結果。

性能指標:Performance指令

無論你是運行單實例或是集群,我建議你重點關注一下stat 、commandstat 、cpu 和 memory 這四個參數的返回結果,這里面包含了命令的執行情況(比如命令的執行次數和執行時間、命令使用的 CPU資源),內存資源的使用情況(比如內存已使用量、內存碎片率),CPU 資源使用情況等,這可以幫助我們判斷實例的運行狀態和資源消耗情況。

info stats

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

分析的大多數結果

total_connections_received:1083173900total_commands_processed:8313824390instantaneous_ops_per_sec:271total_net_input_bytes:1356487222784total_net_output2bytes:2360788536838instantaneous_input_kbps:13.49instantaneous_output_kbps:1.84rejected_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 的執行情況。總體介紹一下持久化相關的監控信息,如下圖所示:

RDB相關的信息統計
rdb_changes_since_last_save:24455275 - 表明上次RDB保存以后改變的key次數rdb_bgsave_in_progress:0 - 表示當前是否在進行bgsave操作。是為1rdb_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

主要標識已連接客戶端的信息,它包含以下域:

connected_clients:406client_recent_max_input_buffer:4client_recent_max_output_buffer:0blocked_clients:40

針對于客戶端的相關的結果信息介紹說明:

connected_clients : 已連接客戶端的數量(不包括通過從屬服務器連接的客戶端)client_longest_output_list : 當前連接的客戶端當中,最長的輸出列表client_longest_input_buf : 當前連接的客戶端當中,最大輸入緩存blocked_clients : 正在等待阻塞命令(BLPOP、BRPOP、BRPOPLPUSH)的客戶端的數量
info commandstats

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

部分記錄了各種不同類型的命令的執行統計信息,比如命令執行的次數、命令耗費的 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 的計算量統計信息,它包含以下域:

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 部分記錄了服務器的內存信息,它包含以下域

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
主/從復制信息

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 監控工具,它們都是不錯的參考。

標簽: 主要用于 運行狀態 服務器的

上一篇:環球熱文:FPGA:邏輯函數的卡諾圖化簡法
下一篇:環球快報:50-Docker-分布式倉庫Harbor高可用