10小时掌握Java进阶必备技术栈 学习笔记Day 1

238 阅读10分钟

hi,我是蛋挞,一个初出茅庐的后端开发,希望可以和大家共同努力、共同进步!


开启掘金成长之旅!这是我参与「掘金日新计划 · 4 月更文挑战」的第 20 天,点击查看活动详情

  • 起始标记->项目性能优化:「项目性能优化 | 上」
  • 结尾标记->项目性能优化:「项目性能优化 | 上」

项目性能优化

项目性能优化(上)

  1. 了解应用性能问题分析方法论
  2. 掌握压力测试基础概念
  3. 掌握压力测试:线程组配置、结果分析,插件使用
  4. 理解性能关键的指标
  5. 掌握压测监控平台搭建

1-性能优化的终极目标是什么?

用户体验 = 产品设计(非技术) + 系统性能 ≈ 系统性能 = 快? 应用性能是产品用户体验的基石,性能优化的终极目标是优化用户体验。当我们谈及性能,最直观能想到的一个词是“快”,哪到底怎么才是快呢?如何又为慢!

2-什么样的体验叫快呢?

  • **3S定理:**Strangeloop在对众多的网站做性能分析之后得出了一个著名的3s定律“页面加载速度超过3s,57%的访客会离开”。
  • **SEO排名:**速度在Google、百度等搜索引擎的PR评分中也占有一定的比例,会影响到网站的SEO排名。

3-怎么让系统快起来呢?

  • 性能优化

4-应用性能调优是个大工程

后端:RT、TPS、并发数、Throughput、Footprint、Latency

  • TPS和RT的影响因素:数据库读写、RPC、网络IO、逻辑计算复杂度、JVM

**Web端:**首屏时间、白屏时间、可交互时间、完全加载时间... **移动端:**端到端响应时间、Crash率、内存使用率、FPS...

首屏时间是指从用户打开网页开始到浏览器第一屏渲染完成的时间,是最直接的用户感知体验指 标,也是性能领域公认的最重要的核心指标。 首屏时间 = DNS时间 + 建立连接时间 + 后端响应时间 + 网络传输时间 + 首屏页面渲染时间 FPS是体现页面顺畅程度的一个重要指标。 端到端响应时间是衡量一个API性能的关键指标,比纯后端响应时间更全面,它会受到DNS、网络 带宽、网络链路、HTTP Payload等多个因素的影响。 端到端响应时间 = DNS解析时间 + 网络传输时间 + 后端响应时间。

05-影响性能的关键要素

  • 产品设计:产品逻辑、功能交互、动态效果、页面元素
    • **12306购票案例查询按钮的设计 **
  • 基础网络:网络 = 连接介质 + 计算终端
    • 连接介质:电缆、双绞线、光纤、微波、载波或通信卫星。
    • 计算终端:PC、手机、可穿戴设备、家具家电...
    • 基础网络设施,互联网,局域网(LAN)、城域网(MAN)、广域网(WAN)
  • 代码质量&架构
    • 架构不合理
    • 研发功底和经验不足
    • 没有性能意识:只实现了业务功能不注意代码性能,新功能上线后整体性能下降,或当业务上量后系统出现连锁反应,导致性能问题叠加,直接影响用户体验。
  • 移动端环境
  • 硬件及云服务
  • **架构不合理:**业务发展超越架构支撑能力而导致系统负荷过载,进而导致出现系统奔溃、响应超时等现象。另外不合理的架构如:单点、无cache、应用混部署、没有考虑分布式、集群化等也都会影响性能。
  • **研发功底和经验不足:**开发的App、Server效率和性能较低、不稳定也是常见的事情。
  • **没有性能意识:**只实现了业务功能不注意代码性能,新功能上线后整体性能下降,或当业务上量后系统出现连锁反应,导致性能问题叠加,直接影响用户体验。
  • 多数的性能问题发生在数据库上。由慢SQL、过多查询等原因造成的数据库瓶颈,没有做读写分离、分库分表等。

image.png

压力测试

2 什么是压力测试?

**什么是压测? ** 压力测试(英语:Stress testing)是针对特定系统或是组件,为要确认其稳定性而特意进行的严格测 试。会让系统在超过正常使用条件下运作,然后再确认其结果。 压力测试是对系统不断施加压力,来预估系统服务能力的一种测试。 为什么对系统压测呢?有没有必要。压不压测要看场景!

一般而言,只有在系统基础功能测试验证完成、系统趋于稳定的情况下,才会进行压力测试。

**目的是什么? **

  1. 当负载逐渐增加时,观察系统各项性能指标的变化情况是否有异常
  2. 发现系统的性能短板,进行针对性的性能优化
  3. 判断系统在高并发情况下是否会报错,进程是否会挂掉
  4. 测试在系统某个方面达到瓶颈时,粗略估计系统性能上限 压测性能指标有哪些? image.png 以上主要的四种性能指标【响应时间、并发用户数、吞吐量、资源使用率】它们之间存在一定的相关 性,共同反映出性能的不同方面。 image.png 在这个图中,定义了三条曲线、三个区域、两个点以及三个状态描述。
  • 三条曲线:
    • 吞吐量的曲线(紫色)
    • 利用率(绿色)
    • 响应时间曲线(深蓝色)
  • 三个区域:
    • 轻负载区(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)

