Redis 压力测试 服务监控

news2024/11/26 22:40:03

Redis 压力测试 & 服务监控

Redis 压力测试

Redis 安装成功后,会在 /usr/local/bin/目录下生成redis-benchmark压测工具。该工具模拟N个客户端同时执行Redis指令,默认提供一组默认测试参数,用户可以自定义其属性,更改测试行为。

参数说明

# 执行以下指令 查看其参数信息
redis-benchmark -h
Usage: redis-benchmark [-h <host>] [-p <port>] [-c <clients>] [-n <requests]> [-k <boolean>]

 -h <hostname>      Server hostname (default 127.0.0.1)
 -p <port>          Server port (default 6379)
 -s <socket>        Server socket (overrides host and port)
 -a <password>      Password for Redis Auth 
 -c <clients>       Number of parallel connections (default 50) # 默认模拟50个客户端连接 即50并发
 -n <requests>      Total number of requests (default 100000)   # 默认总共请求次数
 -d <size>          Data size of SET/GET value in bytes (default 3) # 数据默认大小
 --dbnum <db>       SELECT the specified db number (default 0) # 指定数据库 默认0号数据库
 -k <boolean>       1=keep alive 0=reconnect (default 1)
 -r <keyspacelen>   Use random keys for SET/GET/INCR, random values for SADD
  Using this option the benchmark will expand the string __rand_int__
  inside an argument with a 12 digits number in the specified range
  from 0 to keyspacelen-1. The substitution changes every time a command
  is executed. Default tests use this to hit random keys in the
  specified range. # 该选项针对SET/GET/INCR指令生成12位的随机键值,对SADD指令生成12位随机Value值,随机数在0-keyspacelen-1范围内生成
 -P <numreq>        Pipeline <numreq> requests. Default 1 (no pipeline).
 -q                 Quiet. Just show query/sec values
 --csv              Output in CSV format
 -l                 Loop. Run the tests forever
 -t <tests>         Only run the comma separated list of tests. The test
                    names are the same as the ones produced as output.
 -I                 Idle mode. Just open N idle connections and wait.

默认压测

# 执行压测 默认请求数量 10w
# -q 仅显示 qps 信息
redis-benchmark -q -n 100000

如下图,默认情况下 redis-benchmark工具会执行多个脚本进行测试

在这里插入图片描述

结果说明

# get指令 每秒qps为70372, 50%的请求延迟在 0.327 毫秒   
GET: 70372.98 requests per second, p50=0.327 msec   

指定测试

也许只需要测试指定的指令,而非执行所有默认的压测命令,可以通过 -t 选项指定待运行的指令

# 压测仅执行 set 指令
$ redis-benchmark -t set -n 100000 -q
SET: 73475.39 requests per second, p50=0.327 msec    

此外,你也可以使用script load 命令对指定的Redis命令进行压测命令

redis-benchmark -n 100000 -q script load "redis.call('set','foo','bar')"
script load redis.call('set','foo','bar'): 74128.98 requests per second, p50=0.327 msec   

指定Key大小

默认情况下,benchmark对单个键值进行测试,通常情况下可以通过使用更大的键值模拟真实的工作场景。理由是:键值越大,并发情况下,网络带宽占用相对来说比较高,因此更接近业务场景。

使用 -r 选项指定key的大小。例如,如果我想运行一百万个SET操作,在100k个可能的键中,对每个操作使用一个随机键:

$ redis-benchmark -t set -r 100000 -n 1000000
====== SET ======
  1000000 requests completed in 14.23 seconds
  50 parallel clients
  3 bytes payload
  keep alive: 1
  host configuration "save": 3600 1 300 100 60 10000
  host configuration "appendonly": no
  multi-thread: no
...
Summary:
  throughput summary: 70283.95 requests per second
  latency summary (msec):
          avg       min       p50       p95       p99       max
        0.368     0.168     0.335     0.551     0.695     5.743

$ redis-cli dbsize
(integer) 99993

管道测试

