系统性能优化、性能指标、性能测试

news2024/11/18 4:38:13

系统性能是互联网应用最核心的非功能性架构目标,系统因为高并发访问引起的首要问题就是性能问题:高并发访问的情况下,系统因为资源不足,处理每个请求的时间就会变慢,看起来就是性能变差。

因此,性能优化是互联网架构师的核心职责之一,通常我们想到性能优化,首先想到的是优化代码。事实上,一个系统是由很多方面组成的,所有这些方面都进行优化,就是接下来我们要讲的7层优化。

性能指标

所谓的性能测试,就是模拟用户请求,对系统施加高并发的访问压力,观察系统的性能指标。系统性能指标主要有响应时间、并发数、吞吐量和性能计数器。

  • 响应时间:是指发出请求开始到收到最后响应数据所需要的时间。响应时间是系统最重要的性能指标,最直接地反映了系统的快慢。

  • 并发数:是指系统同时处理的请求数,这个数字反映了系统的负载压力情况。性能测试的时候,通常在性能压测工具中,用多线程模拟并发用户请求,每个线程模拟一个用户请求,这个线程就是性能指标中的并发数。

  • 吞吐量:是指单位时间内系统处理请求的数量,体现的是系统的处理能力。我们一般用每秒HTTP请求数HPS、每秒事务数TPS、每秒查询数QPS这样的一些指标来衡量。

    吞吐量、响应时间和并发数三者之间是有关联性的。并发数不变、响应时间足够快,那么单位时间的吞吐量就会相应的提高。比如说并发数是1,响应时间如果是100ms,那么TPS就可以是10,如果响应时间是500ms,但是TPS吞吐量就变成了2。

  • 性能计数器:指的是服务器或者操作系统性能的一些指标数据,包括系统负载System Load、对象和线程数、内存使用、CPU使用、磁盘和网络I/O使用等指标,这些指标是系统监控的重要参数,反映系统负载和处理能力的一些关键指标,通常这些指标和性能是强相关的,这些指标很高,成为瓶颈,通常也预示着性能可能会出现问题。在实践中运维和开发人员会对这些性能指标设置一些报警的阈值。当监控系统发现性能计数器超过阈值的时候,就会向运维和开发人员报警,以便及时发现、处理系统的性能问题。

性能测试

性能测试是使用性能测试工具,通过多线程模拟用户请求对系统施加高并发的访问压力,得到以上这些性能指标。事实上,性能测试随着性能测试工具逐渐增加请求线程数,系统的吞吐量和响应时间会呈现出不同的性能特性。具体来说,整个测试过程又可细分为性能测试、负载测试、压力测试三个阶段。

性能测试是指以系统设计初期规划的性能指标为预期目标,对系统不断地施加压力,验证系统在资源可接受的范围内是否达到了性能的预期目标。这个过程,随着并发数的增加,吞入量也在增加,但是响应时间变化不大。系统正常情况下的并发访问压力应该都在这个范围内。

负载测试则是对系统不断地施加并发请求,增加系统的压力,直到系统的某项或多项指标达到安全临界值。这个过程中,随着并发数的增加,吞吐量只有小幅的增加,达到最大值后,吞吐量还会下降,而响应时间则会不断增加。

压力测试是指超过安全负载的情况下,增加并发请求数,对系统继续施加压力,直到系统崩溃,或者不再处理任何请求,此时的并发数就是系统的最大压力承受能力。这个过程中,吞吐量迅速下降,响应时间迅速增加,到了系统崩溃点,吞吐量为0,响应时间无穷大。

性能压测工具不断增加并发请求线程数,持续对系统进行性能测试、负载测试、压力测试,得到对应的TPS和响应时间,讲这些指标画在一个坐标系里,就得到系统的性能特性曲线。

image

除了测出性能指标,性能测试有时候还需要进行稳定性测试。稳定性测试是指持续地对被测试系统施加一定的并发访问压力,使系统运行较长一段时间,以此检测系统是否稳定。通常,线上系统的负载压力是不稳定的,有时候,为了更好地模拟线上访问压力,稳定性测试的并发访问压力也可以不断调整压测线程数,在不稳定的并发压力下,测试系统的稳定性。

