需求分析引言:架构漫谈(四)性能专题

news2024/9/25 13:21:25

前文介绍了非功能性需求里的可靠性和可用性,
本文对非功能性需求里的性能,进行一些详细的说明,和如何度量系统的性能问题。

1、概念

性能通常是指一个软件系统的处理能力和速度,一般通过 延迟 和 吞吐量 这两个指标进行度量。
不同的软件系统,对于性能的要求也是不一样的,下面列举了三种系统的指标要求:

  • Rest API系统
    • 延迟:每个请求消耗的时间
    • 吞吐量:一个周期内多少请求可以被处理(QPS)
  • 大数据系统
    • 延迟:数据从输入到输出的时间(事务处理时间)
    • 吞吐量:处理了多少MB数据
  • 存储系统
    • 延迟:读写数据需要的时间
    • 吞吐量:一个周期内读写了多少MB/次

2、常见性能指标

简单介绍一下常见的性能指标含义和作用:

基础硬件指标

  • CPU使用率:系统正常运转时的CPU占用情况,一般建议平稳运行时不超过70%;
    超过80%要进行预警,经常出现 大幅度波动也应引起警惕;
  • 内存使用率:系统正常运转时的内存占用情况,一般应当在80%以下;
    如果内存持续上升,应考虑内存泄露可能;经常出现波动也应排查处理;
  • 网络IO:系统正常运转时的网络输出流量和输入流量;
    网络带宽占用波动较大应考虑优化;
    注意:带宽占用呈一条直线时,应考虑故障是否因为达到带宽上限导致;
  • 磁盘IO:系统正常运转时的磁盘读写情况;

服务性能指标

  • TPS:Transactions Per Second,每秒传输的事务处理个数,用于衡量系统的吞吐量
    TPS在提出时,一般用于数据库,后续也被引申到其它场景
  • QPS:Queries Per Second,每秒查询次数,用于衡量系统的吞吐量
  • RT:Response Time,每次请求的响应时间(含请求时间)
  • 并发数:系统同时处理的请求数
    比如某一时刻,某个服务有100个请求还在处理中没有响应,则此刻,该服务的并发就是100
  • HPS:Hit Per Second,每次点击次数
  • PV:Page View,页面浏览次数
  • UV:Unique Visitor,独立用户访问次数,一般根据IP或登录用户ID进行统计
  • DAU:Daily Active User,日活跃用户数,简称日活
    你的系统有一万个注册用户,某天的登录用户有100个,那日活就是100
  • RPS:Requests Per Second,每次请求数
    注:用的很少,一般可以理解为QPS;
  • 响应错误率:每100个请求的平均错误次数,在Web服务压力较大时,出错的概率。

TPS与QPS的差异:

  • TPS一般是一批相关联的操作进行统一计数,而QPS是对每个操作进行计数,举几个例子:
    • 在web站点里,打开网站首页,向服务器发起了3个请求:首页、登录状态、新闻列表,
      此时可以理解为:TPS加1,QPS加3
    • 在MySql数据库里,执行一个SQL,QPS加1;执行一个事务(多条SQL),TPS加1
    • 用户发起购买,一般会经历:创建订单入库、订单商品快照入库、商品库存冻结、调用支付系统去支付
      那么这个购买过程,可以理解为:整个过程TPS加1,具体的4个步骤 QPS加4

并发数与QPS的关系:
通常情况下,并发越高,可能会导致响应时间变长,相对应的QPS也会变小,
但是这2个性能指标,都受到服务器状态、网络状态、磁盘等的影响,并不存在能互相转换的关系,
所以网上的很多文章说 并发数 = QPS * 平均响应时间,这其实是不准确的。

3、性能度量

系统性能状态介绍

