redis 简易监控的几种方法
简介
针对Redis 实现性能监控的几种方法
一、使用info命令
命令说明
127.0.0.1:6380> info
# Server
redis_version:3.2.11
redis_git_sha1:00000000
redis_git_dirty:0
redis_build_id:41a708998db14d05
redis_mode:standalone
os:Linux 3.0.76-0.11-default x86_64
arch_bits:64
multiplexing_api:epoll
gcc_version:4.3.4
process_id:16942
run_id:e3996796aba6cff723f1e58feb42fa9ea9515b01
tcp_port:6380
uptime_in_seconds:4215152
uptime_in_days:48
hz:10
lru_clock:3786096
executable:/home/iotweb/local/redis/./bin/redis-server
config_file:/home/iotweb/local/redis/redis.conf
# Clients
connected_clients:2
client_longest_output_list:0
client_biggest_input_buf:0
blocked_clients:0
# Memory
used_memory:6392944
used_memory_human:6.10M
used_memory_rss:13623296
used_memory_rss_human:12.99M
used_memory_peak:12523592
used_memory_peak_human:11.94M
total_system_memory:33673551872
total_system_memory_human:31.36G
used_memory_lua:37888
used_memory_lua_human:37.00K
maxmemory:0
maxmemory_human:0B
maxmemory_policy:noeviction
mem_fragmentation_ratio:2.13
mem_allocator:jemalloc-4.0.3
# Persistence
loading:0
rdb_changes_since_last_save:0
rdb_bgsave_in_progress:0
rdb_last_save_time:1510133670
rdb_last_bgsave_status:ok
rdb_last_bgsave_time_sec:0
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:2013
total_commands_processed:3129128
instantaneous_ops_per_sec:0
total_net_input_bytes:138114786
total_net_output_bytes:3167119897
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:1
keyspace_misses:1
pubsub_channels:0
pubsub_patterns:0
latest_fork_usec:1107
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:3631.63
used_cpu_user:2210.61
used_cpu_sys_children:0.20
used_cpu_user_children:1.47
# Cluster
cluster_enabled:0
# Keyspace
db0:keys=53500,expires=0,avg_ttl=0
指标说明
- Server 指通用的服务器信息,包括版本号、监听端口、进程ID等
- Clients 指客户端信息,包括接入数量、阻塞数量等
- Memory 内存信息,包括虚拟内存、物理内存、碎片比例(rss/used)等
- Persistence 持久化信息,包括RDB和AOF的相关信息
- Stats 统计信息,包括历史命令数、键数量、网络流量等
- Replication 主从复制信息,包括slave及backlog相关信息
- CPU CPU使用相关信息
- Cluster 集群信息
- Keyspace 逻辑空间信息,包括数据库键数、超时及TTL信息
二、使用redis-stat
项目地址
https://github.com/junegunn/redis-stat
项目说明
redis-stat 是基于Ruby实现的一个简单易用的 Redis监控工具
redis-stat 的实现原理基于INFO(见上)命令,相比MONITOR命令来说其对Redis不会产生任何性能影响。
此外 redis-stat项目也提供了Console及Web界面两种展现形式。
如何搭建
redis-stat 的使用需要依赖ruby,但Jruby为我们提供了使用Java的打开方式。
- 下载Jar包,点击这里
- 执行启动脚本
java -jar redis-stat-0.4.14.jar 127.0.0.1:6380 3 --server=63800 > monitor.log &
- 控制台输出
Puma 2.3.2 starting...
* Min threads: 0, max threads: 16
* Environment: development
* Listening on tcp://0.0.0.0:63800
== Sinatra/1.3.6 has taken the stage on 63800 for production with backup from Puma
┌────────────────────────┬────────────────┐
│ │ 127.0.0.1:6380 │
├────────────────────────┼────────────────┤
│ redis_version │ 3.2.11 │
│ redis_mode │ standalone │
│ process_id │ 16942 │
│ uptime_in_seconds │ 4216406 │
│ uptime_in_days │ 48 │
│ role │ master │
│ connected_slaves │ 0 │
│ aof_enabled │ 0 │
│ rdb_bgsave_in_progress │ 0 │
│ rdb_last_save_time │ 1510133670 │
└────────────────────────┴────────────────┘
┌────────┬──┬──┬──┬───┬──────┬──────┬─────┬─────┬─────┬─────┬──────┬─────┬─────┬─────┐
time us sy cl bcl mem rss keys cmd/s exp/s evt/s hit%/s hit/s mis/s aofcs
├────────┼──┼──┼──┼───┼──────┼──────┼─────┼─────┼─────┼─────┼──────┼─────┼─────┼─────┤
10:26:30 - - 1 0 6.08MB 13.0MB 53.5k - - - - - - 0B
10:26:33 0 0 1 0 6.08MB 13.0MB 53.5k 0.33 0 0 - 0 0 0B
10:26:36 0 0 1 0 6.08MB 13.0MB 53.5k 0.33 0 0 - 0 0 0B
监控效果
使用 http://127.0.0.1:63800/ 地址可以直接访问Web界面,见下图

