運維大佬嘲笑我,這個你都不知道?

你們好,我是阿沐,一個快樂的海盜者。java

今天來給你們介紹一下info命令查看redis具體的詳細信息講解!mysql

原由是:前幾年我在老家鄭州實習面試(那個時候尚未畢業)的時候遇到面試官提問;面試官來於百度總部的工程師6年java開發經驗+3年多的PHP開發經驗,我在他的面前基本就是弟弟中的弟弟,雖然勉強經過入職了,可是卻被運維無情地嘲笑,就由於組長讓我上機看下redis的基礎狀況,我不會,問了運維。一怒之下,我當天晚上就惡補了一波......,到如今都還記着git

不過,講真,那個時候真的是沒有詳細的去看過redis的參數信息;大家有在 Redis 官網上好好的看過參數配置嗎?程序員

哈哈~~~,你們不用這麼謙虛哈。估計剛剛畢業或者實習中,甚至畢業一兩年的開發者都沒有好好地去看過(我就是其中一個,當時只會基礎的使用)。忽然以爲會用跟知道其實就是兩碼事情面試

常常能聽到別的同事或者網絡留言,會用就行,知道那麼多幹嗎。ctrl+c and ctrl+v這纔是程序員編碼的最高境界。是否是你們都是這麼想的呢?😂 😂 😂redis

有句話叫作:知其原理,方可百變「我胡謅地,莫當真」。那麼今天咱們經過info指令清晰的理解 Redis 內部一系列運行參數。sql

redis參數模塊劃分

01)詳解模塊

從上圖能夠清晰的看出來咱們將redis的參數劃分爲9大模塊,每個模塊對應的意思:docker

  • Server module:主要是指redis服務器環境參數;例如:系統版本號、服務器版本號等等。
  • Clients module:主要是指客戶端相關信息;例如:客戶端鏈接數、阻塞等待數、buffer的值等等。
  • Memory module:主要是指服務器內存消耗信息;例如:佔用內存大小、redis峯值數據。
  • Persistence module:主要是指redis的持久化信息;例如:最近一次rdb持久化是否成功、服務器是否正在載入持久化文件等等。
  • Stats module:主要是指用來統計通用的數據;例如:1/s併發數、1/min數據量、命中數量等等。
  • Replication module:主要是指主從同步信息說明;同步成功次數、同步失敗次數等等。
  • Cpu module:主要是指cpu統計信息;例如:核心態/用戶態所佔用的CPU時求和累計值等等。
  • Cluster module:主要是指集羣的相關信息;例如:是否啓用集羣模式等等。
  • KeySpace module:主要是指鍵值對統計數量信息。例如:查找鍵成功的數量、查找鍵失敗的次數等等。

02)爲何要了解?

若是你已是一個大神,那麼徹底能夠不用瞭解了。可是對於剛剛進入職場或者工做一年、兩年、甚至三年的開發並不必定了解知道這些相關知識。shell

如今大多公司已經配置了專業的運維、DBA,環境搭建、redis集羣、主從架構所有都被他們作了,難道咱們開發就不須要學習了嗎?數據庫

面試過不少開發都曾經這樣回答過:「公司都有專業的運維團隊,不少咱們不能參與,因此沒有實戰之地。只能從事業務需求開發」。這樣很顯然咱們的技術迭代確定上不去,一個開發不只僅只會作業務需求、更重要的是懂得知識的積累:mysql主主、主從;redis多主多從部署;docker、k8s等等,即便不是咱們部署的,可是咱們也要知道是怎麼一回事,公司的架構是怎麼樣,怎麼實現的,怎個流程規範?

這就是爲何要去了解這些的緣由,儘管看上去這是一篇很基礎且簡單的文章。估計很多人會在噴,可是阿沐的面對的對象羣體是須要鞏固和增強redis知識的學者。

03)內部信息詳解

➜  ~ redis-cli -h localhost
localhost:6379> info
 # Server
