性能优化-后端性能优化概要(week7-8)
现在的软件或系统,性能都异常关键。无论任何软件或网站,都怕一个字“慢”。那么作为开发人员,如何变“慢”为“快”,如何做性能优化?
性能测试--准确测定并量化“慢”
用户说系统慢、网站慢,往往都是一种主观感受。开发人员应该能通过测试来量化一些性能指标,说明系统如何慢,然后再考虑如何改进。
一个网络系统,常用的性能指标有以下几个:
- 响应时间:指应用系统从发出请求开始到收到最后响应数据所需要的时间。响应时间是系统最重要的性能指标,直观的反映了系统的“快慢” 。
- 并发数:系统能够同时处理请求的数目,这个数字也反映了系统的负载特性。对于网站而言,并发数即系统并发用户数,指同时提交请求的用户数目(而非同时在线用户数)。
- 吞吐量:指单位时间内系统处理的请求的数量,体现件系统的处理能力。对于网站,可以用“事务数/秒(TPS)”或是“请求数/秒(HPS)”来衡量 。
- 服务器端的一些性能计数器如CPU、内存、硬盘、网络IO、线程数等等。
为得到一个系统的上面这些性能指标,尤其是在一些极端情况下这些性能指标,我们通常可以采用如下测试方法:
- 性能测试:以系统设计初期规划的性能指标为预期目标,对系统不断施加压力,验证系统在资源可接受范围内,是否能达到性能预期。
- 负载测试:对系统不断地增加并发请求以增加系统压力,直到系统的某项或多项性能指标达到安全临界值,如某种资源已经呈饱和状态。
- 压力测试:超过安全负载的情况下,对系统继续施加压力,直到系统崩溃或不能再处理任何请求,以此获得系统最大压力承受能力。
优化方法--对症开药方
有了测试结果后,我们就知道了优化的方向和目标。但是具体怎样做优化,我们应当遵循一个分层的优化思想,而不是一上来就改架构、改代码。这个分层的思想是指,我们可以从不同的层面上去考虑如何优化。
- 机房与骨干网络性能优化
- 服务器与硬件性能优化(CPU, disk, memory, 网卡...)
- 操作系统性能优化
- 虚拟机性能优化
- 基础组件性能优化
- 软件架构性能优化 三板斧(缓存\异步\集群)
- 软件代码性能优化
-
- 并发编程,多线程与锁
- 资源复用,线程池对象池
- 异步编程,生产者消费者
- 数据结构,树,Hash表
在第1、2层面上的优化,有时是最粗暴但有效。只要确定性能是与硬件相关,往往硬件的优化最直接、最省力。
在第3、4、5层面上进行优化,我们需要较为深入的理解操作系统、虚拟机和一些基础组件的细节与实现,这对开发人员提出了相对较高的要求。
在第6、7层面上的优化,是一般开发人员较为熟悉的优化策略。
操作系统--理解底层可能引起慢的原因
我们所有的程序最终都是在操作系统上运行的,现在的操作系统也都是多任务分时处理。在这个层面上影响性能的有两个主要方面:
- 锁。锁主要用来控制多线程访问共享资源,确保共享资源(比如内存)在某一时刻或某一段时间内只被一个线程访问。锁会引起线程阻塞、系统变慢。并且由于被阻塞的线程不会释放资源,进而会导致资源耗尽高并发系统崩溃。
- 慢速设备,如磁盘文件、网络IO等。这里要了解文件是如何在硬盘上存储的,如B+树、LSM树等,还有RAID、HDFS(分布式文件系统)等。
数据结构与算法--优化软件系统的基础
尼古拉斯· 沃思教授在编程界提出过一个著名的公式:
程序 = 数据结构 + 算法
这个公式生动说明了数据结构和算法之于软件的重要性。现在很多编程语言都实现了常用的数据结构,比如数组、链表、Hash表、栈、队列、树等,但是了解这些数据结构背后的实现,可以很好帮助你找出代码中可以优化的地方。比如hash表的查询复杂度为什么是O(1),红黑树为什么增删效率高而平衡二叉树查找效率高等。
算法是解决问题的具体方法,它的复杂度直接影响软件的性能。一个问题最直观的解决方法如穷举法,往往在性能上表现都不太好。这时应该进一步挖掘有没有O(n*log(n))甚至O(n)的算法,比如快速排序、比如用空间换取时间等等。还需要进一步了解像贪心算法、动态规划等去解决一些更复杂的问题。
总结
性能优化是一个很大并且很重要的话题。从通过测试确定性能指标及其瓶颈,然后我们可以从不同层面上进行优化。优化的原则是有客观具体的性能指标目标,然后从底层硬件到高层应用寻找合适优化方式。
------------------------------------------------------------------- 第七、八周学习内容思维导图 ---------------------------------------------------------------------