指标说明
| 简写 | 指标 | 说明 |
|---|---|---|
| us | used_cpu_user | 用户空间占用CPU百分比 |
| sy | used_cpu_sys | 内核空间占用CPU百分比 |
| cl | connected_clients | 连接客户端数量 |
| bcl | blocked_clients | 阻塞客户端数量(如BLPOP) |
| mem | used_memory | 使用总内存 |
| rss | used_memory_rss | 使用物理内存 |
| keys | dbx.keys | key的总数量 |
| cmd/s | command/s | 每秒执行命令数 |
| exp/s | expired_keys/s | 每秒过期key数量 |
| evt/s | evicted_keys/s | 每秒淘汰key数量 |
| hit%/s | keyspace_hitratio/s | 每秒命中百分比 |
| hit/s | keyspace_hits/s | 每秒命中数量 |
| mis/s | keyspace_miss/s | 每秒丢失数量 |
| aofcs | aof_current_size | AOF日志当前大小 |
类似redis-stat 还有redis-live等若干开源项目
三、自研工具
工具简介
redis-stat提供了一种简易的方式实现对Redis实例的监控,但多数场景下可能需要进行定制,比如鉴权方式、统计指标、告警等等
为实现更灵活的控制,可利用类似的方式对INFO信息进行解析,以实现自有Redis实例的统一监控。

