connected_clients:5 #当前客户端连接数
client_recent_max_input_buffer:2 #当前连接的客户端当中,最长的输出列表
client_recent_max_output_buffer:0 # 当前连接的客户端当中,最大输入缓存blocked_clients:0 #被阻塞的客户端数
因为Redis是单线程模型(只能使用单核),来处理所有客户端的请求, 但由于客户端连接数的增长,处理请求的线程资源开始降低分配给单个客户端连接的处理时间,这时每个客户端需要花费更多的时间去等待Redis共享服务的响应。
因为Redis是单线程模型(只能使用单核),来处理所有客户端的请求,且Redis默认允许客户端连接的最大数量是10000。若是看到连接数超过5000以上,那可能会影响Redis的性能。因此监控客户端连接数是非常重要的,因为客户端创建连接数的数量可能超出预期的数量,也可能是客户端端没有有效地释放连接。
# Memory
used_memory:1395184 #使用内存,以字节(byte)为单位used_memory_human:1.33M #以人类可读的格式返回 Redis 分配的内存总量used_memory_rss:46387200 #从操作系统的角度,返回 Redis 已分配的内存总量(俗称常驻集大小)。这个值和 top 、 ps等命令的输出一致。
used_memory_rss_human:44.24M # 以人类可读的格式,从操作系统的角度,返回 Redis 已分配的内存总量(俗称常驻集大小)。这个值和 top 、 ps等命令的输出一致。used_memory_peak:64900080 #redis的内存消耗峰值(以字节为单位)
used_memory_peak_human:61.89M #以人类可读的格式返回redis的内存消耗峰值
used_memory_peak_perc:2.15% #(used_memory/ used_memory_peak) *100%
used_memory_overhead:1004062 #Redis为了维护数据集的内部机制所需的内存开销,包括所有客户端输出缓冲区、查询缓冲区、AOF重写缓冲区和主从复制的backlog。
used_memory_startup:791384 # Redis服务器启动时消耗的内存
used_memory_dataset:391122 #used_memory—used_memory_overhead
used_memory_dataset_perc:64.78% #100%*(used_memory_dataset/(used_memory—used_memory_startup)
allocator_allocated:1394688 #allocator_active:1720320 #
allocator_resident:5468160 #
total_system_memory:3975475200 #整个系统内存
total_system_memory_human:3.70G #以人类可读的格式,显示整个系统内存used_memory_lua:37888 #Lua脚本存储占用的内存
used_memory_lua_human:37.00K #以人类可读的格式,显示Lua脚本存储占用的内存used_memory_scripts:0 #
used_memory_scripts_human:0B #
number_of_cached_scripts:0 #maxmemory:0 # Redis实例的最大内存配置maxmemory_human:0B #以人类可读的格式,显示Redis实例的最大内存配置
maxmemory_policy:noeviction #当达到maxmemory时的淘汰策略allocator_frag_ratio:1.23 #
allocator_frag_bytes:325632 #allocator_rss_ratio:3.18 #
allocator_rss_bytes:3747840 #rss_overhead_ratio:8.48 #
rss_overhead_bytes:40919040 #
mem_fragmentation_ratio:34.28 #used_memory_rss/ used_memory
mem_fragmentation_bytes:45034008 #
mem_not_counted_for_evict:0 #mem_replication_backlog:0 #mem_clients_slaves:0 #mem_clients_normal:117382 #mem_aof_buffer:0 #
mem_allocator:jemalloc-5.1.0 #内存分配器active_defrag_running:0 #表示没有活动的defrag任务正在运行,1表示有活动的defrag任务正在运行(defrag:表示内存碎片整理)
lazyfree_pending_objects:0 #0表示不存在延迟释放(也有资料翻译未惰性删除)的挂起对象
# Persistence
loading:0 #服务器是否正在载入持久化文件
rdb_changes_since_last_save:102505 #离最近一次成功生成rdb文件,写入命令的个数,即有多少个写入命令没有持久化rdb_bgsave_in_progress:0 #服务器是否正在创建rdb文件
rdb_last_save_time:1573264990 #离最近一次成功创建rdb文件的时间戳。当前时间戳 - rdb_last_save_time=多少秒未成功生成rdb文件rdb_last_bgsave_status:ok #最近一次rdb持久化是否成功
rdb_last_bgsave_time_sec:0 #最近一次成功生成rdb文件耗时秒数
rdb_current_bgsave_time_sec:-1 #如果服务器正在创建rdb文件,那么这个域记录的就是当前的创建操作已经耗费的秒数rdb_last_cow_size:6467584 #RDB过程中父进程与子进程相比执行了多少修改(包括读缓冲区,写缓冲区,数据修改等)aof_enabled:0 #是否开启aof,默认没开启(已开启)aof_rewrite_in_progress:0 #标识aof的rewrite操作是否在进行中aof_rewrite_scheduled:0 #标识是否将要在rdb save操作结束后执行
aof_last_rewrite_time_sec:-1 #上次rewrite操作使用的时间(单位s)
aof_current_rewrite_time_sec:-1 #如果rewrite操作正在进行,则记录所使用的时间
aof_last_bgrewrite_status:ok #上次rewrite操作的状态aof_last_write_status:ok #上次write操作的状态aof_last_cow_size:0 #AOF过程中父进程与子进程相比执行了多少修改(包括读缓冲区,写缓冲区,数据修改等)。
braof_last_rewrite_time_sec:-1 #最近一次aof rewrite耗费的时长braof_current_rewrite_time_sec:-1 #如果rewrite操作正在进行,则记录所使用的时间,单位秒braof_last_bgrewrite_status:ok #上次bgrewriteaof操作的状态braof_last_write_status:ok #上次aof写入状态braof_current_size:4201740 #aof当前尺寸braof_base_size:4201687 #服务器启动时或者aof重写最近一次执行之后aof文件的大小braof_pending_rewrite:0 #是否有aof重写操作在等待rdb文件创建完毕之后执行? braof_buffer_length:0 #aof buffer的大小 braof_rewrite_buffer_length:0 #aof rewrite buffer的大小 braof_pending_bio_fsync:0 #后台I/O队列里面,等待执行的fsync调用数量braof_delayed_fsync:0 #被延迟的fsync调用数量
因为Redis是个单线程模型,客户端过来的命令是按照顺序执行的。因此网络问题、慢命令会造成阻塞导致redis性能下降。
如果发生命令阻塞就可以看到每秒命令处理数在明显下降。要分析解决这个性能问题,需要跟踪命令处理数的数量和延迟时间。
降低延迟的几个技巧:
使用多参数命令 若是客户端在很短的时间内发送大量的命令过来,会发现响应时间明显变慢,这由于后面命令一直在等待队列中前面的大量命令执行完毕。因此我们可以使用单命令多参数的方式,来减少错误操作。例如mset mget hmset hmget等。管道拼接,降低网络延迟避免操作大集合的慢命令
# Stats(一般统计信息)
total_connections_received:209561105 #新创建连接个数,如果新创建连接过多,过度地创建和销毁连接对性能有影响,说明短连接严重或连接池使用有问题,需调研代码的连接设置
total_commands_processed:2220123478 #redis处理的命令数
instantaneous_ops_per_sec:279 #redis当前的qps,redis内部较实时的每秒执行的命令数
total_net_input_bytes:118515678789 #redis网络入口流量字节数
total_net_output_bytes:236361651271 #redis网络出口流量字节数
instantaneous_input_kbps:13.56 #redis网络入口kps
instantaneous_output_kbps:31.33 #redis网络出口kpsrejected_connections:0 #拒绝的连接个数,redis连接个数达到maxclients限制,拒绝新连接的个数sync_full:1 #主从完全同步成功次数sync_partial_ok:0 #主从部分同步成功次数sync_partial_err:0 #主从部分同步失败次数expired_keys:15598177 #运行以来过期的key的数量evicted_keys:0 #运行以来剔除(超过了maxmemory后)的key的数量keyspace_hits:1122202228 #命中次数keyspace_misses:577781396 #没命中次数pubsub_channels:0 #当前使用中的频道数量pubsub_patterns:0 #当前使用的模式的数量latest_fork_usec:15679 #最近一次fork操作阻塞redis进程的耗时数,单位微秒migrate_cached_sockets:0 #是否已经缓存了到该地址的连接
slave_expires_tracked_keys:0 #从实例到期key数量active_defrag_hits:0 #主动碎片整理命中次数active_defrag_misses:0 #主动碎片整理未命中次数active_defrag_key_hits:0 #主动碎片整理key命中次数
active_defrag_key_misses:0 #主动碎片整理key未命中次数
# Replication (主从信息,slave上显示的信息)
role:slave #实例的角色,是master or slave
master_host:192.168.64.102 #此节点对应的master的ipmaster_port:9021 #此节点对应的master的portmaster_link_status:up #slave端可查看它与master之间同步状态,当复制断开后表示down
master_last_io_seconds_ago:0 #主库多少秒未发送数据到从库?master_sync_in_progress:0 #从服务器是否在与主服务器进行同步
slave_repl_offset:6713173818 #slave复制偏移量slave_priority:100 #slave优先级slave_read_only:1 #从库是否设置只读connected_slaves:0 #连接的slave实例个数master_repl_offset:0 #主从同步偏移量,此值如果和上面的offset相同说明主从是否一致是否有延迟,与master_replid可被用来标识主实例复制流中的位置。repl_backlog_active:0 #复制积压缓冲区是否开启
repl_backlog_size:134217728 #复制积压缓冲大小
repl_backlog_first_byte_offset:0 #复制缓冲区里偏移量的大小repl_backlog_histlen:0 #此值等于 master_repl_offset -
repl_backlog_first_byte_offset,该值不会超过repl_backlog_size的大小
CPU
注意:都是累计CPU的耗时,单位为秒
used_cpu_sys:2369.277557 #cpu在内核态所消耗的cpu的时间used_cpu_user:1951.997566 #cpu在用户态所消耗的cpu的时间
used_cpu_sys_children:0.004691 #将后台进程在核心态所占用的CPU时求和累计起来
used_cpu_user_children:0.000000 #将后台进程在用户态所占用的CPU时求和累计起来
# Cluster (集群相关信息)
cluster_enabled:0 #实例是否启用集群模式
# Keyspace(数据库相关的统计信息)
db0:keys=194690,expires=191702,avg_ttl=3607772262 (秒) #db0的key的数量,以及带有生存期的key的数,平均存活时间