参考下图:
在这里插入图片描述
这是一个系统,随着并发用户数的增长情况,系统的状态变化过程图示,简要说明如下:

  • 横坐标是并发用户数,纵坐标是有3个指标:
    • Utilization绿色线:表示资源利用率,就是CPU、内存、网络IO、磁盘IO等资源的利用情况
    • Throughput紫色线:表示吞吐量,比如QPS
    • Response Time蓝色线:表示响应时间
  • 坐标域分成三个部分:
    • Light Load轻负载区,并发用户比较少
      • 资源利用率比较低,存在浪费
      • 吞吐量也比较低
      • 响应时间最快
      • 随着并发用户数的增长,资源利用率和吞吐量增长较快,响应时间变化不大
    • Heavy Load重负载区,并发用户较多
      • 资源利用率开始达到瓶颈
      • 吞吐量也增长变缓,且后半段反而开始降低
      • 响应时间有一定的变慢影响
    • Buckle Zone塌陷区,并发用户数已经超负荷
      • 资源利用率已达到瓶颈,基本处于高位,不变化
      • 吞吐量崩溃式下跌
      • 响应时间快速加大,用户无法承受或大量超时
  • 坐标域有两条竖线:
    • The Optimum Number of Concurrent Users最优并发用户数
    • The Maximum Number of Concurrent Users最大并发用户数
  • 同时有三个状态描述
    • Resource Saturated资源饱和:到达重负载区时,资源基本达到瓶颈
    • Throughput Falling吞吐下降:重负载区红色框住的区域,系统的吞吐量开始从上升转为下降
    • End Users Effected用户受影响:塌陷区,用户响应时间快速加大,已经影响我们终端用户

性能如何度量

数据收集方案:

  • 压力测试
    我们的系统上线前,应对系统进行压测。
    我们的压测,就是希望模拟生产环境,找到我们的系统的这2条竖线:最优并发用户数、最大并发用户数
    至少也要找到最优并发用户数及相关的性能指标(QPS等),并保证我们的系统负荷,尽量保持在这条竖线左右,
    以达到资源的较佳利用率,同时达到较高的吞吐量和较低的响应时间。
  • 生产环境监控
    如果没有条件,可以收集生产环境的数据。
    找出系统高峰期的QPS、RT等指标

数据收集类型:

  • avg平均值:比如一天内的平均QPS、平均响应时间;
  • max最大值:比如一天内的峰值QPS、最慢响应时间;
  • min:比如一天内的最小QPS、最快响应时间;
  • 95分位:指涵盖了95%的用户,对我们系统的使用情况
    以响应时间为例,所有用户的响应时间从小到大排序,排在总数据量的95%位置的数据的值,比如1000个用户,那么排序后的响应时间,第950~959,这10个数据都可以认为是95分位,类似指标还有90分位、99分位;
  • 平均差:是一种衡量系统稳定性和一致性的指标。它衡量了一组数据的值与这组数据的平均值之间的差距,
    公式为:(∑|x-x‘|) ÷ n,该值越小,表示所有用户的体验基本越接近;该值越大,表示不同用户的体验差距也越大。
    举个螺帽的例子,要求直径1厘米±0.1,那么:
    • A厂生产的全是0.9厘米和1.1厘米,合规;
    • B厂生产的全是0.99厘米和1.01厘米,也合规;
    • 显然B厂的平均差更小,也更受客户的喜欢。

考虑一个问题:平均数能否代表我们系统的绝大多数用户?
答案是否定的,举个例子:

  • 我们的系统在1小时内,收到了1000个请求
  • 这1000个请求的平均响应时间是100毫秒(总耗时100秒)
  • 但是有 1%的请求,响应时间超过5秒(10个请求,耗时50秒)
  • 由以上推出,99%的请求,响应时间平均为50毫秒

4、性能的长尾问题

长尾的概念:
以Web系统为例,总会有一些请求的响应时间特别长,虽然这些慢请求出现的概率比较低,但是也会对系统性能和用户体验造成比较大的影响,这些慢请求的响应时间就被称之为长尾延迟。