代码样例
- 调用info 命令
public String getInfo() {
Jedis jedis = get();
try {
String infoContent = jedis.info();
return infoContent;
} finally {
if (jedis != null) {
jedisPool.returnResource(jedis);
}
}
}
- 解析结果
for (String line : lines) {
if (line.isEmpty()) {
continue;
}
if (line.startsWith("#")) {
part = line.replace("#", "").trim();
continue;
}
int index = line.indexOf(':');
if (index >= 0) {
infoMap.put(part + "." + line.substring(0, index), line.substring(index + 1));
}
}
- 数据转换处理
Map<String, String> infoMap = parseInfo(infoContent);
stat.setUsed_cpu_sys(getIntValue(infoMap, "CPU.used_cpu_sys"));
stat.setUsed_cpu_user(getIntValue(infoMap, "CPU.used_cpu_user"));
stat.setBlocked_clients(getIntValue(infoMap, "Clients.blocked_clients"));
stat.setConnected_clients(getIntValue(infoMap, "Clients.connected_clients"));
stat.setUsed_memory(getIntValue(infoMap, "Memory.used_memory"));
stat.setUsed_memory_rss(getIntValue(infoMap, "Memory.used_memory_rss"));
//
int cmd = getIntValue(infoMap, "Stats.total_commands_processed");
int exp = getIntValue(infoMap, "Stats.expired_keys");
int evt = getIntValue(infoMap, "Stats.evicted_keys");
int hit = getIntValue(infoMap, "Stats.keyspace_hits");
int mis = getIntValue(infoMap, "Stats.keyspace_misses");
long lastTs = stat.getTimestamp();
long thisTs = System.currentTimeMillis();
实现效果
| 实例名称 | 用户CPU | 系统CPU | 总连接数 | 阻塞连接 | 使用内存 | 物理内存 | 键数量 | CMD速率 | EXP速率 | EVT速率 | HIT速率 | MIS速率 | 时间 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| appdb0/100.112.56.105:26529 | 2 | 2 | 3 | 0 | 1.0M | 2.0M | 12 | 0 | 0 | 0 | 0 | 0 | 2018/2/5 18:27 |
| appdb1/100.112.56.105:26520 | 2 | 3 | 4 | 0 | 1.0M | 2.0M | 8 | 16 | 0 | 0 | 4 | 0 | 2018/2/5 18:27 |
| appdb2/100.112.56.105:26523 | 3 | 5 | 3 | 0 | 1.0M | 2.0M | 19 | 52 | 0 | 0 | 5 | 0 | 2018/2/5 18:27 |
redis 简易监控的几种方法的更多相关文章
- Redis中持久化的两种方法详解
Redis提供了两种不同的持久化方法来将数据存储到硬盘里面.一种方法叫快照(snapshotting),它可以将存在于某一时刻的所有数据都写入硬盘里;另一种方法教只追加文件(append-only f ...
- 分析redis key大小的几种方法
当redis被用作缓存时,有时我们希望了解key的大小分布,或者想知道哪些key占的空间比较大.本文提供了几种方法. 一. bigKeys 这是redis-cli自带的一个命令.对整个redis进行扫 ...
- Tomcat 监控的几种方法
Tomcat 监控方法 方法1:.使用tomcat自带的status页 具体方法: 步骤1:修改%tomcat安装路径%\conf \tomcat-users文件,配置admin设置权限.在<t ...
- JS实现简易计算器的7种方法
先放图(好吧比较挫) 方法一:最容易版 <!DOCTYPE html> <html lang="zh-CN"> <head> <meta ...
- 关于 tomcat 集群中 session 共享的三种方法
前两种均需要使用 memcached 或redis 存储 session ,最后一种使用 terracotta 服务器共享. 建议使用 redis,不仅仅因为它可以将缓存的内容持久化,还因为它支持的单 ...
- Tomcat 集群中 实现session 共享的三种方法
前两种均需要使用 memcached 或 redis 存储 session ,最后一种使用 terracotta 服务器共享. 建议使用 redis ,不仅仅因为它可以将缓存的内容持久化,还因为它支持 ...
- 监控Redis集群,有两种方法
前提条件 redis集群:已搭建三主三从(三台主机) prometheus.grafana已安装 三台主机ip: 192.168.0.39,192.168.0.164,192.168.0.68 第一种 ...
- Redis实现唯一计数的3种方法分享
转载于:http://www.itxuexiwang.com/a/shujukujishu/redis/2016/0216/121.html?1455855118 唯一计数是网站系统中十分常见的一个功 ...
- $.ajax()方法详解 ajax之async属性 【原创】详细案例解剖——浅谈Redis缓存的常用5种方式(String,Hash,List,set,SetSorted )
$.ajax()方法详解 jquery中的ajax方法参数总是记不住,这里记录一下. 1.url: 要求为String类型的参数,(默认为当前页地址)发送请求的地址. 2.type: 要求为Str ...
随机推荐
- struts2中配置文件的调用顺序
1.default.properties 该文件保存在 struts2-core-2.3.7.jar 中 org.apache.struts2中 2.struts-default.xml 该文件保存在 ...
- BZOJ:1443: [JSOI2009]游戏Game
原题链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1443 反正不看题解我是完全想不出系列…… 先把棋盘黑白染色,也就是同一对角线上颜色相同,使 ...
- 学习Spring必学的Java基础知识(1)----反射
引述要学习Spring框架的技术内幕,必须事先掌握一些基本的Java知识,正所谓"登高必自卑,涉远必自迩".以下几项Java知识和Spring框架息息相关,不可不学(我将通过一个系 ...
- Linux下gdb的安装及使用入门
1.安装gdb. 在root用户权限下: root@iZ2zeeailqvwws5dcuivdbZ:~# apt-get update ...... ...... ...... root@iZ2zee ...
- rexray在CentOS上不能创建ceph rbd的docker volume问题定位
背景 我们通过docker的rexray插件来创建ceph rbd设备的docker volume,但总提示创建失败. # docker volume create --driver=rexray - ...
- 【Zigbee技术入门教程-01】Zigbee无线组网技术入门的学习路线
[Zigbee技术入门教程-01]Zigbee无线组网技术入门的学习路线 广东职业技术学院 欧浩源 一.引言 在物联网技术应用的知识体系中,Zigbee无线组网技术是非常重要的一环,也是大家感 ...
- 数据结构课程设计四则运算表达式求值(C语言版)
本系统为四则运算表达式求值系统,用于带小括号的一定范围内正负数的四则运算标准(中缀)表达式的求值.注意事项: 1.请保证输入的四则表达式的合法性.输入的中缀表达式中只能含有英文符号"+ ...
- MLlib--FPGrowth算法
转载请标明出处http://www.cnblogs.com/haozhengfei/p/c9f211ee76528cffc4b6d741a55ac243.html FPGrowth算法_挖掘商品之间的 ...
- Typescript学习笔记
什么是 TypeScript TypeScript 是 JavaScript 的类型的超集,它可以编译成纯 JavaScript. 安装 TypeScript 命令行工具安装: npm install ...
- Python 3 利用 Dlib 19.7 和 sklearn机器学习模型 实现人脸微笑检测
0.引言 利用机器学习的方法训练微笑检测模型,给一张人脸照片,判断是否微笑: 使用的数据集中69张没笑脸,65张有笑脸,训练结果识别精度在95%附近: 效果: 图1 示例效果 工程利用pytho ...