Redis客戶端連線數DevOps

FeelTouch發表於2019-04-03

Redis客戶端連線

redis通過監聽一個TCP埠或socket的方式接收來自客戶端的連線, 當與客戶端建立連線後,redis內部會進行如下操作:
(1)客戶端socket會被設定為非阻塞模式,因為redis在網路時間處理上採用的是非阻塞多路複用模型;
(2)然後為這個socket設定TCP_NODELAY屬性,禁用Nagle演算法;
(3)然後建立一個可讀的檔案事件用於監聽這個客戶端socket的資料傳送。

檢視連線數

#info clients可以檢視當前的redis連線數
127.0.0.1:6379> info clients
# Clients
connected_clients:2
client_longest_output_list:0
client_biggest_input_buf:0
blocked_clients:0

#config get maxclients 可以查詢redis允許的最大連線數
127.0.0.1:6379> CONFIG GET maxclients
1) "maxclients"
2) "10000"

設定連線數

1. 在2.6之後版本,可以修改最大連線數配置,預設10000,可以在redis.conf配置檔案中修改
...
# maxclients 10000
...

2.config set maxclients num 可以設定redis允許的最大連線數
127.0.0.1:6379> CONFIG set maxclients 10
OK
127.0.0.1:6379>

3.啟動redis.service服務時加引數--maxclients 100000來設定最大連線數限制
redis-server --maxclients 100000 -f redis.conf

操作客戶端連線

#獲取客戶端列表
127.0.0.1:6379> CLIENT list
id=2 addr=127.0.0.1:60931 fd=9 name= age=5949 idle=0 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=32768 obl=0 oll=0 omem=18446744073709537584 events=r cmd=client
id=3 addr=127.0.0.1:61097 fd=10 name= age=5883 idle=1950 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=0 obl=0 oll=0 omem=18446744073709534128 events=r cmd=type

#檢視和設定當前連線的名稱
127.0.0.1:6379> CLIENT GETNAME
(nil)
127.0.0.1:6379> CLIENT setname l-a
OK
127.0.0.1:6379> CLIENT GETNAME
"l-a"

#關閉客戶端連線
127.0.0.1:6379> CLIENT KILL id 3
(integer) 0

敲重點

如果上面的那些指令實在記不住怎麼辦?用下面的2個指令可以解決問題

info

127.0.0.1:6379> info
# Server
redis_version:3.2.100
redis_git_sha1:00000000
redis_git_dirty:0
redis_build_id:dd26f1f93c5130ee
redis_mode:standalone
os:Windows
arch_bits:64
multiplexing_api:WinSock_IOCP
process_id:19228
run_id:64b3358bbd71d6366c4146f2114865739c108c69
tcp_port:6379
uptime_in_seconds:6539
uptime_in_days:0
hz:10
lru_clock:6903198
executable:C:\Users\Redis-x64-3.2.100\redis-server.exe
config_file:

# Clients
connected_clients:2
client_longest_output_list:0
client_biggest_input_buf:0
blocked_clients:0

# Memory
used_memory:20032288
used_memory_human:19.10M
used_memory_rss:19994504
used_memory_rss_human:19.07M
used_memory_peak:24114464
used_memory_peak_human:23.00M
total_system_memory:0
total_system_memory_human:0B
used_memory_lua:37888
used_memory_lua_human:37.00K
maxmemory:0
maxmemory_human:0B
maxmemory_policy:noeviction
mem_fragmentation_ratio:1.00
mem_allocator:jemalloc-3.6.0

# Persistence
loading:0
rdb_changes_since_last_save:0
rdb_bgsave_in_progress:0
rdb_last_save_time:1550400531
rdb_last_bgsave_status:ok
rdb_last_bgsave_time_sec:-1
rdb_current_bgsave_time_sec:-1
aof_enabled:0
aof_rewrite_in_progress:0
aof_rewrite_scheduled:0
aof_last_rewrite_time_sec:-1
aof_current_rewrite_time_sec:-1
aof_last_bgrewrite_status:ok
aof_last_write_status:ok

# Stats
total_connections_received:2
total_commands_processed:25
instantaneous_ops_per_sec:0
total_net_input_bytes:700
total_net_output_bytes:29430742
instantaneous_input_kbps:0.00
instantaneous_output_kbps:0.00
rejected_connections:0
sync_full:0
sync_partial_ok:0
sync_partial_err:0
expired_keys:0
evicted_keys:0
keyspace_hits:2
keyspace_misses:0
pubsub_channels:0
pubsub_patterns:0
latest_fork_usec:0
migrate_cached_sockets:0

# Replication
role:master
connected_slaves:0
master_repl_offset:0
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0