性能指标,在实际的生产运行过程中,甚至是压测过程中,都不可避免会出现抖动:

  • 网络抖动
  • 磁盘IO影响
  • CPU波动
  • 其它(磁盘、同机器的其它APP影响等等)

我们假设,有一个业务API,它依赖了100个底层API,
假设落到最终底层API的请求,平均响应10ms,1%的响应为1s
理想情况:该业务API平均响应时间是 10ms*100 = 1s
但是:100次请求<=1s的概率只有 (99%)100 = 36.6%
请求2S,即99次<1S, 1次>=1S的概率公式 C(100,1) * 1% * (99%)99 = 36.97%
请求3S,即98次<1S, 2次>=1S的概率 C(100,2) * (1%)2 * (99%)98 = 13.23%
依赖的API越多,抖动越频繁,长尾对用户的影响越明显。

对于速度慢的系统、抖动很厉害的系统,用户会更喜欢哪个?
• avg中百分位50%:体现系统的普遍情况,表征系统的基础性能,一般仅用于参考;
• 高百分位95%/99%:体现了最差情况,表征系统的稳定、可靠程度

指标的分布越分散,用户受到长尾请求的影响越明显,举个例子:

  • 有2个系统A和B,在1小时内,各收到了1000个请求
  • 2个系统的平均响应时间均为1秒
  • A系统有500个请求,响应时间为1毫秒,另外500个请求响应时间为1999毫秒
  • B系统有500个请求,响应时间为999毫秒,另外500个请求响应时间为1001毫秒
  • 这2个极端例子时,显然B系统对绝大多数用户的体验是稳定不变的,而A系统的体验是起伏不定的
    一般更推荐B系统,让用户对系统的期望处于一个平衡的状态

所以,作为架构师,甚至普通程序员,对系统的关注点,一定要重点关注:
高百分位,即95分位/99分位

5、经验与实战

这里,结合我个人的经验,作一些实战方面的说明。

定义性能指标

根据我们的系统实际,定义我们的系统需要达到的性能指标,如:

  • 基本模板: 如99%的user_login api应当50ms内完成
  • 关注性能曲线,如所有api请求的响应时间:
    • 90%<20ms
    • 99%<50ms
    • 99.9%<500ms
  • 不同类型系统的负载分别处理
    • OLTP: 小于3KB的请求<50ms
    • OLAP: 95%的请求 <1s
  • 引入误差预算,避免波动导致误报
    • 比如1小时内,请求超过500ms的不超过10次

数据收集

  • 对于核心系统,如订单模块、支付模块,建议要安排压力测试,
    使用与生产环境同等配置的服务器或容器部署,测试出较优并发用户数、以及对应的QPS、响应时间等指标
  • 非核心系统,如果限于资源、时间等因素,可以参考生产环境历史数据,没有历史数据则参考类似系统、API的历史数据

系统监控

常用方案:

  • 增加监控,当系统的指标达到或超出收集的数据时,配置系统进行自动扩容;
    我之前的经验,仅供参考:

    • 假设单机/单实例最优QPS为100,则在QPS超过90时,进行扩容
    • QPS下跌低于60时,进行缩容
  • 增加限流方案,当单机的指标超出时,进行降级处理,避免突发流量或扩容失效,导致系统宕机
    我之前的经验,仅供参考:

    • 使用Spring Cloud Gateway作为系统网关,并使用漏斗算法进行限流
    • 限流方案分几个维度:
      • 系统总QPS不超过100 * 实例数,超过时返回HTTP状态码429 Too Many Requests
      • 核心API按需,逐个配置限流,如果支付API,不超过 50 * 实例数
      • 按模块进行限流,比如 推荐服务,非核心业务,限制为20 * 实例数
  • 出现扩容、缩容、限流时,相关的事件记录,并提供每日报表输出到钉钉
    扩缩容出现频次超过3次/小时,进行告警

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

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

