性能|性能优化参考因素

172 阅读6分钟

瓶颈位置

导致系统瓶颈的计算资源如下所示:

image.png

主要有 CPU、内存、磁盘、网络、数据库等。

硬件

  • CPU(中央处理器) 就像计算机的大脑。它处理各种任务,但有些任务需要更多的计算能力,比如视频分析、科学计算和3D渲染。这些任务会争夺CPU的资源,可能导致计算机变慢。
  • 内存就像计算机的临时存储空间。如果内存不够大,计算机就无法同时处理太多的信息。类似于我们的书桌上有限的空间,只能放一些重要的东西,其他东西得放在书架上,需要的时候再拿出来。这样可能会影响计算机的速度。
  • 网络是计算机之间传输数据的方式,就像我们通过书信或电话与朋友交流。但是网络的速度可能会比计算机内部的读写速度慢,这意味着如果我们需要从网络上获取数据,可能会花费更多的时间。
  • 硬盘是计算机的长期存储空间,类似于我们的书柜。但是读写硬盘的速度比内存慢得多,就像我们找到特定的书需要在书柜上翻找一样。如果我们需要频繁地读写硬盘,就会拖慢整个计算机的速度。

应用程序

  • 锁竞争是指同时有很多任务想要使用同一个资源,就像很多人想要使用同一台电脑。这会导致资源被不停地切换使用,浪费了很多时间和计算能力。
  • 数据库是计算机中存储大量数据的地方,就像一个超级大的文件柜。但是处理大量数据可能需要一些时间,就像我们在文件柜中找到特定文件需要花费一些时间一样。
  • 异常是计算机中出现的问题,就像我们在学习时遇到的困难一样。如果我们频繁地遇到问题并且花费很多时间来解决,就会影响计算机的表现。

衡量指标

我们只看应用程序的性能指标,那么一般来说,程序的性能大体可以通过以下几个方面来衡量:

时间

  • 响应时间:系统对用户行为或者事件做出响应的时间。可以采用异步处理方式,让用户能够尽快收到回执,这样用户体验会较好。
  • 启动时间:应用系统从运行到可以正常处理业务所需要花费的时间。可以采用异步加载数据的方式启动应用程序,避免等待所有数据加载完毕后才启动。
  • 执行时间:一段代码从开始运行到运行结束,所使用的时间称为执行时间。可以通过把业务逻辑切分到多段连续的程序段中,让用户感觉执行时间减短了。

资源分配

计算资源,包括CPU、内存、磁盘等,如果其中的任何一项分配不合理,整个系统始终处于计算资源紧张的情况下,对于整个系统的性能影响一定是毁灭性的。

  • 内存分配:内存分配是否合理,是否过多地消耗内存或者存在泄漏,JVM性能也与内存分配有一定关系。
  • 磁盘吞吐量:描述I/O的使用情况。
    • IOPS(Input/Output Per Second)是指单位时间内系统能处理的I/O请求数量,I/O请求通常为读或写数据操作请求。随机读写频繁的应用,如OLTP(Online Transaction Processing),IOPS是关键衡量指标。
    • 数据吞吐量(Throughput),指单位时间内可以成功传输的数据数量。对于大量顺序读写的应用,如VOD(Video On Demand),则更关注吞吐量指标。
  • 网络吞吐量:描述网络的使用情况。网络中的数据由一个个数据包组成,防火墙对每个数据包的处理要耗费资源。吞吐量是指在没有帧丢失的情况下,设备能够接受的最大速率。
  • 负载承受能力:当系统压力上升时,系统的执行速度、响应时间的上升曲线是否平缓。

优化策略

简化代码:需要我们非常了解编程语言和常用的语言自带资源库,比如JAVA 语言同步问题,如果单纯采用同步锁(Synchro nized)的方式,代码确实很少,但是实际的性能并不好,当大量线程同时访问代码块时,它会生成大量的锁,导致系统内部代码块互相等待。所以,我们还是要有一定技术基础之后才能做到代码上的简化。

用空间换时间:通过采用把计算的过程一步一步地保存或者缓存等方式,避免重复计算的发生。具体的方式可以采用数据缓冲、CDN、从CPU L1/L2/RAM到硬盘等。类似的策略还表现为诸如冗余数据,比如数据镜像、负载均衡等。

用时间换空间:比如网络传输,如果有一些压缩数据的算法,例如Huffman编码压缩算法,该算法本身运行过程其实很耗时,但是因为整体来看性能瓶颈在网络传输部分,所以用时间来换空间反而能省时间。

并行处理:该策略属于一种综合性策略,它可以让计算机更高效地处理多个任务。如果计算机有多个处理核心,我们可以同时运行多个进程或线程,这样可以提高计算速度。然而,如果计算机只有一个核心,使用多进程或多线程的方式可能会导致性能下降,因为操作系统需要花费大量的开销来调度和切换任务。在选择使用多核CPU时,我们需要考虑具体的应用需求,并进行大量测试,以确定最佳的处理方式。

有时候,我们可能需要单核性能强大的CPU,并利用资源隔离技术将计算资源划分到不同的区域,以实现更多的并行处理。这涉及到系统架构、内存共享策略、任务调度等多个因素。要实现并行处理,我们的程序需要具备扩展性,无法扩展的程序无法进行并行处理。

总结

image.png

综上所述,20%的系统设计或程序代码消耗了80%的系统性能。如果我们可找到那20%的缺陷设计或者劣质代码,那么我们就以可以较为容易地优化、解决80%的性能问题。