# CPU
used_cpu_sys:0.19
used_cpu_user:0.41
used_cpu_sys_children:0.00
used_cpu_user_children:0.00

# Cluster
cluster_enabled:0

# Keyspace
db0:keys=84342,expires=0,avg_ttl=0

通過給定可選的引數 section ,可以讓命令只返回某一部分的資訊:

  • server : 一般 Redis 伺服器資訊,包含以下域:

redis_version : Redis 伺服器版本
redis_git_sha1 : Git SHA1
redis_git_dirty : Git dirty flag
os : Redis 伺服器的宿主作業系統
arch_bits : 架構(32 或 64 位)
multiplexing_api : Redis 所使用的事件處理機制
gcc_version : 編譯 Redis 時所使用的 GCC 版本
process_id : 伺服器程式的 PID
run_id : Redis 伺服器的隨機識別符號(用於 Sentinel 和叢集)
tcp_port : TCP/IP 監聽埠
uptime_in_seconds : 自 Redis 伺服器啟動以來,經過的秒數
uptime_in_days : 自 Redis 伺服器啟動以來,經過的天數
lru_clock : 以分鐘為單位進行自增的時鐘,用於 LRU 管理

  • clients : 已連線客戶端資訊,包含以下域:

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

  • 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 的部分記憶體被作業系統換出到交換空間了,在這種情況下,操作可能會產生明顯的延遲。
Because Redis does not have control over how its allocations are mapped to memory pages, high used_memory_rss is often the result of a
spike in memory usage.

當 Redis 釋放記憶體時,分配器可能會,也可能不會,將記憶體返還給作業系統。
如果 Redis 釋放了記憶體,卻沒有將記憶體返還給作業系統,那麼 used_memory 的值可能和作業系統顯示的 Redis 記憶體佔用並不一致。
檢視 used_memory_peak 的值可以驗證這種情況是否發生。

  • persistence : RDB 和 AOF 的相關資訊

loading:0 rdb_changes_since_last_save:1866 #自上次dump後rdb的改動
rdb_bgsave_in_progress:0 #標識rdb save是否進行中
rdb_last_save_time:1452048771 #上次save的時間戳
rdb_last_bgsave_status:ok #上次的save操作狀態
rdb_last_bgsave_time_sec:0 #上次rdb save操作使用的時間(單位s)
rdb_current_bgsave_time_sec:-1 #如果rdb save操作正在進行,則是所使用的時間
aof_enabled:1 #是否開啟aof,預設沒開啟(已開啟)
aof_rewrite_in_progress:0 #標識aof的rewrite操作是否在進行中
aof_rewrite_scheduled:0 #標識是否將要在rdb save操作結束後執行
aof_last_rewrite_time_sec:0 #上次rewrite操作使用的時間(單位s)
aof_current_rewrite_time_sec:-1 #如果rewrite操作正在進行,則記錄所使用的時間
aof_last_bgrewrite_status:ok #上次rewrite操作的狀態
aof_last_write_status:ok #上次write操作的狀態
aof_current_size:42820373 #aof當前大小,以位元組(byte)為單位
aof_base_size:16223723 #aof上次啟動或rewrite的大小
aof_pending_rewrite:0 #同上面的aof_rewrite_scheduled
aof_buffer_length:0 #aof buffer的大小
aof_rewrite_buffer_length:0 #aof rewrite buffer的大小
aof_pending_bio_fsync:0 #後臺IO佇列中等待fsync任務的個數
aof_delayed_fsync:41394 #延遲的fsync計數器 TODO

  • stats : 一般統計資訊

total_connections_received:61264941 #自啟動起連線過的總數
total_commands_processed:951647408 #自啟動起執行命令的總數
instantaneous_ops_per_sec:13 #每秒執行的命令個數 rejected_connections:0
#因為最大客戶端連線書限制,而導致被拒絕連線的個數 sync_full:23 sync_partial_ok:0 sync_partial_err:0
expired_keys:40225836 #自啟動起過期的key的總數 evicted_keys:0
#因為記憶體大小限制,而被驅逐出去的鍵的個數 keyspace_hits:54841673 #自啟動起命中key的個數 keyspace_misses:344507 #自啟動起未命中key的個數 pubsub_channels:0 pubsub_patterns:0 latest_fork_usec:8775
#上次的fork操作使用的時間(單位ms)

  • replication : 主/從複製資訊

role:master #角色(主從)
connected_slaves:1 #從庫數量
slave0:ip=10.15.x.x,port=6379,state=online,offset=2230297606,lag=2
#從庫資訊 master_repl_offset:2230300129 repl_backlog_active:1 repl_backlog_size:1048576 repl_backlog_first_byte_offset:2229251554
repl_backlog_histlen:1048576

  • cpu : CPU 計算量統計資訊

