改善性能意味着用更少的资源做更多的事情。为了利用并发来提高系统性能,我们需要更有效的利用现有的处理器资源,这意味着我们期望使CPU尽可能出于忙碌状态(当然,并不是让CPU周期出来应付无用计算,而是让CPU做有用的事情而忙)。如果程序受限于当前的CPU计算能力,那么我们通过增加更多的处理器或者通过集群就能提高总的性能总的来说,性能提高,需要且仅需要解决当前的受限资源,当前受限资源可能是:
- CPU:如果当前CPU已经能够接近100%的利用率,并且代码业务逻辑无法再简化,那么说明该系统的性能以及达到上线,只有通过增加处理器来提高性能
- 其他资源:比如连接数等。可以修改代码,尽量利用CPU,可以获得极大的性能提升
如果你的系统有如下的特点,说明系统存在性能瓶颈:
随着系统逐步增加压力,CPU使用率无法趋近100%(如下图)
持续运行缓慢。时常发现应用程序运行缓慢。通过改变环境因子(负载,连接数等)也无法有效提升整体响应时间
- 系统性能随时间的增加逐渐下降。在负载稳定的情况下,系统运行时间越长速度越慢。可能是由于超出某个阈值范围,系统运行频繁出错从而导致系统死锁或崩溃
- 系统性能随负载的增加而逐渐下降。
一个好的程序,应该是能够充分利用CPU的。如果一个程序在单CPU的机器上无论多大压力都不能使CPU使用率接近100%,说明这个程序设计有问题。一个系统的性能瓶颈分析过程大致如下:
- 先进性单流程的性能瓶颈分析,受限让单流程的性能达到最优。
- 进行整体性能瓶颈分析。因为单流程性能最优,不一定整个系统性能最优。在多线程场合下,锁争用㩐给也会导致性能下降。
高性能在不同的应用场合下,有不同的含义:
- 有的场合高性能意味着用户速度的体验,如界面操作等
- 有的场合,高吞吐量意味着高性能,如短信或者彩信,系统更看重吞吐量,而对每一个消息的处理时间不敏感
- 有的场合,是二者的结合
性能调优的终极目标是:系统的CPU利用率接近100%,如果CPU没有被充分利用,那么有如下几个可能:
- 施加的压力不足
- 系统存在瓶颈
1常见的性能瓶颈
1.1由于不恰当的同步导致的资源争用
1.1.1不相关的两个函数,公用了一个锁,或者不同的共享变量共用了同一个锁,无谓地制造出了资源争用
下面是一种常见的错误
class