性能优化

一个系统是由很多方面构成的,程序只是这个系统的一小部分,因此进行性能优化的时候,也需要从系统的角度出发,综合考虑优化方案。

用户体验优化

性能优化的最终目的是让用户有更好的性能体验,所以性能优化最直接的其实是优化用户体验。同样500毫秒的响应时间,如果收到全部响应数据后才开始显示给用户,相比收到部分数据就开始显示,对用户的体验就完全不一样,同样,在等待响应结果的时候,只显示一个空白的页面和显示一个进度条,用户感受到的性能也是完全不同的。

除了用户体验优化这种比较主观的性能优化,即使我们想要真正优化性能指标,进行客观的性能优化,我们也可以从系统的角度,全方位考虑系统的各个方面。

从系统的宏观层面逐渐往下看,可以在7个层面进行性能优化。

第一层:数据中心优化

首先是数据中心性能优化,我们开发的软件是部署在数据中心的,对于一个全球访问的互联网应用而言,如果只有一个数据中心,那么最远的用户访问这个数据中心,即使以光速进行网络通信,一次请求响应的网络通信时间也需要130多毫秒。这已经是一个人可以明显感受到的响应延迟了。

所以,现在大型的互联网应用基本都采用多数据中心方案,在全球各个主要区域都部署自己的数据中心,就近为区域用户提供服务,加快响应速度。

第二层:硬件优化

在专栏文章第21篇讲分布式架构时,就对比分析了垂直伸缩和水平伸缩两种架构方案,事实上,即使使用水平伸缩,在分布式集群服务器内部,依然可以使用垂直伸缩,优化服务器的硬件能力。有时候,硬件能力的提升,对系统性能的影响是非常巨大的。

我在做Spark性能优化时发现,网络通信是整个计算作业的一个重要瓶颈点。

image

我们看到,在使用1G网卡的情况下,某些计算阶段的网络通信开销时间需要50多秒。如果用软件优化的方法,进行数据压缩,一方面提升有限,另一方面还需要消耗大量CPU的资源,使CPU资源成为瓶颈。

后来通过硬件升级的办法进行优化,使用10G网卡替换1G网卡,网络通信时间消耗得到极大改善。

image

原来需要50多秒的通信时间,现在只需要10多秒就可以完成,整个作业计算时间也大大缩减。硬件优化效果明显。

操作系统优化

不同操作系统以及操作系统内的某些特性也会对软件性能有重要影响。还是Spark性能优化的例子,在分析作业运行期CPU消耗的数据时,我发现在分布式计算的某些服务器上,操作系统自身消耗的CPU占比特别高。

image

图中蓝色部分是系统占用CPU,红色部分是Spark程序占用CPU,某些时候系统占用CPU比Spark程序占用CPU还高,经分析发现,在某些版本的Linux中,transparent huge page这个参数是默认打开的,导致系统占用CPU过高,关闭这个参数后,系统CPU占用下降,整个计算时间也大幅缩短了。

第四层:虚拟机优化

像Java这种的编程语言开发的系统是需要运行在JVM虚拟机里的,虚拟机的性能对系统的性能也有较大影响,特别是垃圾回收,可能导致应用程序出现巨大的卡顿。关于JVM虚拟机优化的有关原理可以参考《Java虚拟机原理:JVM为什么被称为机器(machine)?》

第五层:基础组件优化

在虚拟机之下,应用程序之上,还需要依赖各种基础组件,比如Web容器,数据库连接池,MVC框架等等。这些基础组件的性能优化也会对系统性能有较大影响。

第六层:架构优化

我们这个模块就是讨论各种互联网技术架构,大部分技术架构方案也是用来提升系统性能的,主要有缓存、消息队列、集群。

缓存:通过从缓存读取数据,加快响应时间,减少后端计算压力,缓存主要是提升读的性能。

消息队列:通过将数据写入消息队列,异步进行计算处理,提升系统的响应时间和处理速度,消息队列主要是提升写的性能。

