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集群 基准对比 在没有业务实例运行的情况下,在服务器上通过测 ...
随机推荐
- 图解简单C程序的运行时结构
程序在内存中的存储分为三个区域,分别是动态数据区.静态数据区和代码区.函数存储在代码区,全局变量以及静态变量存储在静态数据区,而在程序执行的时候才会在动态数据区产生数据.程序执行的本质就是代码区的指令 ...
- BZOJ 1009 HNOI 2008 GT考试 递推+矩乘
1009: [HNOI2008]GT考试 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 3679 Solved: 2254[Submit][Statu ...
- $.ajax 方法参数总是记不住,在这里记录一下
jquery中的ajax方法参数总是记不住,这里记录一下. 1.url: 要求为String类型的参数,(默认为当前页地址)发送请求的地址. 2.type: 要求为String类型的参数,请求方式(p ...
- Hadoop化繁为简(一)-从安装Linux到搭建集群环境
简介与环境准备 hadoop的核心是分布式文件系统HDFS以及批处理计算MapReduce.近年,随着大数据.云计算.物联网的兴起,也极大的吸引了我的兴趣,看了网上很多文章,感觉还是云里雾里,很多不必 ...
- HTML5中的跨文档消息传递
跨文档消息传送(cross-document messaging),有时候也简称为XDM,指的是来自不同域的页面间传递消息.例如,www.w3cmm.com域中的一个页面与一个位于内嵌框架中的p2p. ...
- match_parent和fill_parent的区别(转)
有网友表示对于很多工程中的MATCH_PARENT出现在layout中感到不明白,过去只有FILL_PARENT和WRAP_CONTENT那么match_parent到底是什么类型呢? 其实从Andr ...
- Mui --- app与服务器之间的交互原理、mui ajax使用
1.APP与服务器之间的交互原理 app端(客户端)与服务端的交互其实理解起来和容易,客户端想服务器端发送请求,服务器端进行数据运算后返回最终结果.结果可以是多种格式: 1.text 文本格式 2.x ...
- [Go] sync.Once 的用法
sync.Once.Do(f func()) 是一个非常有意思的东西,能保证 once 只执行一次,无论你是否更换 once.Do(xx) 这里的方法,这个 sync.Once块 只会执行一次. pa ...
- LINUX 内核 API
http://www.compsoc.man.ac.uk/~moz/kernelnewbies/documents/kdoc/kernel-api/linuxkernelapi.html
- php开发之命名规则
类命名 1.使用大写的字母作为词的切割,其它字母均使用小写字母 2.名字的首字母使用大写字母 3.不要使用下划线"_" 类属性的命名 1.属性的命名应该以'm'为前缀 2.前缀'm ...