默认情况下,benchmark工具模拟50个客户端,每个客户端只能等待Redis服务器返回,才能继续发送下一个指令。这意味着服务器需要按顺序读取每一个请求指令,此外每次发送请求之前还会由于TCP连接握手消耗时间。

Redis 支持批量发送请求指令,一次请求发送多个指令,从而加快应用系统整体的响应速度,这是优化Redis常用的方式。

benchmark工具支持管道批量发送指令,

# 使用pipeline 每次发送16个指令;系统吞吐量差不多 提高10倍
redis-benchmark -n 1000000 -t set,get -P 16 -q
SET: 662690.56 requests per second, p50=0.999 msec                    
GET: 795544.94 requests per second, p50=0.799 msec

注意事项

压测工具的重要目标是获取重复的测试结果,以便与其他测试结果进行比较,最终选择最优方案。相同的压测工具在不同硬件、不同系统、不同环境设置下压测的结果不尽一致,通常而言,需要考虑以下场景:

  • 在隔离的硬件上进行测试 避免其他因素干扰
  • 系统CPU工作频率会影响测试结果, 最好为基准测试中涉及的所有CPU内核设置可能的最高固定频率
  • 系统必须保证足够的RAM,Linux环境中 请正确设置overcommit_memory参数
  • Redis开启RDB、AOF时,请关闭系统中的其他IO活动,避免造成交叉影响
  • 将Redis日志记录级别(loglevel参数)设置为警告或通知。避免将生成的日志文件( IO活动)
  • 避免使用可能改变基准测试结果的监控工具。例如,定期使用INFO收集统计数据可能很好,但MONITOR将显著影响测量的性能

Redis 服务监控

Redis性能监控非常重要,运维人员可以监控通过监控关键指标,以跟踪Redis实例的性能。本篇介绍下Redis监控关键指标以及如何进行监控。由于Redis是内存数据库,因此监控系统资源利用率非常重要,Redis检测指标主要包含:

  • 性能
  • 内存
  • Redis基本情况

性能指标

延迟

延迟是衡量Redis性能的重要指标,它是只Redis客户端发送请求到接收响应的时间差。快速检查Redis延迟的方法:

# 该命令显示Redis ping 命令的网络延迟
redis-cli --latency -h 127.0.0.1 -p 6379

在这里插入图片描述

  • 274 samples - Redis CLI发出PING的次数 上述命令记录了274个请求和响应
  • min - redis cli发出PING的时间与收到回复的时间之间的最小延迟 单位毫秒
  • max - redis cli发出PING的时间与收到回复的时间之间的最大延迟 单位毫秒 如上图 1ms
  • avg - 采样数据的平均响应时间,0.27毫秒

CPU使用率

如果发现Redis导致的CPU使用率高,则应进一步调查。CPU使用率高也可能与命令执行时间长有关。此时需要使用Redis慢日志功能是否存在长时间执行的命令

127.0.0.1:6379> info cpu
# CPU
used_cpu_sys:6.472493
used_cpu_user:3.873488
used_cpu_sys_children:0.000000
used_cpu_user_children:0.000000

缓存命中率

Redis缓存命中率是要监视的重要性能指标之一。表示Redis实例的使用效率。该比率表示所有读取操作中成功命中(读取)的百分比。计算如下:

缓存命中率 = (keyspace_hits)/(keyspace_hits + keyspace_misses)

# info stats 可查看命中率相关参数说明
127.0.0.1:6379> info stats
# Stats
...
total_eviction_exceeded_time:0
current_eviction_exceeded_time:0
keyspace_hits:0
keyspace_misses:0
...

内存指标

如果Redis实例的内存使用量超过总可用内存,则会导致内存交换。内存交换涉及通过将未使用的内存内容移动到磁盘来回收内存空间。从磁盘写入或读取速度要慢得多,而且无法达到使用Redis的目的。跟踪内存使用情况可以确保Redis实例使用的内存少于总可用内存。

开发者可以使用maxmemory指令为Redis配置最大内存;或者通过redis.config 配置最大内存值;当Redis使用的内存达到阈值时,可以使用内存淘汰策略删除未使用的key值。