redis_version:5.0.9                -- Redis 服務器版本
redis_git_sha1:00000000            -- Git SHA1
redis_git_dirty:0                  -- Git髒標誌符
redis_build_id:544ec503bcbee8b6    -- 內部版本號
redis_mode:standalone              -- 運行模式 單機仍是集羣
os:Darwin 17.7.0 x86_64            -- 服務器的宿主操做系統
arch_bits:64                       -- 體系結構(32位或者64位)
multiplexing_api:kqueue            -- Redis使用的事件循環機制
atomicvar_api:atomic-builtin       -- 原子處理api
gcc_version:4.2.1                  -- 用於編譯Redis服務器的GCC編譯器的版本號
process_id:411                     -- 務器進程的PID
run_id:e8bf4443cdd6696036e07c4a65d64e6916a6a79e  -- Redis 服務器的隨機標識符(用於 Sentinel 和集羣)
tcp_port:6379                      -- TCP/IP 監聽端口
uptime_in_seconds:29924            -- redis server啓動的時間(單位秒)
uptime_in_days:0                   -- redis server啓動的時間(單位天)
hz:10                              -- redis內部調度(進行關閉timeout的客戶端,刪除過時key等等)頻率,程序規定serverCron每秒運行10次
configured_hz:10                   -- 服務器的已配置頻率設置
lru_clock:9421068                  -- 自增的時鐘,用於LRU管;該時鐘100ms(hz=10,所以每1000ms/10=100ms執行一次定時任務)更新一次
executable:/usr/local/opt/redis/bin/redis-server  -- 服務器可執行文件的路徑
config_file:/usr/local/etc/redis.conf             -- redis配置文件的路徑
 # Clients
connected_clients:1                -- 客戶端已鏈接的數量(不包括經過從屬服務器鏈接的客戶端)
client_recent_max_input_buffer:2   -- 當前客戶端最近最大輸入緩存大小
client_recent_max_output_buffer:0  -- 當前客戶端最近最大輸出緩存大小
blocked_clients:0                  -- 正在等待阻塞命令(BLPOP、BRPOP、BRPOPLPUSH)的客戶端的數量
 # Memory
used_memory:148180600              -- Redis分配器分配的內存總量,以字節(byte)爲單位
used_memory_human:1015.52K         -- 以人類可讀的格式返回Redis分配的內存總量,意思就是讓咱們正常人能看懂唄,帶有單位
used_memory_rss:3293184            -- 從操做系統的角度,返回 Redis 已分配的內存總量(俗稱常駐集大小)。這個值和top、ps等命令的輸出一致
used_memory_rss_human:3.14M        -- 以人類可讀的格式,返回 Redis 已分配的內存總量(俗稱常駐集大小);這個值和top、ps等命令的輸出一致
used_memory_peak:1040976           -- redis的內存消耗峯值(以字節爲單位),也就是峯值時佔用內存大小
used_memory_peak_human:1016.58K    -- 以人類可讀的格式返回redis的內存消耗峯值
used_memory_peak_perc:99.90%       -- (used_memory/used_memory_peak) *100%,內存峯值佔用率
used_memory_overhead:1037198       -- redis爲了維護數據集的內部機制所需的內存開銷,包括全部客戶端輸出緩衝區、查詢緩衝區、AOF重寫緩衝區和主從複製的backlog
used_memory_startup:987504         -- Redis在啓動時消耗的初始內存量(以字節爲單位)
used_memory_dataset:2690           -- 數據集的字節大小used_memory—used_memory_overhead
used_memory_dataset_perc:5.14%     -- 淨內存使用量的百分比(used_memory_dataset/(used_memory—used_memory_startup))*100%
total_system_memory:8589934592     -- 整個系統內存
total_system_memory_human:16.00G   -- 正常人能夠看懂的格式顯示  系統內存大小 帶單位
used_memory_lua:37888              -- Lua腳本存儲佔用的內存
used_memory_lua_human:37.00K       -- 正常人可看懂的格式顯示Lua腳本存儲佔用的內存 帶單位
used_memory_scripts:0              -- 緩存的Lua腳本使用的字節數
used_memory_scripts_human:0B       -- 正常人可看懂的格式顯示  緩存的Lua腳本使用的字節數 帶單位
maxmemory:0                        -- Redis實例的最大內存配置 字節數
maxmemory_human:0B                 -- 正常人可看懂格式顯示 最大內存配置 帶單位
maxmemory_policy:noeviction        -- 當達到maxmemory時的淘汰策略
allocator_frag_ratio:3.24
allocator_frag_bytes:2249712
allocator_rss_ratio:1.00
allocator_rss_bytes:0
rss_overhead_ratio:1.01
rss_overhead_bytes:37888
mem_fragmentation_ratio:3.27
mem_fragmentation_bytes:2287600
mem_not_counted_for_evict:0
mem_replication_backlog:0
mem_clients_slaves:0
mem_clients_normal:49694
mem_aof_buffer:0
mem_allocator:libc                -- 內存分配器
active_defrag_running:0           -- 表示沒有活動的defrag任務正在運行,1表示有活動的defrag任務正在運行(defrag:表示內存碎片整理)
lazyfree_pending_objects:0        -- 0表示不存在延遲釋放(也有資料翻譯未惰性刪除)的掛起對象
 # Persistence
