8.1 性能优化简介
参考资料: https://blog.csdn.net/qq_30353203/article/details/78271619
-
性能优化简介
-
性能优化是什么
- 性能优化就是发挥机器本来的性能
- 编写的新应用上线前在性能上无法满足需求,这个时候需要对系统进行性能调优
- 应用系统在线上运行后随着系统数据量的不断增长、访问量的不断上升,系统的响应速度通常越来越慢,不满足业务需要,这个时候也需要对系统进行性能调优
-
性能调优包括那些方面?
- 谈到系统或产品的性能调优,可以从广义和狭义两个范围来理解。
- 从广义的层面来看,就不仅限于程序内部了,
- 因为造成系统性能问题的瓶颈很可能来源于方方面面,而这种情况往往是性能调优很普遍的情况,
- 下面就从广义的范围细分成几个角度来进行阐述,见图广义性能调优鱼骨图
- 狭义的范畴来看
- 性能调优主要是指通过修改软件程序逻辑、结构等技术手段提升软件产品的各项性能指标,如响应时间等。本文重要是从狭义的范畴来看。
- 从狭义的范畴看,性能调优可以从 硬件(计算机体系机构)、操作系统(OS\JVM)、文件系统、网络通信、数据库系统、中间件、应用程序本身等方面入手。
- 这里主要关注JVM、中间件、应用程序的性能调优。
-
性能的几个唯度
- 执行时间:一段代码从开始运行到运行结束所使用的时间。
- CPU时间:(算法)函数或者线程占用CPU的时间。
- 命令查看vmstat
- http://www.man7.org/linux/man-pages/man8/vmstat.8.html
- 首先检查 cpu,cpu 使用率要提升而不是降低 CPU 空闲并不一定是没事做,也有可能是锁或者外部资源瓶颈。
- 命令 Top
- Memory内存分配:程序在运行时占用的内存空间。
- IO磁盘吞吐量:描述I/O的使用情况。
- Network网络吞吐量:描述网络的使用情况。
- 响应时间:系统对某用户行为或者动作做出响应的时间。响应时间越短,性能好。
- 术语
- 吞吐量:带宽(吞吐量):代表硬件持续处理能力。
- 平均响应时间 :延时(响应时间):表示硬件的突发处理能力;
- tps
- qps
-
性能优化步骤
-
性能调优步骤图,要优化的步骤
- 调优前首先要做的是衡量系统现状,这包括目前系统的请求次数、响应时间、资源消耗等信息,例如B系统目前95%的请求响应时间为1秒。
- 在有了系统现状后可设定调优目标,通常调优目标是根据用户所能接受的响应速度或系统所拥有的机器以及所支撑的用户量估算出来的,例如 设定调优目标:95%的请求要在500ms内返回。
- 在设定了调优目标后,需要做的是寻找性能瓶颈,这一步最重要的是找出造成目前系统性能不足的最大瓶颈点。找出后,可结合一些工具来找出造成瓶颈点的代码,到此才完成了这个步骤。
- 在找到了造成瓶颈点的代码后,开始进行性能调优。通常需要分析其需求或业务场景,然后结合一些优化的技巧确定优化的策略,优化策略或简或繁,选择其中收益比(优化后的预期效果/优化需要付出的代价)最高的优化方案,进行优化。
- 优化部署后,继续衡量系统的状况,如已达到目标,则可结束此次调优,如仍未达到目标,则要看是否产生了新的性能瓶颈。或可以考虑继续尝试上一步中制定的其他优化方案,直到达成调优目标或论证在目前的体系结构上无法达到调优目标为止。
-
性能调优思路
- 性能调优的步骤主要有:衡量系统现状、设定调优目标、寻找性能瓶颈、性能调优,验证是否达到调优目标。
- 寻找性能瓶颈 和 性能调整(优) 两个关键的阶段阶段,主要思路见下图:图-3 寻找性能瓶颈和性能调优项结构分解图
-
寻找性能瓶颈
- 怎样寻找性能瓶颈
- 寻找性能瓶颈分个两部分:寻找过度消耗资源的代码 和 寻找未充分使用资源但程序执行慢的原因和代码。
- 通常性能瓶颈的表象是资源消耗过多外部处理系统的性能不足;或者资源消耗不多但程序的响应速度却仍达不到要求。
- 这里资源主要是指:消耗在CPU、内存、文件IO、网络IO等方面资源。机器的资源是有限的,当某资源消耗过多时,通常会造成系统的响应速度慢。
- 外部处理系统的性能不足主要是指所调用的其他系统提供的功能(如数据库操作的响应速度不够);所调用的其他系统性能不足多数情况下也是资源消耗过多,但程序的性能不足造成的; 数据库操作性能不足通常可以根据数据库的sql执行速度、数据库机器的IOPS、数据库的Active Sessions等分析出来。
- 寻找未充分使用资源但程序执行慢的原因和代码:资源消耗不多、但程序的响应速度仍然达不到要求的主要原因是程序代码运行效率不够高、未充分使用资源或程序结构不合理。
- 对于Java应用而言,寻找性能瓶颈的方法通常为首先分析资源的消耗,然后结合OS和Java等一些分析工具来查找程序中造成资源消耗过多的代码。
- CPU消耗分析
- 在Linux中,CPU主要用于 中断、内核进程以及用户进程的任务处理,优先级为:中断 > 内核进程 > 用户进程,在学习如何分析CPU消耗状况前,有三个重要概念交代一下。
- 上下文切换、运行队列、利用率
- 上下文切换
- 每个CPU(或多核CPU中的每核CPU)在同一时间只能执行一个线程。 Linux采用的是抢占式调度:即为每个线程分配一定的执行时间,当到达执行时间、线程中有IO阻塞或高优先级线程要执行时,Linux将切换执行的线程,在切换时要存储目前程序的执行状态PCB(Program Control Block),并恢复要执行的线程的状态,这个过程就称为上下文切换
- 对于Java应用,典型的是在进行文件IO操作、网络IO操作、锁等待或线程Sleep时,当前线程会进入阻塞或休眠状态,从而触发上下文切换,上下文切换过多会造成内核占据较多的CPU使用,使得应用的响应速度下降。
- 运行队列
- 每个CPU核都维护了一个可运行的线程队列,例如一个4核的CPU, Java应用中启动了8个线程,且这8个线程都处于可运行状态,那么在分配平均的情况下每个CPU中的运行队列里就会有两个线程。通常而言,系统的load主要由CPU的运行队列来决定,假设以上状况维持了1分钟,那么这1分钟内系统的load就会是2,但由于load是个复杂的值,因此也不是绝对的,运行队列值越大,就意味着线程要消耗越长的时间才能执行完。 Linux System and NewWork Performance Monitoring中建议控制在每个CPU核上的运行队列为1-3个。
- 利用率
- CPU利用率为CPU在用户进程、内核进程、中断处理、IO等待以及空闲五个部分使用的百分比,这五个值是用来分析CPU消耗情况的关键指标。 Linux System and NewWork Performance Monitoring 中建议用户进程的CPU消耗/内核的CPU消耗的比例在 65%-70% / 30%-35%
- Linux观测CPU消耗状态的工具:perf、top、vmstat、pidstat、sar、pcpu、ps Hh -eo tid
- 工具 perf 性能测试工具
- sudo apt-get install linux-tools-common
- sudo apt-get install linux-tools-3.13.0-27-generic
- 工具top
- 用工具SSH登陆到Linux 上后,在字符界面下输入top命令后即可查看CPU的消耗情况,CPU的信息在TOP视图的上面几行中
- 内存消耗分析
- Java应用对于内存的使用包括两方面 JVM堆内存 和 JVM堆外内存。 Java应用对内存的消耗上主要是在JVM堆内存上。在正式环境中,多数Java应用都会将 -Xms 和 -Xmx设为相同的值,避免运行期要不断申请内存。
- 文件IO消耗分析
努力不一定成功,但不努力一定会失败~