😊你好,我是小航,一个正在变秃、变强的文艺倾年。
🔔本文讲解【简历优化】性能调优 — 基础概念篇,期待与你一同探索、学习、进步,一起卷起来叭!
概述
四个问题
我们为什么要做性能调优?
一款线上产品如果没有经过性能测试,那它就好比是一颗定时炸弹,你不知道它什么时候会出现问题,你也不清楚它能承受的极限在哪儿。
什么时候开始做?
(1)在项目开发初期,不需要在意性能优化,容易影响开发速度。
(2)在系统编码完成后,通过性能测试发现问题并优化。
(3)上线后根据实际运行情况动态调整,确保系统稳定性和性能表现。
哪些计算机资源会引起性能瓶颈?
(1)CPU:有的应用需要大量计算
,他们会长时间、不间断地占用 CPU 资源,导致其他资源无法争夺到 CPU 而响应缓慢,从而带来系统性能问题。例如,代码递归导致的无限循环,正则表达式引起的回溯,JVM 频繁的 FULL GC,以及多线程编程造成的大量上下文切换等,这些都有可能导致 CPU 资源繁忙。
(2)内存:Java 程序一般通过 JVM 对内存进行分配管理,主要是用 JVM 中的堆内存来存储 Java 创建的对象
。系统堆内存的读写速度非常快,所以基本不存在读写性能瓶颈。但是由于内存成本要比磁盘高,相比磁盘,内存的存储空间又非常有限。所以当内存空间被占满,对象无法回收时,就会导致内存溢出、内存泄露等问题。
(3)磁盘 I/O:磁盘相比内存来说,存储空间要大很多,但磁盘 I/O 读写的速度要比内存慢,虽然目前引入的 SSD 固态硬盘已经有所优化,但仍然无法与内存的读写速度相提并论。
(4)网络:带宽过低的话,对于传输数据比较大,或者是并发量比较大的系统,网络就很容易成为性能瓶颈。
(5)异常:Java 应用中,抛出异常需要构建异常栈,对异常进行捕获和处理,这个过程非常消耗系统性能。如果在高并发的情况下引发异常,持续地进行异常处理,那么系统的性能就会明显地受到影响。
(6)数据库:大部分系统都会用到数据库,而数据库的操作往往是涉及到磁盘 I/O 的读写
。大量的数据库读写操作,会导致磁盘 I/O 性能瓶颈,进而导致数据库操作的延迟性。
(7)锁竞争:在并发编程中,我们经常会需要多个线程,共享读写操作同一个资源,这个时候为了保持数据的原子性(即保证这个共享资源在一个线程写的时候,不被另一个线程修改),我们就会用到锁。锁的使用可能会带来上下文切换,从而给系统带来性能开销。JDK1.6 之后,Java 为了降低锁竞争带来的上下文切换,对 JVM 内部锁已经做了多次优化,例如,新增了偏向锁、自旋锁、轻量级锁、锁粗化、锁消除等
。
做性能调优参考的标准有哪些?
- 响应时间:数据库响应时间、服务端响应时间、网络响应时间、客户端响应时间。
- 吞吐量:自下而上分为磁盘吞吐量和网络吞吐量。
- 磁盘吞吐量:
- IOPS(Input/Output Per Second),即单位时间内系统能处理的 I/O 请求数量。
- 数据吞吐量,即单位时间内可以成功传输的数据量
- 网络吞吐量:网络传输时没有帧丢失的情况下,设备能够接受的最大数据速率。
- 磁盘吞吐量:
- 计算机资源分配使用率: CPU 占用率、内存使用率、磁盘 I/O、网络 I/O。
💡TPS、QPS的区别?
TPS(transaction per second)是单位时间内处理事务的数量。TPS代表一个事务的处理,可以包含了多次请求,代表一次用户操作到服务器返回结果。
QPS(query per second)是单位时间内请求的数量。QPS的一次请求代表一个接口的一次请求到服务器返回结果。
当一次用户操作只包含一个请求接口时,TPS和QPS没有区别。当用户的一次操作包含了多个服务请求时,这个时候TPS作为这次用户操作的性能指标就更具有代表性了。
测试-分析-调优
性能测试
常用的测试方法:
- 微基准性能测试可以精准定位到某个模块或者某个方法的性能问题,特别适合做一个功能模块或者一个方法在不同实现方式下的性能对比。例如,对比一个方法使用同步实现和非同步实现的性能。
- 宏基准性能测试是一个综合测试,需要考虑到测试环境、测试场景和测试目标。
对接口做微基准性能测试的工具:
sudo yum -y install httpd-tools
ab -n 请求次数 -c 并发数 访问地址
# 示例
ab -n 1000 -c 100 https://www.baidu.com/ 表示请求1000次中有100并发
参考性能指标:
- Requests per second:吞吐率,指某个并发用户数下单位时间内处理的请求数;
- Time per request:上面的是用户平均请求等待时间,指处理完成所有请求数所花费的时间 /(总请求数 / 并发用户数);
- Time per request:下面的是服务器平均请求处理时间,指处理完成所有请求数所花费的时间 / 总请求数;
- Percentage of the requests served within a certain time:每秒请求时间分布情况,指在整个请求中,每个请求的时间长度的分布情况,例如有 50% 的请求响应在 8ms 内,66% 的请求响应在 10ms 内,说明有 16% 的请求在 8ms~10ms 之间。
ab命令帮助:
ab 工具测试 post 接口:
ab -n 100 -c 10 -p 'post.txt' -T 'application/x-www-form-urlencoded' 'http://test.api.com/test/register'
post.txt 为存放 post 参数的文档,存储格式如下:
usernanme=test&password=test&sex=1
ab 工具测试 get 接口:
ab -c 10 -n 100 http://www.test.api.com/test/login?userName=test&password=test
Windows 下更推荐使用JMeter工具进行性能测试,JMeter 是 Apache 提供的一款功能性比较全的性能测试工具,同样可以在 Windows 和 Linux 环境下安装使用。JMeter 在 Windows 环境下使用了图形界面,可以通过图形界面来编写测试用例,具有易学和易操作的特点。
JMeter 不仅可以实现简单的并发性能测试,还可以实现复杂的宏基准测试。我们可以通过录制脚本的方式,在 JMeter 实现整个业务流程的测试。JMeter 也支持通过 csv 文件导入参数变量,实现用多样化的参数测试系统性能。
排查问题
计算机资源使用率 -> 容器 -> JVM -> 网络 -> 应用服务
制定调优
(1)应用层:代码、设计、算法
(2)系统层:操作系统、JVM、组件
(3)策略层:时间换空间、空间换时间。
兜底策略
(1)限流:对系统的入口设置最大访问限制。
(2)扩容:
- 智能化横向扩容:当访问量超过某一个阈值时,系统可以根据需求自动横向新增服务。
- 提前扩容:例如秒杀系统,因为横向扩容无法满足大量发生在瞬间的请求,即使成功了,抢购也结束了。
性能调优有哪些
编程性能调优、多线程性能调优、JVM 性能监测及调优、设计模式调优、数据库性能调优
📌 [ 笔者 ] 文艺倾年
📃 [ 更新 ] 2025.2.17
❌ [ 勘误 ] /* 暂无 */
📜 [ 参考 ] 《极客时间》刘超老师的课堂内容,用于后期复习回忆。