最近线上使用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 性能问题的记录的更多相关文章

  1. Redis性能问题排查解决手册(七)

     阅读目录: 性能相关的数据指标 内存使用率used_memory 命令处理总数total_commands_processed 延迟时间 内存碎片率 回收key 总结 性能相关的数据指标 通过Red ...

  2. Redis性能问题排查解决手册

    转自:http://www.cnblogs.com/mushroom/p/4738170.html 阅读目录: 性能相关的数据指标 内存使用率used_memory 命令处理总数total_comma ...

  3. redis性能调优笔记(can not get Resource from jedis pool和jedis connect time out)

    对这段时间redis性能调优做一个记录. 1.单进程单线程 redis是单进程单线程实现的,如果你没有特殊的配置,redis内部默认是FIFO排队,即你对redis的访问都是要在redis进行排队,先 ...

  4. 关于redis性能问题分析和优化

    一.如何查看Redis性能 info命令输出的数据可以分为10个分类,分别是: server,clients,memory,persistence,stats,replication,cpu,comm ...

  5. Redis(二十一):Redis性能问题排查解决手册(转)

    性能相关的数据指标 通过Redis-cli命令行界面访问到Redis服务器,然后使用info命令获取所有与Redis服务相关的信息.通过这些信息来分析文章后面提到的一些性能指标. info命令输出的数 ...

  6. Redis性能调优

    Redis性能调优 尽管Redis是一个非常快速的内存数据存储媒介,也并不代表Redis不会产生性能问题.前文中提到过,Redis采用单线程模型,所有的命令都是由一个线程串行执行的,所以当某个命令执行 ...

  7. [转帖]Redis性能解析--Redis为什么那么快?

    Redis性能解析--Redis为什么那么快? https://www.cnblogs.com/xlecho/p/11832118.html echo编辑整理,欢迎转载,转载请声明文章来源.欢迎添加e ...

  8. 阅读之Redis性能

    Redis作为一种KV缓存服务器,有着极高的性能,相对于memcache,Redis支持更多中数据类型,因此在业界广泛应用. Redis为什么快: 数据是存储在内存中的. Redis是单线程的. 将数 ...

  9. Redis性能分析思路

    Redis性能分析有几个大的方向.分别是 (1)基准对比 (2)配置优化 (3)数据持久化 (4)键值优化 (5)缓存淘汰 (6)Redis集群 基准对比 在没有业务实例运行的情况下,在服务器上通过测 ...

随机推荐

  1. CDM中添加Hive服务时Gateway是什么?

    参考这里http://grokbase.com/t/cloudera/scm-users/12aayq5cyh/what-is-gateway-in-cloudera-manager 实际上Gatew ...

  2. 【LeetCode】170. Two Sum III – Data structure design

    Difficulty:easy  More:[目录]LeetCode Java实现 Description Design and implement a TwoSum class. It should ...

  3. 016.Zabbix聚合监控

    一 Zabbix监控机汇总计算 用Calcuated Items可以对Items进行汇总计算,如求磁盘总容量.网络流量,只依赖于Zabbix-Server,与Zabbix-Agent和proxy无关. ...

  4. JAVA 类和对象基础知识详解

    /*文章中用到的代码只是一部分,需要源码的可通过邮箱联系我 1978702969@qq.com*/ 和C++一样,JAVA也是一门面向对象的语言,其基础和核心是类和对象.而面向对象的思想是来源与显示生 ...

  5. 【教程】Tomcat 的catalina.out 日志按照自定义日期格式进行切割

    本文简单介绍在使用cronolog对tomcat的日志进行自定义日期格式的切割,方便日志的整理和遇到问题日志的排查! 安装cronolog 安装cronolog的方法网上有很多,这里也简单的介绍一下. ...

  6. 【Ray Tracing in One Weekend 超详解】 光线追踪1-2

    今天我们开始进入正篇 Chapter 3: Rays, a simple camera, and background 对于所有的光线追踪器,基本都有一个光线类,计算沿光线看到的颜色. 我们的光线是一 ...

  7. 干货: 可视化项目实战经验分享,轻松玩转 Bokeh (建议收藏)

    作者 | Will Koehrsen 翻译 | Lemon 译文出品 | Python数据之道 (ID:PyDataRoad) 本文通过一个项目案例,详细的介绍了如何从 Bokeh 基础到构建 Bok ...

  8. Android-Binder(一)

    Android-Binder(一) 学习自 <Android开发艺术探索> https://www.jianshu.com/p/bdef9e3178c9 https://blog.csdn ...

  9. IllegalArgumentException: Unmatched braces in the pattern.

    IllegalArgumentException: Unmatched braces in the pattern. 非法参数异常. 不匹配的 吊带 在 样品 中. === 没有管.  项目一直卡在d ...

  10. CentOS 7下使用chkconfig添加的服务无法使用/etc/profile里面的环境变量

    经过分析/etc/profile为入口的,基本是登录后执行的变量,而使用chkconfig添加的服务多变以守护经常运行,没有登录. CentOS 7下使用chkconfig添加的服务无法使用/etc/ ...