Redis性能问题诊断以及scan命令耗时分析


摘要

最近公司有项目反馈卡顿.
卡顿一小时后自己被拉入群聊.
同事已经基本上定位到问题原因.
我这边想使用朴素的性能观点进行一下性能问题的拆解
为了提高自己.

用到的一些脚本

echo "info" |redis-cli -p 6379 -a Yourpassword >`date +%Y%m%d%H%M`.txt
# 获取信息并且保存
echo "slowlog get 100 " |redis-cli -p 6379 -a Yourpassword >`date +%Y%m%d%H%M`.txt
# 获取较慢的命令
redis-cli -a password -p port --bigkeys >`date +%Y%m%d%H%M`_bigkeys.txt
redis-cli -a password -p port --hotkeys >`date +%Y%m%d%H%M`_hotkeys.txt
# 注意大key基本上可以查到
# hotkeys需要有memory_policy. 需要注意.

scan耗时统计与分析-先说结论

scan 命令 时间复杂度为 O(n)
理论上这个O(n) 很多的是靠 count来进行指定.
并且理论上一个键值对的消耗时间为 1 微秒左右. 虽然他可以在 count 值的微秒数之内返回, 但是如果要遍历所有的键值对, 并且多个client同时遍历
那么时间损耗是非常恐怖的. 又因为redis是单线程io复用的模型. 所以他会导致其他的核心业务卡断. 如果非必要建议不要使用scan命令, 在高并发,大量key的场景下性能表现并不好.

scan耗时统计与分析-预制数据

scan 命令说明
scan 其实是对redis所有的键值对进行一次遍历
他的时时间复杂度是 O(n) 当然了他的时间复杂度可以通过 count 进行控制.
但是我们的场景是 多台服务器同事连接, 如果都进行 scan的话 对主线程的影响就比较恶劣了. 所以计划做一个测试. 首先命令为:
scan 0 match zhaobsh* count 1000000
命令说明
scan
第一个0 表示游标开始
第二个 match zhaobsh* 便于对符合此类的进行查询
第三个 count 1000000 表示一次性查询所少个key 因为我是测试环境, 键值对不多, 所以想着能够一次性多查询一下以便验证时间 测试数据创建
创建三个脚本,分别是10万,100万,1000万个键值对.
time for i in {1..100000} ; do echo set key${i} value${i} >>/root/100000set.txt ; done
time for i in {1..1000000} ; do echo set key${i} value${i} >>/root/1000000set.txt ; done
time for i in {1..10000000} ; do echo set key${i} value${i} >>/root/10000000set.txt ; done
执行导入:
time cat /root/1000000set.txt |redis-cli -a xxxxx --pipe 注意之前总结过 -pipe 可以快速预祝数据.
1000万预制数据大约耗时: 20秒

scan耗时统计与分析-统计方法

分别插入三次数据量的数据. 然后都执行这个命令
scan 0 match zhaobsh* count 1000000
然后通过
slowlog get 1 后去最慢的命令 . 的出结论为
不同keys量情况下的速度

scan耗时统计与分析-部分结论

keys值数量 slowlog耗时
10万 40毫秒
100万 440毫秒
1000万 1008毫秒

scan 算法分析

自己进行了一下验证, 如果直接一次scan 一千万的记录
耗时为: 10.15秒.
理论上scan 一个键值对的时间为 1微秒左右. 如果redis里面有 1000万个key的话 60台服务器如果同时进行一次所有的scan
那么搞不好至少会有在 运行期间内产生总计 600S 的延迟时间.

测试结果

127.0.0.1:6379> scan 0 match zhaobsh* count  10000000
1) "14680063"
2) (empty array)
(10.15s)
127.0.0.1:6379> slowlog get 1
1) 1) (integer) 13
2) (integer) 1681104753
3) (integer) 10147528
4) 1) "scan"
2) "0"
3) "match"
4) "zhaobsh*"
5) "count"
6) "10000000"
5) "127.0.0.1:27925"
6) ""
127.0.0.1:6379> dbsize
(integer) 10000001
127.0.0.1:6379>

redis-benchmark同步验证

测试命令:
./redis-benchmark -a xxxx -r 10000 -n 100 -c 8000 scan 0 match zhaobsh* count 10000
10000个随机key, 测试100次, 使用 80000个client进行测试验证.
被测试的命令为: scan 0 match zhaobsh* count 10000 一万个key时count 一万时:
Summary:
throughput summary: 99.11 requests per second
latency summary (msec):
avg min p50 p95 p99 max
993.304 17.472 1004.543 1005.055 1005.055 1005.055 十万个key时 count 十万时
Summary:
throughput summary: 11.54 requests per second
latency summary (msec):
avg min p50 p95 p99 max
2970.660 135.680 3000.319 3000.319 3000.319 3000.319
五十万个key时 count 五十万时
Summary:
throughput summary: 3.46 requests per second
latency summary (msec):
avg min p50 p95 p99 max
2972.532 322.816 3000.319 3000.319 3000.319 3000.319

测试时CPU的情况

   PID USER      PR  NI    VIRT    RES    SHR S %CPU %MEM     TIME+ COMMAND
72489 root 20 0 2148060 1.4g 1504 R 99.9 0.1 80:22.77 redis-server
72490 root 20 0 2148060 1.4g 1504 S 0.0 0.1 0:00.00 bio_close_file
72491 root 20 0 2148060 1.4g 1504 S 0.0 0.1 0:00.00 bio_aof_fsync
72492 root 20 0 2148060 1.4g 1504 S 0.0 0.1 0:00.00 bio_lazy_free
72493 root 20 0 2148060 1.4g 1504 S 0.0 0.1 1:00.51 jemalloc_bg_th