内存碎片

内存碎片问题会导致性能降低和延迟增加。理想情况下,Redis需要连续的内存段来存储数据。但如果操作系统找不到连续的部分,它会分配碎片内存部分来存储Redis数据,这会导致内存寻址开销。

127.0.0.1:6379> info memory
# Memory
# redis 占用内存
used_memory:1193712
used_memory_human:1.14M
# 操作系统占用内存
used_memory_rss:1953792
used_memory_rss_human:1.86M
... 

Redis中的内存碎片 是计算used_Memory_rss与used_Memory的比率。通常情况下,大于或接近1的内存碎片比率被认为是健康的。如果它低于1,则意味着您需要立即为Redis分配更多内存,否则它将开始交换内存。

内存淘汰策略

当Redis达到max_memory_limit时,需要指定策略将过期数据删除,以腾出内存空间容纳新的KEY-VALUE值。指定Redis内存淘汰策略,对于维持系统的稳定性非常重要。Redis默认支持以下淘汰机制:

  • noeviction - 当达到内存限制并且客户端尝试执行可能导致使用更多内存的命令时,将返回错误
  • allkeys-lru - 通过尝试先删除最近使用较少的(LRU)键来移出键,以便为添加的新数据腾出空间
  • volatile-lru - 通过尝试先删除最近使用较少的且设置了过期时间的(LRU)键来移出键,以便为添加的新数据腾出空间
  • allkeys-random - 随机删除键,以便为添加的新数据腾出空间
  • volatile-random - 随机删除设置了过期时间的键,以便为添加的新数据腾出空间
  • volatile-ttl - 删除设置了到期时间的键,并尝试首先删除具有较短生存时间(TTL)的键

可以修改redis.conf 中的属性 maxmemory-policy 指定相关策略,该功能默认关闭。

Redis 基本情况

除了性能和内存指标外,了解Redis实例的一些基本活动指标也是很有用的:

  • connected_clients - 客户端连接数

  • blocked_clients - 阻塞客户端数

  • connected_slaves - 连接副本数

  • total_commands_processed - redis实例处理的命令总数

  • keyspace - 了解Redis数据库中的KEY数量很重要 keyspace参数提供有关键数和过期键数的统计信息

    127.0.0.1:6379> info keyspace
    # Keyspace 数据库0中有1个key 
    db0:keys=1,expires=0,avg_ttl=0
    

收集指标

Redis INFO 指令提供以下相关维度信息的收集

  • Server
  • Clients
  • Memory
  • Persistence
  • stats
  • replication
  • CPU
  • commandstats
  • cluster
  • keyspace

慢日志查询

Redis 默认将执行时间超过1秒请求定义为慢日志,可以通过客户端进行显示。可以在redis.conf文件中自定义执行时长

# The following time is expressed in microseconds, so 1000000 is equivalent
# to one second. Note that a negative number disables the slow log, while
# a value of zero forces the logging of every command.
# 单位: 微秒, 1000000 == 1秒 ; 值若为 -1 表示不记录slow log;0 表示强制记录所有命令。
slowlog-log-slower-than 10000

将其设置为0 ,然后客户端展示慢日志


127.0.0.1:6379> slowlog get 10
1) 1) (integer) 2
   2) (integer) 1670946587
   3) (integer) 48
   4) 1) "slowlog"
      2) "help"
   5) "127.0.0.1:61208"
   6) ""

查看slowlog帮助文档

127.0.0.1:6379> slowlog help
 1) SLOWLOG <subcommand> [<arg> [value] [opt] ...]. Subcommands are:
 2) GET [<count>]
 3)     Return top <count> entries from the slowlog (default: 10, -1 mean all).
 4)     Entries are made of:
 5)     id, timestamp, time in microseconds, arguments array, client IP and port,
 6)     client name
 7) LEN
 8)     Return the length of the slowlog.
 9) RESET
10)     Reset the slowlog.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/92326.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

java开发必备技能:mysql