used_cpu_sys:23111.87 #cpu在核心態所消耗的cpu的時間
used_cpu_user:17763.81 #cpu在使用者態所消耗的cpu的時間
used_cpu_sys_children:7909.22 used_cpu_user_children:62767.11

  • commandstats : Redis 命令統計資訊
  • cluster : Redis 叢集資訊
  • keyspace : 資料庫相關的統計資訊

Keyspace

db0:keys=85904,expires=81390,avg_ttl=47463342

除上面給出的這些值以外,引數還可以是下面這兩個:
all : 返回所有資訊
default : 返回預設選擇的資訊
當不帶引數直接呼叫 INFO 命令時,使用 default 作為預設引數。

CONFIG GET *

該命令會列出所有配置檔案中配置的和預設的配置資訊

127.0.0.1:6379> CONFIG GET *
  1) "dbfilename"
  2) "dump.rdb"
  3) "requirepass"
  4) ""
  5) "masterauth"
  6) ""
  7) "unixsocket"
  8) ""
  9) "logfile"
 10) ""
 11) "pidfile"
 12) ""
 13) "maxmemory"
 14) "0"
 15) "maxmemory-samples"
 16) "5"
 17) "timeout"
 18) "0"
 19) "auto-aof-rewrite-percentage"
 20) "100"
 21) "auto-aof-rewrite-min-size"
 22) "67108864"
 23) "hash-max-ziplist-entries"
 24) "512"
 25) "hash-max-ziplist-value"
 26) "64"
 27) "list-max-ziplist-size"
 28) "-2"
 29) "list-compress-depth"
 30) "0"
 31) "set-max-intset-entries"
 32) "512"
 33) "zset-max-ziplist-entries"
 34) "128"
 35) "zset-max-ziplist-value"
 36) "64"
 37) "hll-sparse-max-bytes"
 38) "3000"
 39) "lua-time-limit"
 40) "5000"
 41) "slowlog-log-slower-than"
 42) "10000"
 43) "latency-monitor-threshold"
 44) "0"
 45) "slowlog-max-len"
 46) "128"
 47) "port"
 48) "6379"
 49) "tcp-backlog"
 50) "511"
 51) "databases"
 52) "16"
 53) "repl-ping-slave-period"
 54) "10"
 55) "repl-timeout"
 56) "60"
 57) "repl-backlog-size"
 58) "1048576"
 59) "repl-backlog-ttl"
 60) "3600"
 61) "maxclients"
 62) "10000"
 63) "watchdog-period"
 64) "0"
 65) "slave-priority"
 66) "100"
 67) "min-slaves-to-write"
 68) "0"
 69) "min-slaves-max-lag"
 70) "10"
 71) "hz"
 72) "10"
 73) "cluster-node-timeout"
 74) "15000"
 75) "cluster-migration-barrier"
 76) "1"
 77) "cluster-slave-validity-factor"
 78) "10"
 79) "repl-diskless-sync-delay"
 80) "5"
 81) "tcp-keepalive"
 82) "0"
 83) "cluster-require-full-coverage"
 84) "yes"
 85) "no-appendfsync-on-rewrite"
 86) "no"
 87) "slave-serve-stale-data"
 88) "yes"
 89) "slave-read-only"
 90) "yes"
 91) "stop-writes-on-bgsave-error"
 92) "yes"
 93) "daemonize"
 94) "no"
 95) "rdbcompression"
 96) "yes"
 97) "rdbchecksum"
 98) "yes"
 99) "activerehashing"
100) "yes"
101) "protected-mode"
102) "yes"
103) "repl-disable-tcp-nodelay"
104) "no"
105) "repl-diskless-sync"
106) "no"
107) "aof-rewrite-incremental-fsync"
108) "yes"
109) "aof-load-truncated"
110) "yes"
111) "maxmemory-policy"
112) "noeviction"
113) "loglevel"
114) "notice"
115) "supervised"
116) "no"
117) "appendfsync"
118) "everysec"
119) "appendonly"
120) "no"
121) "dir"
122) "C:\\Users\\Redis-x64-3.2.100"
123) "save"
124) "jd 3600 jd 300 jd 60"
125) "client-output-buffer-limit"
126) "normal 0 0 0 slave 268435456 67108864 60 pubsub 33554432 8388608 60"
127) "unixsocketperm"
128) "0"
129) "slaveof"
130) ""
131) "notify-keyspace-events"
132) ""
133) "bind"
134) ""

相關文章