Redis 性能问题的记录
最近线上使用redis, 查询的情况不甚理想, 这个查询操作是个 lua 脚本, 包含如下操作
开发机 redis, 没有其他干扰, 插入的 zset 有 5000 member 左右, 使用的 redis 客户端是 spring-data, 底层 jedis 实现, 另外自己封装了一层, 单线程单客户端测试
1. zrange key 0 0 withscores
2. expire key
3. zadd key score member
A. 结果测试10w次发现平均每次拿到数据的时间需要 2800 us (2.8 ms). 也就是说 qps 只能达到 350 左右
B. 于是在本地在此进行测试, 结果是每次调用花费 300 us (0.3 ms), 差了 10 倍左右
而在本地和开发机上直接用 redis benchmark 测试 zadd, 使用单客户端测试性能 , 测试命令如下
A. 本机测试
redis-benchmark -n -c -r zadd testzset __rand_int__
====== zadd testzset __rand_int__ ======
requests completed in 3.37 seconds
parallel clients
bytes payload
keep alive: 100.00% <= milliseconds
29647.20 requests per second
约合 34 us / command
B. dev 机器测试
redis-benchmark -h l-remote1.com -p -n -c -r zadd testzset __rand_int__
====== zadd testzset __rand_int__ ======
requests completed in 10.53 seconds
parallel clients
bytes payload
keep alive: 47.43% <= milliseconds
99.75% <= milliseconds
99.90% <= milliseconds
99.97% <= milliseconds
99.99% <= milliseconds
100.00% <= milliseconds
949.58 requests per second
约合 1053 us / command
下面是使用 java redis 客户端详细的测试数据
单位 us Local Test 10W Zrange No test on borrow
.
elapsed : count : avg :
Mon elapsed : count : avg : .
elapsed : count : avg :
Mon elapsed : count : avg : .
elapsed : count : avg :
Mon elapsed : count : avg : .
elapsed : count : avg :
Mon elapsed : count : avg : Test on borrow
.
elapsed : count : avg :
Mon elapsed : count : avg : .
elapsed : count : avg :
Mon elapsed : count : avg : .
elapsed : count : avg :
Mon elapsed : count : avg : .
elapsed : count : avg :
Mon elapsed : count : avg : Local Test 10W Lua No test .
elapsed : count : avg :
Mon elapsed : count : avg : .
elapsed : count : avg :
Mon elapsed : count : avg : .
elapsed : count : avg :
Mon elapsed : count : avg : .
elapsed : count : avg :
Mon elapsed : count : avg : Test on borrow .
elapsed : count : avg :
Mon elapsed : count : avg : .
elapsed : count : avg :
Mon elapsed : count : avg : .
elapsed : count : avg :
Mon elapsed : count : avg : .
elapsed : count : avg :
Mon elapsed : count : avg : Dev Redis 10W Zrange
No borrow test .
elapsed : count : avg :
Mon elapsed : count : avg : .
elapsed : count : avg :
Mon elapsed : count : avg : .
elapsed : count : avg :
Mon elapsed : count : avg : .
elapsed : count : avg :
Mon elapsed : count : avg : Test on borrow .
elapsed : count : avg :
Mon elapsed : count : avg : .
elapsed : count : avg :
Mon elapsed : count : avg : .
elapsed : count : avg :
Mon elapsed : count : avg : .
elapsed : count : avg :
Mon elapsed : count : avg : Dev Redis 10W Lua No borrow test .
elapsed : count : avg :
Mon elapsed : count : avg : .
elapsed : count : avg :
Mon elapsed : count : avg : .
elapsed : count : avg :
Mon elapsed : count : avg : .
elapsed : count : avg :
Mon elapsed : count : avg : test on borrow .
elapsed : count : avg :
Mon elapsed : count : avg : .
elapsed : count : avg :
Mon elapsed : count : avg : .
elapsed : count : avg :
Mon elapsed : count : avg : .
elapsed : count : avg :
Mon elapsed : count : avg :
可以发现实际上 java 客户端的性能并没有差多少, 使用 zrange 查询远端客户端在没有 test on borrow 的情况下也在 1 ms 左右, 加上 test on borrow 马上翻倍, 这就是 RTT 的效果, 按照 netty 的工作线程数为 8 个, 这个线程数根本还无法将 RTT 的影响达到最低, 据我测试起码需要大于 10 个并行客户端的数量才可以消除
并发客户端的数量对 benchmark 的测试的影响是非常大的, 由于 RTT (routnd trip time) 的存在, 本地网卡的网络延时可能不明显, 但是如果是非本地环境, RTT 就会显得非常严重了, 例如只用单客户端进行测试, 如下
本地测试单客户端
edis-benchmark -n -c zrange dp.
====== zrange dp. ======
requests completed in 3.31 seconds
parallel clients
bytes payload
keep alive: 100.00% <= milliseconds
30229.75 requests per second
本地测试多客户端
redis-benchmark -n -c zrange dp.
====== zrange dp. ======
requests completed in 1.38 seconds
parallel clients
bytes payload
keep alive: 100.00% <= milliseconds
72516.32 requests per second
远程测试单客户端, 发现连 1000 qps 都到不了
redis-benchmark -h l-remote1.com -p -n -c zrange dp.
====== zrange dp. ======
requests completed in 10.18 seconds
parallel clients
bytes payload
keep alive: 73.23% <= milliseconds
99.93% <= milliseconds
99.99% <= milliseconds
100.00% <= milliseconds
982.80 requests per second
远程 10 客户端
redis-benchmark -h l-remote1.com -p -n -c zrange dp.
====== zrange dp. ======
requests completed in 10.56 seconds
parallel clients
bytes payload
keep alive: 52.75% <= milliseconds
99.81% <= milliseconds
99.99% <= milliseconds
100.00% <= milliseconds
9468.80 requests per second
远程 50 客户端
redis-benchmark -h l-remote1.com -p -n -c zrange dp.
====== zrange dp. ======
requests completed in 4.86 seconds
parallel clients
bytes payload
keep alive: 1.19% <= milliseconds
26.45% <= milliseconds
98.55% <= milliseconds
99.87% <= milliseconds
99.94% <= milliseconds
99.95% <= milliseconds
99.96% <= milliseconds
99.97% <= milliseconds
99.99% <= milliseconds
100.00% <= milliseconds
20580.37 requests per second
可以发现多客户端情况下 qps 不在一个级别
回到上面的测试
我们单线程的 java 客户端执行 zrange 也就 1000 qps 到不了, 算上现在 3 台机器 + 每台机器 8 个工作线程, 撑死达到 1000 * 3 * 8 = 24000 的 qps, 而且机器上还有很多别的任务, redis 操作也不止一个 zrange, 能到 10000 qps 已经很不错了我相信. 所以最终还不能这么搞, 能解决问题办法我初步考虑应该是
1. 异步 redis 客户端, 别阻塞工作线程
2. 增加 redis 客户端执行任务线程数 (目前这种同步情况下就是 netty 的工作线程)
Redis 性能问题的记录的更多相关文章
- Redis性能问题排查解决手册(七)
阅读目录: 性能相关的数据指标 内存使用率used_memory 命令处理总数total_commands_processed 延迟时间 内存碎片率 回收key 总结 性能相关的数据指标 通过Red ...
- Redis性能问题排查解决手册
转自:http://www.cnblogs.com/mushroom/p/4738170.html 阅读目录: 性能相关的数据指标 内存使用率used_memory 命令处理总数total_comma ...
- redis性能调优笔记(can not get Resource from jedis pool和jedis connect time out)
对这段时间redis性能调优做一个记录. 1.单进程单线程 redis是单进程单线程实现的,如果你没有特殊的配置,redis内部默认是FIFO排队,即你对redis的访问都是要在redis进行排队,先 ...
- 关于redis性能问题分析和优化
一.如何查看Redis性能 info命令输出的数据可以分为10个分类,分别是: server,clients,memory,persistence,stats,replication,cpu,comm ...
- Redis(二十一):Redis性能问题排查解决手册(转)
性能相关的数据指标 通过Redis-cli命令行界面访问到Redis服务器,然后使用info命令获取所有与Redis服务相关的信息.通过这些信息来分析文章后面提到的一些性能指标. info命令输出的数 ...
- Redis性能调优
Redis性能调优 尽管Redis是一个非常快速的内存数据存储媒介,也并不代表Redis不会产生性能问题.前文中提到过,Redis采用单线程模型,所有的命令都是由一个线程串行执行的,所以当某个命令执行 ...
- [转帖]Redis性能解析--Redis为什么那么快?
Redis性能解析--Redis为什么那么快? https://www.cnblogs.com/xlecho/p/11832118.html echo编辑整理,欢迎转载,转载请声明文章来源.欢迎添加e ...
- 阅读之Redis性能
Redis作为一种KV缓存服务器,有着极高的性能,相对于memcache,Redis支持更多中数据类型,因此在业界广泛应用. Redis为什么快: 数据是存储在内存中的. Redis是单线程的. 将数 ...
- Redis性能分析思路
Redis性能分析有几个大的方向.分别是 (1)基准对比 (2)配置优化 (3)数据持久化 (4)键值优化 (5)缓存淘汰 (6)Redis集群 基准对比 在没有业务实例运行的情况下,在服务器上通过测 ...
随机推荐
- P1387 最大正方形 图DP
题目描述 在一个n*m的只包含0和1的矩阵里找出一个不包含0的最大正方形,输出边长. 输入输出格式 输入格式: 输入文件第一行为两个整数n,m(1<=n,m<=100),接下来n行,每行m ...
- 028 Partitioner:数据分区器
Partitioner:数据分区器,决定数据到下一个RDD的时候在那一个分区 HashPartitioner:根据key的hashCode值来实现 RangePartitioner: 根据key所属范 ...
- hdu 5407(LCM好题+逆元)
CRB and Candies Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)T ...
- C#开发Unity游戏教程循环遍历做出判断及Unity游戏示例
C#开发Unity游戏教程循环遍历做出判断及Unity游戏示例 Unity中循环遍历每个数据,并做出判断 很多时候,游戏在玩家做出判断以后,游戏程序会遍历玩家身上大量的所需数据,然后做出判断,即首先判 ...
- SDOI2013 R1 Day1
目录 2018.3.22 Test 总结 T1 BZOJ.3122.[SDOI2013]随机数生成器(BSGS 等比数列) T2 BZOJ.3123.[SDOI2013]森林(主席树 启发式合并) T ...
- hdu 5826 physics 物理题
physics 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5826 Description There are n balls on a smoo ...
- 详解没有dSYM文件 如何解析iOS崩溃日志
Xcode支持崩溃日志自动符号化,前提是本地有当时Build/Archive生成的dSYM文件,iOS崩溃日志符号化后,可以帮助开发者更好的定位问题,但如果dSYM文件丢失或拿到的崩溃日志不是标准的c ...
- MySQL错误:TIMESTAMP with implicit DEFAULT value is deprecated
用于存放数据库的文件夹不为空,清空了再来一次!
- SGU 101 Domino (输出欧拉路径)
101. Domino time limit per test: 0.25 sec. memory limit per test: 4096 KB Dominoes – game played wit ...
- 聚币网API使用教程 demo
原文 http://30daydo.com/article/181 目前还在完善,等功能完善了,就更新到csdn. 更新 2017-05-27 官方有API的文档,可是这个文档就像一个草稿一样,两个基 ...