loading:0                         -- 服務器是否正在載入持久化文件
rdb_changes_since_last_save:5     -- 離最近一次成功生成rdb文件,寫入命令的個數,即有多少個寫入命令沒有持久化
rdb_bgsave_in_progress:0          -- 服務器是否正在建立rdb文件
rdb_last_save_time:1620033801     -- 上一次成功保存RDB的基於紀元的時間戳 秒
rdb_last_bgsave_status:ok         -- 最近一次rdb持久化是否成功
rdb_last_bgsave_time_sec:-1       -- 最近一次成功生成rdb文件耗時時間(以秒爲單位)
rdb_current_bgsave_time_sec:-1    -- 正在進行的RDB保存操做的持續時間(以秒爲單位)
rdb_last_cow_size:0               -- 上一次RDB保存操做期間寫時複製內存的大小(以字節爲單位)
aof_enabled:0                     -- 是否開啓了aof
aof_rewrite_in_progress:0         -- 標識aof的rewrite操做是否在進行中
aof_rewrite_scheduled:0           -- 若是rdb保存完成以後執行rewrite
aof_last_rewrite_time_sec:-1      -- 最近一次aof rewrite耗費的時長(以秒爲單位)
aof_current_rewrite_time_sec:-1   -- 若是rewrite操做正在進行,則記錄所使用的時間(以秒爲單位)
aof_last_bgrewrite_status:ok      -- 上次bgrewriteaof操做的狀態
aof_last_write_status:ok          -- 上次aof寫入狀態
aof_last_cow_size:0               -- 最近一次aof重寫時複製內存的大小(以字節爲單位)
 # Stats
total_connections_received:1      -- 務器接受的鏈接總數(過分地建立和銷燬鏈接對性能有影響)
total_commands_processed:3        -- redis處理的命令總數
instantaneous_ops_per_sec:0       -- redis每秒處理的命令數,就是qps
total_net_input_bytes:63          -- redis網絡讀取流量的總字節數
total_net_output_bytes:14765      -- redis網絡寫入流量的總字節數
instantaneous_input_kbps:0.00     -- redis網絡入口kps,以KB/秒爲單位
instantaneous_output_kbps:0.00    -- redis網絡出口kps,以KB/秒爲單位
rejected_connections:0            -- redis鏈接個數達到maxclients限制,拒絕新鏈接的個數
sync_full:0                       -- 主從徹底同步成功次數
sync_partial_ok:0                 -- 主從部分同步成功次數
sync_partial_err:0                -- 主從部分同步失敗次數
expired_keys:0                    -- redis運行以來過時的key的數量
expired_stale_perc:0.00           -- key過時的比率
expired_time_cap_reached_count:0  -- key過時次數
evicted_keys:0                    -- redis運行以來剔除(超過了maxmemory後)的key的數量
keyspace_hits:0                   -- 查找鍵成功的數量,也就是命中的數量
keyspace_misses:0                 -- 查找鍵失敗的數量,也就是未命中的數量
pubsub_channels:0                 -- redis當前使用中的頻道數量
pubsub_patterns:0                 -- 當前使用的模式的數量
latest_fork_usec:0                -- 最近一次fork操做阻塞redis進程的耗時數,單位微秒
migrate_cached_sockets:0          -- 是否已經緩存了到該地址的鏈接
slave_expires_tracked_keys:0      -- redis從實例到期key數量
active_defrag_hits:0              -- redis主動進行碎片整理命中次數
active_defrag_misses:0            -- redis主動進行碎片整理未命中次數
active_defrag_key_hits:0          -- redis主動進行碎片整理key命中次數
active_defrag_key_misses:0        -- redis主動進行碎片整理key未命中次數
 # Replication
