最近线上使用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. Ubuntu安装及卸载brew

    网站:http://linuxbrew.sh/ 一.安装: 不能在root下运行 $sh -c "$(curl -fsSL https://raw.githubusercontent.com ...

  2. 微信小程序入门实例之记事本

    主要实现思想都在代码的注释中,项目源码见github 首先上项目目录 app.js文件代码如下: //app.js App({ onLaunch: function() { //调用API从本地缓存中 ...

  3. BZOJ.1926.[SDOI2010]粟粟的书架(前缀和 主席树 二分)

    题目链接 题意: 在给定矩形区域内找出最少的数,满足和>=k.输出数的个数.两种数据范围. 0~50 注意到(真没注意到...)P[i,j]<=1000,我们可以利用前缀和预处理. num ...

  4. 大学启示录I 浅谈大学生的学习与就业

    教育触感 最近看了一些书,有了一些思考,以下纯属博主脑子被抽YY的一些无关大雅的思考,如有雷同,纯属巧合.. 现实总是令人遗憾的,我们当中太多人已经习惯于沿着那一成不变的"典型成功道路&qu ...

  5. hdu 5203 && BC Round #37 1002

    代码参考自:xyz111 题意: 众所周知,萌萌哒六花不擅长数学,所以勇太给了她一些数学问题做练习,其中有一道是这样的:勇太有一根长度为n的木棍,这个木棍是由n个长度为1的小木棍拼接而成,当然由于时间 ...

  6. mybatis学习笔记(三)-- 优化数据库连接配置

    原来直接把数据库连接配置信息写在conf.xml配置中,如下 <?xml version="1.0" encoding="UTF-8"?> < ...

  7. Python包管理工具pip安装

    Python版本在2.7.9+以上的都自带pip无需安装,但在CentOS 7里面自带的Python是2.7.5,所以需要单独安装. 安装: curl https://bootstrap.pypa.i ...

  8. HDU 4747 Mex (2013杭州网络赛1010题,线段树)

    Mex Time Limit: 15000/5000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/Others)Total Submis ...

  9. ASP.NET Web API中通过ETag实现缓存

    通常情况下Server是无状态的,在ASP.NET Web API中,我们可以让服务端响应体中产生ETag属性,起到缓存的作用.大致实现原理是: 1.服务端的响应体中返回一个ETag属性2.客户端通过 ...

  10. iOS非ARC内存管理摘要 - 实践型

    关于ios内存管理.在开发过程中,内存管理很重要,我简单说明一下. 1.正确用法 UIView *v = [[UIView alloc] init]; //分配后引用计数为1 [self.view a ...