**常用压测工具: **

  1. **Apache JMeter : 可视化的测试工具 **
  2. Apache的ab压力测试
  3. nGrinter 韩国研发
  4. PAS 阿里测试工具
  5. MeterSphere :国内持续测试的开源平台 JMeter压测环境架构图: image.png 压测目标总的来说有4条:
  • **1. 负载上升各项指标是否正常 **
  • **2. 发现性能短板 **
  • **3. 高并发下系统是否稳定 **
  • 4. 预估系统最大负载能力

**手把手带你创建压测案例 ** 目标:完成压测案例,评测SpringBoot项目的吞吐量(TPS)上限。 **步骤: **

  1. 创建测试计划
  2. 配置线程组、http请求、断言、结果监听器
  3. 执行测试
  4. 查看测试结果,分析测试结果 实现: 1)新建测试计划 image.png 2)配置线程组: image.png 线程属性说明:
  • 线程数:20, 线程数量,这里设置了20个线程
  • ramp-up:表示在指定时间之内把这些线程全部启动起来。 如果n=1,那就表示要在1s以内把50个
  • 线程全部启动起来。
  • 循环次数:2000,表示把 20 线程 循环2000次,也就是说让线程循环调用接口2000次

3)配置HTTP接口: image.png 选择keepalive方式,表示使用了长连接。使用长连接可以防止频繁的建立连接,关闭连接消耗性能。一 般浏览器都支持keepalive,如果这里不勾选,这样我们的压测的部分性能消耗会发生在建立,关闭连接 上,导致我们的压测数据不准确。 image.png 4)配置断言: ** JMeter断言常用有两种,一种是响应断言**,一种是响应时间断言,如果响应内容不满足断言的配置,则 认为这次的请求是失败的。

  • 响应断言:判断响应内容是否包含指定的字符信息,用于判断api接口返回内容是否正确。
  • 响应时间断言:判断响应时间,是否超过预期的时间,用于判断api接口返回时间是否超过预期。

(1)断言添加方式:右击测试计划的http请求,选择添加-->断言-->加响应断言断言持续时间。 (2)配置响应断言:我们接口正常返回code值为20001,如果接口返回code值不是20001表示接口异 常,为了测试,这里修改为接口返回code值不为20001则表示访问失败。 image.png (3)配置断言响应时间:设置请求接口时间超过10毫秒,则认为请求失败。 image.png (4)验证断言配置:发起http请求,由于返回内容code值不为20001,以及访问时间超过10毫秒,所 以认为访问失败 image.png **5)配置结果监听: ** 配置监听器:监听压测结果【聚合报告和汇总结果很类似,看一个就行】

  1. **聚合报告:**查询结果信息聚合汇总,例如样本、平均值、通吐量、最大值、最小值...
  2. **察看结果树:**记录每一次压测请求
  3. 图像结果:分析了所有请求的平均值、中值、偏离值和通吐量之间的关系。
  4. 汇总结果:汇总压测结果
  5. 汇总图:将压测结果以图像形式展示 image.png **压测结果 ** 1)聚合报告: image.png
  • 样本(sample): 发送请求的总样本数量
  • 响应时间【单位ms】:
    • 平均值(average):平均的响应时间
    • 中位数(median): 中位数的响应时间,50%请求的响应时间
    • 90%百分位(90% Line): 90%的请求的响应时间,意思就是说90%的请求是<=1765ms返
    • 回,另外10%的请求是大于等于1765ms返回的。
    • 95%百分位(95% Line): 95%的请求的响应时间,95%的请求都落在1920ms之内返回的
    • 99%百分位(99% Line): 99%的请求的响应时间
    • 最小值(min):请求返回的最小时间,其中一个用时最短的请求
    • 最大值(max):请求返回的最大时间,其中一个用时最长的请求
  • 异常(error): 出现错误的百分比,错误率=错误的请求的数量/请求的总数
  • 吞吐量(throughout): 吞吐能力,在这里相当于TPS
  • Received KB/sec----每秒从服务器端接收到的响应数据量
  • Sent KB/sec----每秒从客户端发送的请求的数量

**2)察看结果树: ** 记录了样本中的每一次请求 image.png **3)汇总图与图形结果 ** 参考意义不大,且见文知意,所以略! 图形结果:分析了所有请求的平均值、终止、偏离值和通吐量之间的关系 横坐标:为请求数量,单位个数 纵坐标:响应时间,单位ms 4)汇总报告【类似于聚合报告】 image.png

  • 样本(sample): 发送请求的总样本数量
  • 响应时间【单位ms】:
    • 平均值(average):平均的响应时间
    • 最小值(min):请求返回的最小时间,其中一个用时最少的请求
    • 最大值(max):请求返回的最大时间,其中一个用时最大的请求
    • 标准偏差:度量响应时间分布的分散程度的标准,衡量响应时间值偏离平均响应时间的程度。
    • 标准偏差越小,偏离越少,反之亦然。
  • 异常(error): 出现错误的百分比,错误率=错误的请求的数量/请求的总数
  • 吞吐量TPS(throughout): 吞吐能力,这个才是我们需要的并发数
  • 每秒接收 KB/sec----每秒从服务器端接收到的数据量
  • 每秒发送KB/sec----每秒从客户端发送的请求的数量
  • 平均字节数

此文章为4月Day20学习笔记,内容来源于极客时间《10 小时掌握 Java 进阶必备技术栈》