Redis性能问题诊断以及scan命令耗时分析
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命令耗时分析的更多相关文章
- Redis变慢?深入浅出Redis性能诊断系列文章(二)
(本文首发于"数据库架构师"公号,订阅"数据库架构师"公号,一起学习数据库技术) 本篇为Redis性能问题诊断系列的第二篇,本文主要从应用发起的典型命令使用上进 ...
- Redis为什么变慢了?透彻解读如何排查Redis性能问题
Redis 作为优秀的内存数据库,其拥有非常高的性能,单个实例的 OPS 能够达到 10W 左右.但也正因此如此,当我们在使用 Redis 时,如果发现操作延迟变大的情况,就会与我们的预期不符. 你也 ...
- Redis变慢?深入浅出Redis性能诊断系列文章(三)
(本文首发于"数据库架构师"公号,订阅"数据库架构师"公号,一起学习数据库技术,助力职业发展) 本篇为Redis性能问题诊断系列的第三篇,主要从Redis服务层 ...
- redis性能优化、内存分析及优化
redis性能优化.内存分析及优化 1.优化网络延时 2.警惕执行时间长的操作 3.优化数据结构.使用正确的算法 4.考虑操作系统和硬件是否影响性能 5.考虑持久化带来的开销 5.1 RDB 全量持久 ...
- 关于redis性能问题分析和优化
一.如何查看Redis性能 info命令输出的数据可以分为10个分类,分别是: server,clients,memory,persistence,stats,replication,cpu,comm ...
- redis scan 命令指南
redis scan 命令指南 1. 模糊查询键值 redis 中模糊查询key有 keys,scan等,一下是一些具体用法. -- 命令用法:keys [pattern] keys name* -- ...
- Redis性能分析思路
Redis性能分析有几个大的方向.分别是 (1)基准对比 (2)配置优化 (3)数据持久化 (4)键值优化 (5)缓存淘汰 (6)Redis集群 基准对比 在没有业务实例运行的情况下,在服务器上通过测 ...
- 用redis的scan命令代替keys命令,以及在spring-data-redis中遇到的问题
摘要 本文主要是介绍使用redis scan命令遇到的一些问题总结,scan命令本身没有什么问题,主要是spring-data-redis的问题. 需求 需要遍历redis中key,找到符合某些pat ...
- Redis Scan命令
原地址:https://www.cnblogs.com/tekkaman/p/4887293.html [Redis Scan命令] SCAN cursor [MATCH pattern] [COUN ...
- redis scan命令使用
以前的项目中有用到redis的keys命令来获取某些key,知道看了这篇文章 https://mp.weixin.qq.com/s/SGOyGGfA6GOzxwD5S91hLw.安全起见,这次打算 ...
随机推荐
- 云原生开发者须具备的1+N技能,开启第二曲线
摘要:云的大环境下,意味以云为中心的快速应用开发能力将成为"胜负手".在现如今如此复杂的外部环境,且高速发展的情况下,为了不重蹈覆辙,必须需要开发者的第二曲线来破局! 随着云计算的 ...
- CWE 视图层级关系解析:节点关系查询
本文分享自华为云社区<CWE视图层级关系的解析 之 CWE节点关系的查询>,作者: Uncle_Tom. 1. CWE 转换成 SQLite 表 依据<CWE视图层级关系的解析 之 ...
- 鸿蒙轻内核源码分析:MMU协处理器
摘要:本系列首先了解下ARM CP15协处理器的知识,接着介绍下协处理器相关的汇编指令,最后分析下MMU相关汇编代码. 本文分享自华为云社区<鸿蒙轻内核A核源码分析系列六 MMU协处理器> ...
- React Native UI界面还原,组件布局与动画效果
写React Native UI和写 Android XML layout 布局 ,个人感觉是大同小异 在<ReactJS到React-Native,架构原理概述>里面提过 web 环境中 ...
- Gartner 权威预测未来4年网络安全的8大发展趋势
翻译:SEAL安全 原文标题: Gartner Unveils the Top Eight Cybersecurity Predictions for 2022-23 原文链接: https://ww ...
- 利用 Solon-web 框架写一个 Hello World
Solon 项目的开源地址: https://gitee.com/noear/solon 最近看了不少别人写的各种框架的 Hello world 示例,有些看起来,真的很复杂. 今天,我们用号称简单到 ...
- SpringBoot 接口输出文件流 & Vue 下载文件流,获取 Header 中的文件名
SpringBoot 接口输出文件流 & Vue 下载文件流,获取 Header 中的文件名 @GetMapping("/download") public Respons ...
- 股票数据爬虫进阶:免费、开源的股票爬虫Python库,实测真香
更多精彩内容,欢迎关注公众号:数量技术宅,也可添加技术宅个人微信号:sljsz01,与我交流. 免费.开源的股票爬虫Python库:Easyquotation 我们在此前的文章中,向大家分享了如何用P ...
- django中间件需要了解的方法 importlib模块 csrf校验策略 csrf相关装饰器
目录 django中间件三个需要了解的方法 process_view process_exception process_template_response 基于django中间件实现功能的插拔式设计 ...
- 自己实现的一个简单的C# IOC 容器
IService接口,以实现服务的启动.停止功能: using System; using System.Collections.Generic; using System.Linq; using S ...