role:master                       -- redis實例的角色,是master or slave
connected_slaves:0                -- 鏈接的從slave實例個數
master_replid:1e913ad6101de7d40fcea32378f515e62a55c9db   -- master實例啓動隨機字符串
master_replid2:0000000000000000000000000000000000000000  -- master實例啓動隨機字符串2,輔助做用,用於故障轉移後的同步
master_repl_offset:0              -- redis的當前主從偏移量
second_repl_offset:-1             -- redis的當前主從偏移量2
repl_backlog_active:0             -- 複製積壓緩衝區是否開啓
repl_backlog_size:1048576         -- 複製積壓緩衝大小 
repl_backlog_first_byte_offset:0  -- 複製緩衝區裏偏移量的大小
repl_backlog_histlen:0            -- 複製積壓緩衝區中數據的大小(以字節爲單位),值等於master_repl_offset-repl_backlog_first_byte_offset
 # CPU
used_cpu_sys:3.629912             -- Redis服務器消耗的系統CPU,這是服務器進程的全部線程(主線程和後臺線程)消耗的系統CPU的總和 
used_cpu_user:2.675796            -- Redis服務器消耗的用戶CPU,這是服務器進程的全部線程(主線程和後臺線程)消耗的用戶CPU的總和
used_cpu_sys_children:0.000000    -- 後臺進程消耗的系統CPU累計總和 
used_cpu_user_children:0.000000   -- 後臺進程消耗的用戶CPU累計總和
 # Cluster
cluster_enabled:0                 -- 實例是否啓用集羣模式
 # Keyspace
db0:keys = 749916                -- db0的key的數量
expires = 8                      -- 含有生存期的key的數
avg_ttl = 138855028143523        -- 平均存活時間
複製代碼

整理到這裏真的是累死阿沐了,太多參數了,上面是整理了基本的一些參數說明。不過當你真正去整理這些數據的時候,你會發現,你本覺得以爲本身知道不少;可是卻有不知道的更多。

04)須要重點看的參數

查看redis內存佔用狀況:

緣由:雖然基本大公司內部都會有看板能夠直接看到redis集羣的使用狀況,可是有時候可能須要咱們開發上機查看肯定是否真的異常。

➜  ~ redis-cli -h localhost info memory | grep -E 'used|human'
used_memory:1038896
used_memory_human:1014.55K
used_memory_rss:1490944
used_memory_rss_human:1.42M
used_memory_peak:1040976
used_memory_peak_human:1016.58K
used_memory_peak_perc:99.80%
used_memory_lua:37888
used_memory_lua_human:37.00K
used_memory_scripts:0
used_memory_scripts_human:0B
複製代碼

上面比較清晰的能夠看到,當前redi從操做系統那裏分配內存總量以及內存佔用率(因爲輸出比較多,我刪除一些展現須要用的幾個數據)。

一、used_memory:redis分配器分配的內存總量(單位字節),同時也包含虛擬內存swap。

二、used_memory_rss:redis進程佔用操做系統內存量(單位字節);包括進程自己運行內存、內存碎片。

二者區別:used_memory獲取對象是redis;used_memory_rss獲取對象是操做系統;從上面的結果能夠看到明顯前者小於後者,是由於redis運行自己須要佔用內存且還有內存碎片,因此看上去前者比後者小不少。但並不意味着前者必定小於後者,可能前者會出現虛擬內存致使前者大於後者。

查看客戶端鏈接數:

咱們先枚舉列出客戶端相關參數配置:

➜  ~ redis-cli -h localhost info clients
# Clients
connected_clients:1
client_recent_max_input_buffer:4
client_recent_max_output_buffer:0
blocked_clients:0
複製代碼