mysql 架构 连接器 mysql的连接器负责处理mysql客户端的连接请求及维护连接。 传输协议 mysql支持多种传输协议&#xff0c;不同的平台可以选择不同的协议&#xff1a; 连接压缩控制 mysql建立的连接可以对客户端和服务器之间的流量进行压缩&#xff0c;以减少通过连接发…

Rock派(基于瑞芯微RK3308B)开发记录-上篇

本文作者&#xff1a;Linux兵工厂&#xff0c;一个嵌入式软件领域的攻城狮。欢迎指教公一众-号&#xff1a;Linux兵工厂&#xff0c;获取硬核Linux资料和文章 前言 根据项目需求并且经过各方面评估最终选择了这款Rock Pi(Rock派)系列中的Rock Pi S产品。正式它的各方面的特性…

马士兵-郑金维—并发编程—6.JUC并发工具

JUC并发工具 一、CountDownLatch应用&源码分析 1.1 CountDownLatch介绍 CountDownLatch就是JUC包下的一个工具,整个工具最核心的功能就是计数器。 如果有三个业务需要并行处理,并且需要知道三个业务全部都处理完毕了。 需要一个并发安全的计数器来操作。 CountDown…

Web大学生网页作业成品 :黑色主题个人博客网站设计与实现(HTML+CSS+JavaScript)

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

基于java+springmvc+mybatis+vue+mysql的农业信息管理系统

项目介绍 农业信息的需求和管理上的不断提升&#xff0c;农业信息管理的潜力将无限扩大&#xff0c;农业信息管理系统在业界被广泛关注&#xff0c;本系统对此进行总体分析&#xff0c;将农业信息管理的发展提供参考。农业信息管理系统对农业信息有着明显的带动效应&#xff0…

【统一融合:拉普拉斯算子:GAN框架】

UIFGAN: An unsupervised continual-learning generative adversarial network for unified image fusion &#xff08;UIFGAN:一个无监督不断学习生成对抗网络统一的图像融合&#xff09; 本文提出了一种新的无监督连续学习生成对抗网络&#xff08;UIFGAN&#xff09;用于统…

阿里资深架构师熬夜纯手写的238页微服务容器化开发实战笔记

本文将分为目录、主要内容和大牛对本文的高度评价三部分组成&#xff0c;因为内容比较多&#xff0c;小编只能把部分知识点和目录拿出来给大家介绍&#xff0c;希望大家能够理解&#xff01;&#xff01;&#xff01; 本文目录 本文包括的主要内容 微服务和 Docker容器技术是目…

怎么安装 Arch Linux?

Arch Linux 是一个 x86-64 通用发行版&#xff0c;它流行于那些喜欢 DIY Linux 系统的用户和 Linux 铁杆粉丝当中。 本文导航 ◈ 如何安装 Arch Linux11% ◈ 安装 Arch Linux 的条件&#xff1a;14% ◈ 第一步&#xff1a;下载 ISO 文件18% ◈ 第二步&#xff1a;创建一个 …

磨金石教育摄影技能干货分享|世界顶级的手机摄影作品欣赏

随着手机像素越来越高&#xff0c;拍照功能越来越完善&#xff0c;手机摄影成为了越来越多人的首选&#xff0c;大家不再执着于单反相机。手机的方便与简捷更受非专业人士的青睐。 每到一个地方&#xff0c;见到不同的景色和人文&#xff0c;我们都可以随手掏出手机记录这些美好…

前端模板-2【vue部分小功能】

前端模板【vue部分小功能】 1 Vue部分模板 1.1 vue实现store【存储当前选中页面】 我的习惯用法&#xff0c;大家可自行调整【以存储当前页面名称为例】 ①在src下新建文件夹store&#xff0c;并创建configure.js、index.js configure.js const configure {state: {HOST: h…

LeetCode 每日一题——1945. 字符串转化后的各位数字之和

1.题目描述 1945. 字符串转化后的各位数字之和 给你一个由小写字母组成的字符串 s &#xff0c;以及一个整数 k 。 首先&#xff0c;用字母在字母表中的位置替换该字母&#xff0c;将 s 转化 为一个整数&#xff08;也就是&#xff0c;‘a’ 用 1 替换&#xff0c;‘b’ 用 …