Redis性能问题诊断以及scan命令耗时分析的更多相关文章

  1. Redis变慢?深入浅出Redis性能诊断系列文章(二)

    (本文首发于"数据库架构师"公号,订阅"数据库架构师"公号,一起学习数据库技术) 本篇为Redis性能问题诊断系列的第二篇,本文主要从应用发起的典型命令使用上进 ...

  2. Redis为什么变慢了?透彻解读如何排查Redis性能问题

    Redis 作为优秀的内存数据库,其拥有非常高的性能,单个实例的 OPS 能够达到 10W 左右.但也正因此如此,当我们在使用 Redis 时,如果发现操作延迟变大的情况,就会与我们的预期不符. 你也 ...

  3. Redis变慢?深入浅出Redis性能诊断系列文章(三)

    (本文首发于"数据库架构师"公号,订阅"数据库架构师"公号,一起学习数据库技术,助力职业发展) 本篇为Redis性能问题诊断系列的第三篇,主要从Redis服务层 ...

  4. redis性能优化、内存分析及优化

    redis性能优化.内存分析及优化 1.优化网络延时 2.警惕执行时间长的操作 3.优化数据结构.使用正确的算法 4.考虑操作系统和硬件是否影响性能 5.考虑持久化带来的开销 5.1 RDB 全量持久 ...

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

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

  6. redis scan 命令指南

    redis scan 命令指南 1. 模糊查询键值 redis 中模糊查询key有 keys,scan等,一下是一些具体用法. -- 命令用法:keys [pattern] keys name* -- ...

  7. Redis性能分析思路

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

  8. 用redis的scan命令代替keys命令,以及在spring-data-redis中遇到的问题

    摘要 本文主要是介绍使用redis scan命令遇到的一些问题总结,scan命令本身没有什么问题,主要是spring-data-redis的问题. 需求 需要遍历redis中key,找到符合某些pat ...

  9. Redis Scan命令

    原地址:https://www.cnblogs.com/tekkaman/p/4887293.html [Redis Scan命令] SCAN cursor [MATCH pattern] [COUN ...

  10. redis scan命令使用

      以前的项目中有用到redis的keys命令来获取某些key,知道看了这篇文章 https://mp.weixin.qq.com/s/SGOyGGfA6GOzxwD5S91hLw.安全起见,这次打算 ...

随机推荐

  1. FlinkSQL实战开发

    FlinkSQL实战开发 1.基础知识 FlinkSQL分为Table API和SQL API,是架构于Flink Core之上用SQL予以方便快捷地进行结构化数据处理的上层库. 工作流程 SQL和T ...

  2. 【好书推荐】《Python黑魔法指南》-附高清PDF版

    摘要:<Python 黑魔法手册.pdf >作者(明哥)是一个从事云计算多年的 Python 重度用户,它把自已多年的 Python 编码经验整理成小册子,没有长篇大论,半天就能全能掌握, ...

  3. 5大特性,带你认识化繁为简的华为云CodeArts Deploy

    摘要:2月27日,华为云发布持续部署服务CodeArts Deploy,通过模块化自由编排部署流程,实现软件的自动化部署,帮助企业软件产品的快速.高效.高质量交付. 本文分享自华为云社区<化繁为 ...

  4. 云小课|MRS基础原理之Oozie任务调度

    阅识风云是华为云信息大咖,擅长将复杂信息多元化呈现,其出品的一张图(云图说).深入浅出的博文(云小课)或短视频(云视厅)总有一款能让您快速上手华为云.更多精彩内容请单击此处. 摘要:Oozie是一个基 ...

  5. SyntaxError: Non-ASCII character #-*- coding:utf-8 -*-

    执行python报错 /usr/bin/python2.7 /root/demo.py File "/root/demo.py", line 2 SyntaxError: Non- ...

  6. 火山引擎数智平台协助洞察美图类APP新增长,付费用户转化超过 124%

    更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,回复[1]进入官方交流群 美图类 APP 的下一个增长点在哪里? 目前,国内市场上的美图类 APP 大多都遵循着基础功能免费使用.个性化热门 ...

  7. 一个NASA、Google都在用的开源CMS:wagtail

    说起开源CMS,你会想到哪些呢?WordPress?DoraCMS?joomla? 今天再给大家推荐一个非常好用的开源CMS:Wagtail 如果您正在选型的话,可以了解一下Wagtail的特点: 基 ...

  8. 什么是「滑动窗口算法」(sliding window algorithm),有哪些应用场景?

    今天是算法数据结构专题的第2篇文章,我们一起来学习一下「滑动窗口算法」. 前言 最近刷到leetCode里面的一道算法题,里面有涉及到Sliding windowing算法,因此写一篇文章稍微总结一下 ...

  9. 2019年第十届蓝桥杯国赛C++A组

    蓝桥杯历年国赛真题汇总:Here 最后编辑时间: 2021年5月27日 统一声明 如果不写默认带有常用头文件 如果不表明主函数默认表示在 void solve(){} 默认使用 using names ...

  10. 1、springboot工程新建(单模块)

    系列导航 springBoot项目打jar包 1.springboot工程新建(单模块) 2.springboot创建多模块工程 3.springboot连接数据库 4.SpringBoot连接数据库 ...