在查看本機的客戶端最大鏈接數:

localhost:6379> config get maxclients
1) "maxclients"
2) "10000"
複製代碼

爲何要將上面和下面拿出來做對比,由於客戶端的鏈接數是受maxclients的限制,這兩個參數對咱們排查問題很重要。咱們可能會在寫代碼時候遇到redis服務不可用,那麼首先肯定是否是redis掛掉了。

telnet 127.0.0.1(線上redis的ip地址) 80(端口)
複製代碼

經過對連接數量的查看發現異常狀態,咱們能夠經過client list指令查看客戶端鏈接:

localhost:6379> client list
id=10 addr=127.0.0.1:56336 fd=8 name= age=780 idle=1 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=26 qbuf-free=32742 obl=0 oll=0 omem=0 events=r cmd=client

科普命令返回的結果集含義:
如下是域的含義:

id    : 序號
addr  : 客戶端的地址和端口
fd    : 套接字所使用的文件描述符
name  : 鏈接名稱
age   : 以秒計算的已鏈接時長
idle  : 以秒計算的空閒時長
flags : 客戶端 flag
db    : 該客戶端正在使用的數據庫ID
sub   : 已訂閱頻道的數量
psub  : 已訂閱模式的數量
multi : 在事務中被執行的命令數量
qbuf  : 查詢緩衝區的長度(字節爲單位, 0 表示沒有分配查詢緩衝區)
qbuf-free : 查詢緩衝區剩餘空間的長度(字節爲單位, 0 表示沒有剩餘空間)
obl   : 輸出緩衝區的長度(字節爲單位, 0 表示沒有分配輸出緩衝區)
oll   : 輸出列表包含的對象數量(當輸出緩衝區沒有剩餘空間時,命令回覆會以字符串對象的形式被入隊到這個隊列裏)
omem   : 輸出緩衝區和輸出列表佔用的內存總量
events : 文件描述符事件
cmd    : 最近一次執行的命令
複製代碼

那麼是否是很清楚就能找到潛藏的鏈接來源,咱們也能夠經過查詢客戶端鏈接被拒絕的數目,來確保服務是否須要從新優化配置:

➜  ~ redis-cli -h localhost info stats | grep reject
rejected_connections:0   -- 客戶端被拒絕的鏈接數
複製代碼

若是這個值出現咱們理想預期,就須要調整咱們的最大鏈接數量:

① 經過redis配置文件修改最大鏈接數:

vim /usr/local/etc/redis.conf 
maxclients = 150000

② redis服務啓動時指定最大鏈接數:
redis-server --maxclients 150000
複製代碼

固然裏面還有查詢cpu信息、集羣信息、主從複製相關信息的參數,那麼我會將這些慢慢地放在下一章節裏面將,帶着實際的實踐項目步步深刻。

目前咱們只須要了解這裏面一些比較常關注的參數便可;講真地,我本身如今也不必定能記起來多少,也是比較經常使用常看的數據指標熟悉一點。

最後總結

能看到這裏的小夥伴,大家的眼力是真的給力,太多的參數須要去看去記住,真的很不容易!麻煩小夥伴們對着本身豎起大拇指,賊棒。

文章雖然比較簡短,可能高手大佬們看到就會罵「垃圾,寫的是個啥」;我仍是那句話,咱們針對的羣體對象不一樣。並且這些不是什麼空穴來風隨便寫的文章,而是通過大廠的面試、領導的詢問纔會結合本身的實際狀況寫出來。

不知看完文章小夥伴們對redis info的內部參數是否有進一步的瞭解?若是阿沐的文章感受有幫助或者有不足之處,請在評論下面留言。

最後,歡迎關注個人我的公衆號「我是阿沐」,會不按期的更新後端知識點和學習筆記。也歡迎直接公衆號私信或者郵箱聯繫我,咱們能夠一塊兒學習,一塊兒進步。

好了,我是阿沐,一個不想30歲就被淘汰的打工人 ⛽️ ⛽️ ⛽️ 。感謝各位小夥伴的:收藏、點贊、分享和留言,咱們下期再見。

相關文章
相關標籤/搜索