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集群 基准对比 在没有业务实例运行的情况下,在服务器上通过测 ...
随机推荐
- catalan数的新理解
catalan数的新理解h[5]==h[4][0]+h[3][1]+h[2][2]+h[1][3]+h[0][4];对于这种递推式就是catalan数
- JAVA 图形开发之计算器设计(事件监听机制)
/*文章中用到的代码只是一部分,需要源码的可通过邮箱联系我 1978702969@qq.com*/ 前段时间刚帮同学用MFC写了个计算器,现在学到JAVA的图形开发,就试着水了一个计算器出来.(可以说 ...
- 聊聊zookeeper的分布式锁
分布式锁就是多台机器,分布在不同的JVM中,这些不同JVM内的方法需要获取一个唯一锁,比如获取锁之后要把数据写入数据库,保证数据在同一时刻只有一台机器写入数据库. 分布式锁的实现有多种实现方法,除了今 ...
- 3种纯css方法控制元素隐藏显示
1.通过hover,也是最常用的方式.此方法要求按钮与被控制元素必须有层级关系.(兼容低端浏览器常用) <div class="nav-btn"> <h2> ...
- 数据包发包工具bittwist
数据包发包工具bittwist 渗透测试中,通过发送特定格式的包,可以实施网络嗅探和攻击.Kali Linux提供一款发包工具bittwist.该工具可以通过指定的网络接口发送数据.该工具不仅可以 ...
- Web大前端面试题-Day4
1. 如何实现瀑布流? 瀑布流布局的原理:1) 瀑布流布局要求要进行布置的元素等宽, 然后计算元素的宽度, 与浏览器宽度之比,得到需要布置的列数;2) 创建一个数组,长度为列数, 里面的值 ...
- Android利用ViewPager实现滑动广告板
•android-support-v4.jar,这是谷歌官方 给我们提供的一个兼容低版本Android设备的软件包,里面包囊了只有在Android3.0以上可以使用的api.而ViewPager就是其 ...
- String和StringBuilder、StringBuffer的区别?
估计很多Java初学者在学习Java的过程中都会遇到这个问题,那就是String,StringBuilder,StringBuffer这三个类之间有什么区别?今天在这里整理一下,希望对大家有帮助哈.如 ...
- bzoj4289 Tax
Description 给出一个N个点M条边的无向图,经过一个点的代价是进入和离开这个点的两条边的边权的较大值,求从起点1到点N的最小代价.起点的代价是离开起点的边的边权,终点的代价是进入终点的边的边 ...
- USBDM RS08/HCS08/HCS12/Coldfire V1,2,3,4/DSC/Kinetis Debugger and Programmer -- BDM Construction and Firmware
Construction. Build the hardware using the information provided in the PCB download. The following a ...