Info
命令返回关于Redis
服务器的各种信息和统计数值。通过给定可选的参数section
,可以让命令只返回某一部分的信息。
1. 显示模块
server
: 一般Redis
服务器信息,包含以下域:redis_version
redis_git_sha1
redis_git_dirty
os
arch_bits
:架构(32 或 64 位)multiplexing_api
: Redis 所使用的事件处理机制gcc_version
: 编译 Redis 时所使用的 GCC 版本process_id
: 服务器进程的 PIDrun_id
: Redis 服务器的随机标识符(用于 Sentinel 和集群)tcp_port
: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 。persistence
: RDB 和 AOF 的相关信息stats
: 一般统计信息replication
: 主/从复制信息cpu
: CPU 计算量统计信息commandstats
: Redis 命令统计信息cluster
: Redis 集群信息keyspace
: 数据库相关的统计信息2. 使用示例
info
命令基本语法如下:
redis 127.0.0.1:6379> INFO [section]
info
可以一次性获取所有的信息,也可以按块取信息。
# 获取所有信息> info# 获取内存相关信息> info memory# 获取复制相关信息> info replication
2.1 获取所有信息
127.0.0.1:6379> info# Serverredis_version:6.2.6redis_git_sha1:00000000redis_git_dirty:0redis_build_id:b61f37314a089f19redis_mode:standaloneos:Linux 4.4.0-117-generic x86_64arch_bits:64multiplexing_api:epollatomicvar_api:atomic-builtingcc_version:10.2.1process_id:1process_supervised:norun_id:931c8be0f80eb6ed2e3d787d3e8c324bb536adbatcp_port:6379server_time_usec:1640706998540791uptime_in_seconds:400892uptime_in_days:4hz:10configured_hz:10lru_clock:13317046executable:/data/redis-serverconfig_file:io_threads_active:0# Clientsconnected_clients:2# 这个就是正在连接的客户端数量cluster_connections:0maxclients:10000client_recent_max_input_buffer:24client_recent_max_output_buffer:0blocked_clients:0tracking_clients:0clients_in_timeout_table:0# Memoryused_memory:895312used_memory_human:874.33Kused_memory_rss:8028160used_memory_rss_human:7.66Mused_memory_peak:953480used_memory_peak_human:931.13Kused_memory_peak_perc:93.90%used_memory_overhead:851480used_memory_startup:809880used_memory_dataset:43832used_memory_dataset_perc:51.31%allocator_allocated:938320allocator_active:1196032allocator_resident:3428352total_system_memory:2097278976total_system_memory_human:1.95Gused_memory_lua:37888used_memory_lua_human:37.00Kused_memory_scripts:0used_memory_scripts_human:0Bnumber_of_cached_scripts:0maxmemory:0maxmemory_human:0Bmaxmemory_policy:noevictionallocator_frag_ratio:1.27allocator_frag_bytes:257712allocator_rss_ratio:2.87allocator_rss_bytes:2232320rss_overhead_ratio:2.34rss_overhead_bytes:4599808mem_fragmentation_ratio:9.42mem_fragmentation_bytes:7175616mem_not_counted_for_evict:0mem_replication_backlog:0mem_clients_slaves:0mem_clients_normal:41000mem_aof_buffer:0mem_allocator:jemalloc-5.1.0active_defrag_running:0lazyfree_pending_objects:0lazyfreed_objects:0# Persistenceloading:0current_cow_size:0current_cow_size_age:0current_fork_perc:0.00current_save_keys_processed:0current_save_keys_total:0rdb_changes_since_last_save:0rdb_bgsave_in_progress:0rdb_last_save_time:1640505723rdb_last_bgsave_status:okrdb_last_bgsave_time_sec:1rdb_current_bgsave_time_sec:-1rdb_last_cow_size:192512aof_enabled:0aof_rewrite_in_progress:0aof_rewrite_scheduled:0aof_last_rewrite_time_sec:-1aof_current_rewrite_time_sec:-1aof_last_bgrewrite_status:okaof_last_write_status:okaof_last_cow_size:0module_fork_in_progress:0module_fork_last_cow_size:0# Statstotal_connections_received:8total_commands_processed:84instantaneous_ops_per_sec:0total_net_input_bytes:2508total_net_output_bytes:124338instantaneous_input_kbps:0.00instantaneous_output_kbps:0.00rejected_connections:0sync_full:0sync_partial_ok:0sync_partial_err:0expired_keys:1expired_stale_perc:0.00expired_time_cap_reached_count:0expire_cycle_cpu_milliseconds:8174evicted_keys:0keyspace_hits:14keyspace_misses:6pubsub_channels:0pubsub_patterns:0latest_fork_usec:315total_forks:7migrate_cached_sockets:0slave_expires_tracked_keys:0active_defrag_hits:0active_defrag_misses:0active_defrag_key_hits:0active_defrag_key_misses:0tracking_total_keys:0tracking_total_items:0tracking_total_prefixes:0unexpected_error_replies:0total_error_replies:14dump_payload_sanitizations:0total_reads_processed:123total_writes_processed:105io_threaded_reads_processed:0io_threaded_writes_processed:0# Replicationrole:masterconnected_slaves:0master_failover_state:no-failovermaster_replid:9361c697e9805a63571591ac1e01eb07d8fec1d1master_replid2:0000000000000000000000000000000000000000master_repl_offset:0second_repl_offset:-1repl_backlog_active:0repl_backlog_size:1048576repl_backlog_first_byte_offset:0repl_backlog_histlen:0# CPUused_cpu_sys:344.796000used_cpu_user:310.832000used_cpu_sys_children:0.000000used_cpu_user_children:0.000000used_cpu_sys_main_thread:344.788000used_cpu_user_main_thread:310.832000# Modules# Errorstatserrorstat_ERR:count=14# Clustercluster_enabled:0# Keyspacedb0:keys=9,expires=0,avg_ttl=0db5:keys=2,expires=0,avg_ttl=0127.0.0.1:6379>
2.2 获取内存信息
127.0.0.1:6379> info memory# Memoryused_memory:893568used_memory_human:872.62Kused_memory_rss:8024064used_memory_rss_human:7.65Mused_memory_peak:953480used_memory_peak_human:931.13Kused_memory_peak_perc:93.72%used_memory_overhead:851480used_memory_startup:809880used_memory_dataset:42088used_memory_dataset_perc:50.29%allocator_allocated:1089360allocator_active:1355776allocator_resident:3588096total_system_memory:2097278976total_system_memory_human:1.95Gused_memory_lua:37888used_memory_lua_human:37.00Kused_memory_scripts:0used_memory_scripts_human:0Bnumber_of_cached_scripts:0maxmemory:0maxmemory_human:0Bmaxmemory_policy:noevictionallocator_frag_ratio:1.24allocator_frag_bytes:266416allocator_rss_ratio:2.65allocator_rss_bytes:2232320rss_overhead_ratio:2.24rss_overhead_bytes:4435968mem_fragmentation_ratio:9.41mem_fragmentation_bytes:7171520mem_not_counted_for_evict:0mem_replication_backlog:0mem_clients_slaves:0mem_clients_normal:41000mem_aof_buffer:0mem_allocator:jemalloc-5.1.0active_defrag_running:0lazyfree_pending_objects:0lazyfreed_objects:0127.0.0.1:6379>
2.3 查询每秒执行指令数
> ./redis-cli info stats |grep opsinstantaneous_ops_per_sec:234
ops_per_sec
:operations per second
,也就是每秒操作数。
也就是所有客户端每秒会发送 234 条指令到服务器执行。
2.4 客户端连接数量
这个信息在Clients
块里,可以通过info clients
看到。
connected_clients:124 # 这个就是正在连接的客户端数量client_longest_output_list:0client_biggest_input_buf:0blocked_clients:0
这个信息也是比较有用的,通过观察这个数量可以确定是否存在意料之外的连接。如果发现这个数量不对劲,接着就可以使用client list
指令列出所有的客户端链接地址来确定源头。
关于客户端的数量还有个重要的参数需要观察,那就是rejected_connections
,它表示因为超出最大连接数限制而被拒绝的客户端连接次数,如果这个数字很大,意味着服务器的最大连接数设置的过低需要调整maxclients
参数。
redis-cli info stats |grep rejectrejected_connections:0
3. 命令行工具
3.1 执行单条命令
通过将命令参数直接传递给redis-cli
来执行指令并获取输出结果。
$ redis-cli incrby a 1(integer) 1$ redis-cli incrby a 1(integer) 2
如果输出的内容较大,还可以将输出重定向到外部文件
$ redis-cli info > info.txt$ wc -l info.txt120 info.txt
上面的命令指向的服务器是默认服务器地址,如果想指向特定的服务器可以这样
// -n 2 表示使用第2个库,相当于 select 2$ redis-cli -h localhost -p 6379 -n 2 pingPONG
3.2 执行批量命令
直接使用redis-cli
来批量执行一系列指令。
$ cat cmds.txtset foo1 bar1set foo2 bar2set foo3 bar3......$ cat cmds.txt | redis-cliOKOKOK...
上面的指令使用了Unix
管道将cat
指令的标准输出连接到redis-cli
的标准输入。其实还可以直接使用输入重定向来批量执行指令。
$ redis-cli < cmds.txtOKOKOK...
3.3 重复执行指令
redis-cli
还支持重复执行指令多次,每条指令执行之间设置一个间隔时间,如此便可以观察某条指令的输出内容随时间变化。
// 间隔1s,执行5次,观察qps的变化$ redis-cli -r 5 -i 1 info | grep opsinstantaneous_ops_per_sec:43469instantaneous_ops_per_sec:47460instantaneous_ops_per_sec:47699instantaneous_ops_per_sec:46434instantaneous_ops_per_sec:47216
如果将次数设置为-1
那就是重复无数次永远执行下去。如果不提供-i
参数,那就没有间隔,连续重复执行。在交互模式下也可以重复执行指令,形式上比较怪异,在指令前面增加次数
127.0.0.1:6379> 5 pingPONGPONGPONGPONGPONG
3.4 监控服务器状态
我们可以使用--stat
参数来实时监控服务器的状态,间隔1s
实时输出一次。
$ redis-cli --stat------- data ------ --------------------- load -------------------- - child -keys memclients blocked requests connections26.66M 1000 11591628 (+0) 33526.66M 1000 11653169 (+61541) 33526.66M 1000 11706550 (+53381) 33526.54M 1000 11758831 (+52281) 33526.66M 1000 11803132 (+44301) 33526.66M 1000 11854183 (+51051) 335
如果觉得间隔太长或是太短,可以使用-i
参数调整输出间隔。
3.5 扫描大 KEY
每次遇到Redis
偶然卡顿问题,第一个想到的就是实例中是否存在大KEY
,大KEY
的内存扩容以及释放都会导致主线程卡顿。如果知道里面有没有大KEY
,可以自己写程序扫描,不过这太繁琐了。redis-cli
提供了--bigkeys
参数可以很快扫出内存里的大KEY
,使用-i
参数控制扫描间隔,避免扫描指令导致服务器的ops
陡增报警。
$ ./redis-cli --bigkeys -i 0.01# Scanning the entire keyspace to find biggest keys as well as# average sizes per key type. You can use -i 0.1 to sleep 0.1 sec# per 100 SCAN commands (not usually needed).[00.00%] Biggest zset found so far 'hist:aht:main:async_finish:0425:17' with 1440 members[00.00%] Biggest zset found so far 'hist:qps:async:authorize:0311:27' with 2465 members[00.00%] Biggest hash found so far 'job:counters:6ya9ypu6ckcl' with 3 fields[00.01%] Biggest string found so far 'rt:aht:main:device_online:68:{-4}' with 4 bytes[00.01%] Biggest zset found so far 'machine:load:0709' with 2879 members[00.02%] Biggest string found so far '6y6fze8kj7cy:{-7}' with 90 bytes
redis-cli
对于每一种对象类型都会记录长度最大的KEY
,对于每一种对象类型,刷新一次最高记录就会立即输出一次。它能保证输出长度为 Top1 的KEY
,但是 Top2、Top3等KEY
是无法保证可以扫描出来的。一般的处理方法是多扫描几次,或者是消灭了 Top1 的KEY
之后再扫描确认还有没有次大的KEY
。
3.6 采样服务器指令
线上Redis
服务器的OPS
太高,有很多业务模块都在使用这个Redis
,如何才能判断出来是哪个业务导致了OPS
异常的高。这时可以对线上服务器的指令进行采样,观察采样的指令大致就可以分析出OPS
占比高的业务点。这时就要使用monitor
指令,它会将服务器瞬间执行的指令全部显示出来。不过使用的时候要注意即使使用ctrl+c
中断,否则你的显示器太多的指令瞬间让你眼花缭乱。
$ redis-cli --host 192.168.x.x --port 6379 monitor1539853410.458483 [0 10.100.90.62:34365] "GET" "6yax3eb6etq8:{-7}"1539853410.459212 [0 10.100.90.61:56659] "PFADD" "growth:dau:1018" "2klxkimass8w"1539853410.462938 [0 10.100.90.62:20681] "GET" "6yax3eb6etq8:{-7}"1539853410.467231 [0 10.100.90.61:40277] "PFADD" "growth:dau:1018" "2kei0to86ps1"1539853410.470319 [0 10.100.90.62:34365] "GET" "6yax3eb6etq8:{-7}"1539853410.473927 [0 10.100.90.61:58128] "GET" "6yax3eb6etq8:{-7}"1539853410.475712 [0 10.100.90.61:40277] "PFADD" "growth:dau:1018" "2km8sqhlefpc"1539853410.477053 [0 10.100.90.62:61292] "GET" "6yax3eb6etq8:{-7}"
3.7 诊断服务器时延
平时我们诊断两台机器的时延一般是使用Unix
的ping
指令。Redis
也提供了时延诊断指令,不过它的原理不太一样,它是诊断当前机器和Redis
服务器之间的指令(PING指令)时延,它不仅仅是物理网络的时延,还和当前的Redis
主线程是否忙碌有关。如果你发现Unix
的ping
指令时延很小,而Redis
的时延很大,那说明Redis
服务器在执行指令时有微弱卡顿。
$ redis-cli --host 192.168.x.x --port 6379 --latencymin: 0, max: 5, avg: 0.08 (305 samples)
时延单位是ms
。
3.8 远程 rdb 备份
执行下面的命令就可以将远程的Redis
实例备份到本地机器,远程服务器会执行一次bgsave
操作,然后将rdb
文件传输到客户端。
$ ./redis-cli --host 192.168.x.x --port 6379 --rdb ./user.rdbSYNC sent to master, writing 2501265095 bytes to './user.rdb'Transfer finished with success.
参考:
/book/6844733724618129422/section/6844733724739764231
Redis 笔记(16)— info 指令和命令行工具(查看内存 状态 客户端连接数 监控服务器 扫描大key 采样服务器 执行批量命令等)
如果觉得《Redis 笔记(16)— info 指令和命令行工具(查看内存 状态 客户端连接数 监控》对你有帮助,请点赞、收藏,并留下你的观点哦!