简介
优化策略
当应用程序需要解决一个性能问题时,不要尝试猜测如何修改代码来提升其性能。我们需要一组方法论和工具来定位出性能瓶颈在哪里,找出真正的问题所在。
一个好的优化策略可以从以下3个步骤开始:
1. 寻找外部环境的影响
往往性能问题会发生在实际环境中。用户会提醒软件的运行环境的特点,很多时候,性能问题可能是由于应用程序没有考虑到现实环境中用户数或数据量的不断增长的影响导致。
分析问题时,需要仔细辨别系统的运行环境的特点,结合问题现象和数据处理流程综合分析,从系统交互的角度上,对每个可能的节点进行逐一排错。
以下图的简单应用场景为例,用户访问Web服务器不流畅,这种情况如何去排查呢。我们可以从用户发起访问,到服务器响应并发送结果给用户的流程进行分段:
- 客户端
针对客户端,我们需要尝试回答下列问题:是否属于单用户访问异常?如果回答是,很可能是由于单台用户主机配置导致;如果回答否,可能是由于网络或服务器端原因导致。
- 网络
应用程序之间的物理连接也需要综合考虑:可能是应用程序服务器和其它企业内网中的服务器之间网络链接因为错误配置导致,或者网络带宽不足,导致大量丢包;或者防火墙对所有的TCP报文进行扫描导致速度下降等。
- 服务器端
服务器硬件处理能力不足,如CPU,内存,网络等,也会导致问题。
如果应用程序存在与其它应用程序之间的交互,那么首先要做检查瓶颈是否出现在这些交互上。例如:数据库服务器或LADP服务器可能带来额外的开销,并且使得速度比较慢。如果存在大量用户并发访问,也会导致系统性能的急剧下降。
如果对系统有一个比较全面的认识,对解决此类问题会很有帮助。
分析这类问题一个很好的方法论,就是鱼骨图,它是发现问题根本原因的方法,可以参考http://baike.sogou.com/v204053.htm。
2. 度量硬件性能
对于运行应用程序的服务器,我们需要度量CPU、内存、磁盘、网络运行情况。
例如,当内存不够用时,系统会启动页面交互,将内存中的数据交互到磁盘上,这种情况下导致性能的急剧下降。磁盘的使用也非常重要,如果应用程序存在I/O错误,尝试重复写入磁盘等,同样会导致性能的下降。
最好的方式是使用系统监控工具,监控服务器运行情况,在可能存在性能下降的情况下,及时发现并解决。
3. 编写测试程序并查找瓶颈
上述两布仍不能解决性能问题,只能对应用程序本身及代码进行剖析,找出瓶颈所在。但做相关工作前,应在测试程序上下功夫,使得性能测试能够自动化完成,而非不断的进行手工的测试。一个好的做法是在应用程序中专门编写测试模块,编写一系列针对优化的调用。这样就可以在优化应用程序的同时,测试实际优化的效果和跟踪优化进度。
关于如何剖析应用程序本身的性能问题,请参考其它系列文章。