React 入门:实战案例 TodoList 底部功能实现

文章目录目标实现效果实现已完成和全部数量统计和显示实现全选和全不选实现清除已完成功能完整代码App 组件完整代码Footer 组件完整代码通过前面的章节已经完成 TodoList 的增删改的功能&#xff0c;本文我们来实现底部相关功能&#xff1a;已完成和全部数量实时统计&#xff…

【Linux】文件系统/inode/软硬链接

目录 一.了解磁盘 1.磁盘的概念 2.磁盘的物理结构 3.磁盘的逻辑结构 4.磁盘区域的划分 二.linux文件系统 三.inode 四.软硬链接 1.软链接 2.硬链接 一.了解磁盘 前言: 一般情况下, 系统中存在大量的未被打开的文件, 这些文件全部存储在磁盘上, 也简称磁盘级文件 在li…

功能测试进阶自动化测试,一个女测试工的坎坷之路

绝大多数测试工程师都是从功能测试做起的&#xff0c;工作忙忙碌碌&#xff0c;每天在各种业务需求学习和点点中度过&#xff0c;过了好多年发现自己还只是一个功能测试工程师。 随着移动互联网的发展&#xff0c;从业人员能力的整体进步&#xff0c;软件测试需要具备的能力要…

从ADAS到高阶自动驾驶,车联网芯片如何赋能产业升级?

2022年&#xff0c;L2及L2ADAS前装搭载率正在快速提升&#xff0c;中国智能网联汽车产业进入了由ADAS加速向高阶自动驾驶迈进的关键期。 根据《高工智能汽车研究院》数据显示&#xff0c;今年1-9月前装标配搭载L2级辅助驾驶搭载量为395.19万辆&#xff0c;同比增长69.53%&…

Java开发必备技能:RocketMQ

官方文档可见&#xff1a;https://github.com/hiwei-zhang/rocketmq/tree/develop/docs/cn RocketMQ集群架构 RocketMQ由以下这几个组件组成 NameServer : 提供轻量级的Broker路由服务。Broker&#xff1a;实际处理消息存储、转发等服务的核心组件。Producer&#xff1a;消息…

69. 利用 ALV 实现增删改查系列之一:让 ALV 报表进入可编辑状态

在 CSDN 和我的知识星球里有朋友向我提出同样的问题,询问如何在 ALV 里实现增删改查操作。 虽然需求只有一句话,但是这个需求背后涉及到的知识点不少,因此笔者会通过几篇文章的篇幅,来介绍这个需求的详细实现步骤。 本文先解决第一个障碍,如何让 ALV 报表进入可编辑状态?…

[ MySQL ] 使用 MySQL Workbentch 进行MySQL数据库备份 / 还原(Part 3:备份.sql文件方式)

本文主要讲解如何用 MySQL Workbentch 进行MySQL备份和恢复数据库&#xff08;利用.sql文件的方式&#xff09;。 关于MySQL数据库备份&#xff0c;本博客内主要相关文章有&#xff1a; [ MySQL ] 使用Navicat进行MySQL数据库备份 / 还原&#xff08;Part 1&#xff1a;备份.…

Unity发布Android平台错误记录

Unity发布Android平台错误记录 &#xff08;1&#xff09;Cannot parse project property android.enableR8‘’ of type ‘class java.lang.String’ as boolean. Expected ‘true’ or ‘false’. 注释掉android.enableR8MINIFY_WITH_R_EIGHT打包就可以了 &#xff08;2&…

电线电缆企业应用APS计划排产软件的效益

电线电缆行业是我国经济第二大的配套产业&#xff0c;仅次于汽车产业&#xff0c;年市场规模超万 亿&#xff0c;按产品可分为电力线缆、电气装备用线缆、通信线缆以及绕组线等。电线电缆用以传输电(磁)能&#xff0c;信息和实现电磁能转换的线材产品。广义的电线电缆亦简称为电…