集群:将单一服务器进行伸缩,构建成一个集群完成同一种计算任务,从而提高系统在高并发压力时候的性能,各种服务器都可以构建集群应用集群、缓存集群、数据库集群等等。

第七层:代码优化

通过各种编程技巧和设计模式提升代码的执行效率,也是我们最能控制的一个优化手段,具体技巧有:

使用合理的数据结构优化性能,可参考《数据结构原理:Hash表的时间复杂度为什么是O(1)?》

编写性能更好的SQL语句以及使用更好的数据访问方式,可参考《数据库原理:PrepareStatement 为什么性能好又安全?》。

实现异步 I/O 与异步方法调用,避免不必要的阻塞,可参考《反应式编程框架设计:如何使程序调用不阻塞等待、立即响应?》

此外,还可以使用线程池、连接池等对象池化技术,复用资源,减少资源的创建。当然最重要的还是利用各种设计模式和设计原则,开发清晰、易维护的代码。因为一团糟的代码里面有什么性能问题谁也搞不清楚,也没办法优化。

学习来源:极客时间 《后端技术面试38讲》学习笔记 Day05

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

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

相关文章

1596_AURIX_TC275_LMU简介

全部学习汇总: GreyZhang/g_TC275: happy hacking for TC275! (github.com) 这个章节其实没有多少页文档,而大部分的文档其实是寄存器的字段描述。因此,这次一次性把这个文档的内容大概看完。 LMU提供了32K的本地通用RAM。ED存储的访问也是通…

Mybatis 框架开发的准备

从百度中“mybatis download”可以下载最新的 Mybatis 开发包。进入选择语言的界面,进入中文版本的开发文档。下载相关的 jar 包或 maven 开发的坐标。下载的 zip 文件如下(我们的资料文件夹):我们所使用的 Mybatis 版本是 3.2.7 …

我在CSDN的2022:突破零粉丝,4个月涨粉4000+,2023年目标5万+

文章目录前言我为什么又回来写博客?初写文章碰壁1024活动第一次上热榜关于上热榜博客之星2023年目标最后前言 今年最自豪的事,我用业余时间,在CSDN上坚持创作了4个月,产出了20多篇博客,其中7篇文章上了全站热榜&#…

Python基础必经之路——函数

前言 嗨喽~大家好呀,这里是魔王呐 ❤ ~! 目录前言定义函数向函数传递信息实参和形参传递实参返回值将函数存储在模块中导入整个模块尾语 💝定义函数 下面是一个打印问候语的简单函数 def greet_user():print("hello") greet_user()本例示例…

excel函数技巧:如何快速汇总销售合计项

一年的销售数据整理完了,除了要看到每个人的销售合计之外,老板今年还要看到图中这两项合计:销量最高的三个月合计是指汇总每人一年中,销量最高的三个月的数据。超过平均值的销售合计是指汇总超过总平均值的月份销量。两项合计需要…

【进阶】Spring Boot日志文件

努力经营当下,直至未来明朗! 文章目录一、日志有什么用二、日志怎么用三、 自定义日志打印四、 日志级别五、日志持久化六、更简单的日志输出——lombok小结普通小孩也要热爱生活! 一、日志有什么用 日志是解决问题最直观、最有效的方法。⽇…

ROS2机器人编程简述humble-第二章-Launchers .3.3