相关文章

分布式软件架构——域名解析系统

透明多级分流系统的设计原则 用户在使用信息系统的过程中&#xff0c;请求首先是从浏览器出发&#xff0c;在DNS的指引下找到系统的入口&#xff0c;然后经过了网关、负载均衡器、缓存、服务集群等一系列设施&#xff0c;最后接触到了系统末端存储于数据库服务器中的信息&…

云计算——容器

作者简介&#xff1a;一名云计算网络运维人员、每天分享网络与运维的技术与干货。 座右铭&#xff1a;低头赶路&#xff0c;敬事如仪 个人主页&#xff1a;网络豆的主页​​​​​ 目录 前言 一.容器简介 二.主流容器技术 1.docker &#xff08;1&#xff09;容器的组…

HTML5+ Runtime提示

使用的环境 vue-cli框架&#xff0c;Andriod调试、云打包都会出现该弹框 1.我遇到的问题 上述弹框提示&#xff0c;HBuilderX3.8.2 &#xff0c; 手机SDK版本是3.8.4&#xff0c;不匹配 解决目的&#xff1a;需要让两个版本匹配 2. 点击“查看详情”&#xff0c;查看原因 …

JS文件UTF8格式乱码问题

UTF8格式的JS文件在IE中显示乱码问题的解决 这种情况通常是由于JS文件头缺少BOM标志引起的,解决方式: 方法1:用系统自带记事本,另存为 UTF-8,覆盖原文件,会自动加上BOM标志(就是文件开头的EF BB BF 三个字节) 方法2: 用notepad 打开,编码菜单,由UTF8编码改为 UTF8-BOM编码

10-Vue从入门到手撕

什么时候可以开始学习Vue? 学习路线&#xff1a;H5 CSS3 ---> ES6 ---> 网络 ---> 第三方库 ---> 工程化 ---> Vue 不经过前面的铺垫是无法学习vue的&#xff0c;就算学了还得倒回去补知识点 展现Vue Vue源码分析&#xff0c;走进作者的内心世界 …

记录一次对STM32G4串口硬件FIFO的调试

记录一次对STM32G4串口硬件FIFO的调试 前言&#xff1a;通常我们使用串口接收多字节数据会使用中断和DMA两种方式。使用中断方式&#xff0c;每接收到一个字节就会触发一次中断&#xff0c;我们可以在中断函数里将接收到的这一字节保存在内存中然后等待其他程序处理&#xff0c…

麦语言是什么东东?怎么学?

麦语言&#xff08;M Language&#xff09;是一种用于处理数据的编程语言&#xff0c;最初由微软公司开发。它是Power Query&#xff08;数据提取和转换工具&#xff09;和Power BI&#xff08;商业智能工具&#xff09;中的一部分。麦语言支持对各种数据源进行查询、转换和清理…

农业温室大棚数据监控系统的设计与实现

1.引言 农业温室大棚作为现在农业发展的必要条件&#xff0c;将高新技术融入农业温室大棚也愈发的重要&#xff0c;对农业温室大棚数据的监控&#xff0c;将温室大棚智能化。本设计对温室大棚实现远程数据监控&#xff0c;自动化控制&#xff0c;对温室内的环境数据进行巡回检…

解决Springboot在启动时报错:不支持发行版本17

今天在创建新项目时控制台出现如下错误&#xff1a; 最后经过排查发现问题出现如下几点。将以下几点进行修改问题得以解决。 1.将红色箭头地方由17改为11 2.将maven的pom文件中 的javaversion由17改为113.将spingboot的版本调为2.7.5 如果以上还没有解决问题&#xff0c;可以尝…

机器视觉(图像处理)入门金典之图像数字化及处理方法