ROS2机器人编程简述humble-第二章-Publishing and Subscribing .3.2ros2 run一次只能开启一个node,如果一次开启一组相关node,需要使用ros2 launch。支持Python, XML, 和 YAML。推荐Python。zhangrelayLAPTOP-5REQ7K1L:~$ ros2 run -h usage: ros2 run […

Mysql之约束

简介 not null前面也说过,这些约束是针对列的数据的,对应整个列的数据都起约束作用 基本但是创建表在字段后使用的语句 1.primary key-主键 主键特征1.对应列不能有重复的数据2.不能为NULL 唯一且非空 -- 主键 -- id,name,email CREATE TABLE t17(id…

AX7A200教程(1): DDR3仿真平台搭建(一)

本章节主要调用官方的MIG控制器,并使用官方的MIG控制器进行仿真,开发环境vivado2020.1鉴于很多童鞋无法仿真自己新建的DDR工程,即使使用modelsim仿真也仿真失败,本例程着重于在vivado中,对自己新建的带DDR3的工程进行仿…

力扣45.跳跃游戏Ⅱ(贪心思路详解)

文章目录力扣45.跳跃游戏Ⅱ题目描述算法思路代码实现力扣45.跳跃游戏Ⅱ 题目描述 给定一个长度为 n 的 0 索引整数数组 nums。初始位置为 nums[0]。 每个元素 nums[i] 表示从索引 i 向前跳转的最大长度。换句话说,如果你在 nums[i] 处,你可以跳转到任意…

114、【树与二叉树】leetcode ——77. 组合:回溯法+剪枝优化(C++版本)

题目描述 原题链接:77. 组合 解题思路 组合问题是回溯法里的经典问题,分别采用两个全局变量path记录当前组合情况,res作为结果集。每次因为结果集需要去重,因此还需要再设置一个局部变量startIndex作为每次遍历的起始值&#xf…

Linux kernel Memory Pin机制的实现以及测试

提起Memory Pin机制,就不得不提到swap的概念,这两个概念息息相关,为了避免在CPU忙碌的时候,也就是在缺页异常发生的时候,临时搜索可供换出的内存页面并加以换出,Linux内核定期地检查系统的空闲页面数量是否…

九大数据分析方法-单指标分析方法与多指标分析方法

文章目录1 单指标分析方法1.1 周期性分析法1.2 结构分析法1.3 分层分析法2 多指标分析方法2.1 矩阵分析法2.2 指标拆解法本文来源,为接地气的陈老师的知识星球,以及付同学的观看笔记。1 单指标分析方法 顾名思义,用单个数据指标进行数据分析…

RocketMQ 简介

一、简介 官方简介: l RocketMQ是一款分布式、队列模型的消息中间件,具有以下特点: l 能够保证严格的消息顺序 l 提供丰富的消息拉取模式 l 高效的订阅者水平扩展能力 l 实时的消息订阅机制 l 亿级消息堆积能力 二、网络架构 三、特性 1. na…

05-jquery基本过滤器

2.5过滤器 过滤器是一个字符串,用了筛选dom对象,过滤器是和选择器一起使用。在选择dom对象后,再进行过滤筛选。 .5.1基本过滤器 使用dom对象在数组中的位置,作为过滤条件。 1 选择数组中第一个dom成员。 语法:$(“选…

【nginx】全面实战-Mac

▒ 目录 ▒🛫 导读需求1️⃣ 安装brew替换为阿里源修复报错No such file or directorybrew install nginx常用文件及目录常用命令2️⃣ nginx配置配置结构3️⃣ web服务器默认服务器自定义静态服务器4️⃣ 反向代理配置及介绍5️⃣ 负载均衡配置及介绍负载均衡的策略…

杂记:python和pyinstaller从头安装步骤(附安装包的备份)

pyinstaller 简介 知道的就跳过本章 python 属于脚本语言,只要有 python 就能运行 .py 文件。而 pyinstaller 是可执行文件文件生成工具,约等于编译工具。 以 windows 为例,在 A 计算机上生成的 exe,复制到 B 计算机可以直接运行…

字节跳动青训营--前端day3

文章目录前言一、写好JavaScript的一些原则二、各司其职三、组件封装四、过程抽象前言 仅以此文章记录学习 一、写好JavaScript的一些原则 各司其职:让HTML、CSS和JavaScript职能分离组件封装:好的UI组件具备正确性、扩展性、复用性过程抽象&#xff1…

JVM堆内存分配策略(深入理解Java虚拟机第三章)

堆内存模型: 年轻代: 根据分代算法,默认小于15岁的对象称作年轻代,年轻代分为Eden区、幸存者区(Survivor Form,Survivor To),三者比例为:8:1:1 Eden 分区:对象出生分区…

Java 实现几种 异步的实现方式

前言 异步执行对于开发者来说并不陌生,在实际的开发过程中,很多场景多会使用到异步,相比同步执行,异步可以大大缩短请求链路耗时时间,比如:发送短信、邮件、异步更新等,这些都是典型的可以通过…