图像的数字化 一般的图像(模拟图像)不能直接用计算机来处理,必须首先转化为数字图像 把模拟图像分割成一个个称为像素的小区域,每个像素的亮度或灰度值用一个整数表示 数字化的含义: 使模拟图像的灰度、亮度和色彩数据化 图像数字化的步骤: 两个步骤: 1、在空间坐标…

时间序列分解 | Matlab改进的自适应噪声完备集合经验模态分解ICEEMDAN

文章目录 效果一览文章概述部分源码参考资料效果一览 文章概述 时间序列分解 | Matlab改进的自适应噪声完备集合经验模态分解ICEEMDAN 部分源码 %--------------------

【百日冲大厂】第十九篇,牛客网选择题+编程题汽水瓶+ 查找两个字符串a,b中的最长公共子串(动态规划问题)

前言&#xff1a; 大家好&#xff0c;我是良辰丫&#xff0c;第十九篇,牛客网选择题编程题汽水瓶 查找两个字符串a,b中的最长公共子串(动态规划问题).&#x1f49e;&#x1f49e;&#x1f49e;生活就像一只盲盒&#xff0c;藏着意想不到的辛苦&#xff0c;当然也有万般惊喜的可…

【自动化测试】——Selenium (基于java)

前言 小亭子正在努力的学习编程&#xff0c;接下来将开启软件测试的学习~~ 分享的文章都是学习的笔记和感悟&#xff0c;如有不妥之处希望大佬们批评指正~~ 同时如果本文对你有帮助的话&#xff0c;烦请点赞关注支持一波, 感激不尽~~ 目录 一、认识Selenium 1.什么是自动化测…

原码的表示

原码表示 定点整数源码与定点小数源码 源码表示例题 正数与负数转换直接将高位变为1即可 原码的性质 原码的优缺点 乘除法直接符号位异或&#xff0c;数值相乘除即可加法与减法需要先判断两个数值的大小然后确定符号位

软件开发项目延期就天天加班,你认为有效吗?

目录 一、软件开发项目延期的因素 1.1 客户需求变更 1.2 开发人员变动 1.3 技术瓶颈 1.4 对外沟通问题 二、相应的解决方案 2.1 需求变更管理机制 2.2 公司内部人员培训和团队建设 2.3 技术难题攻关 2.4 优化沟通流程 三、总结 软件开发项目延期时加班并不是一个长期…

C++之std::forward模板函数用法(一百四十四)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 人生格言&#xff1a; 人生…

2023.7.2-逆向显示键入的整数

功能&#xff1a;输入一个整数(多位)&#xff0c;逆向显示输入的结果。 程序&#xff1a; int main() {int a;printf("请输入一个整数&#xff1a;");scanf("%d",&a);if (a < 0)printf("请输入一个正整数");else{while (a>0){printf…

力扣 -- 931. 下降路径最小和

题目链接&#xff1a;931. 下降路径最小和 - 力扣&#xff08;LeetCode&#xff09; 下面是用动态规划的思想解决这道题的过程&#xff0c;相信各位小伙伴都能看懂并且掌握这道经典的动规题目滴。 参考代码&#xff1a; class Solution { public:int minFallingPathSum(vect…

动态规划 DP (四) 子序列问题

5.子序列问题 1&#xff09; 力扣https://leetcode.cn/problems/longest-increasing-subsequence/解题思路&#xff1a;因为子序列&#xff0c;其实就意味着要进行两层遍历了&#xff0c;分别列举子序列的结尾坐标和开始坐标&#xff0c;这样才能遍历完所有子序列。然后遍历的…

Linux学习-实操篇

Linux学习 实操篇 学自尚硅谷武晟然老师&#xff0c;结合老师课堂内容和自己笔记所写博文。 文章目录 Linux学习实操篇Shell介绍文件目录一、目录操作命令1.1 查看和切换工作目录1.2 列出目录内容1.3 创建和删除目录 二、文件操作命令2.1 创建文件2.2 复制文件或文件夹2.3 删除…