来,性能调优请这样这样顺藤摸瓜!

如果你是做性能调优的,你一定知道最怕的不是性能差,而是费了半天劲却抠!错!地!方!了!这就好像你要去搬砖,却不知道要搬去哪儿,漫无目的东奔西撞,最后也只是徒费力气而已。那么影响性能的因素千千万,有没有一个纲领可以让同学们按图索骥顺藤摸瓜咧? 有的有的!!!《Performance Tuning: A Comprehensive Guide》的作者曾经梳理了影响性能的几个维度,具备一定的完整性,有同学给整理了来,极客君再进行一下梳理,各位新手老手可以自行索取参考。

该体系将影响性能的因素分了三大类:(注:这里谈到的性能是一种统称, 包含响应时间/延迟latency, 吞吐量throughput等, 暂时不涉及压力测试负载测试等。)

算法本身;

算法运行环境与所需资源;

算法和环境资源的交互。

这三类基本囊括了所有影响因素。下面我们来看一下各项下具体的优化细节:

算法本身的优化

这通常是同学们一头扎进去就开始局部优化的地方。常用的手段包括使用各种 Profiler 来度量 CPU 时间, 内存占用率,函数调用次数以进行问题定位,然后实施各种调优方法,比如优化循环,空间换时间等。

选择合适的数据结构自然算作此类优化,不同存储模型等较大规模的优化也归为此类,比如使用 Document 代替关系型存储等。

这个方向的优化可以很快的帮助我们消除一些明显的编程细节引起的瓶颈,其缺点是过了初期突飞猛进的阶段后,每获得一点改善,都需要付出巨大的智力上的努力,到后期通常就事倍功半得不偿失了。不过没关系,我们还有另外的武器!

运行环境与资源的优化

运行环境与资源包括各种软硬件平台:操作系统,数据库,运行平台,CPU,内存,磁盘, 网络等等。 最简单、最省事的调优方法其实是优化硬件资源,使用快速计算资源代替慢速计算资源,提升资源计算能力:

更快的 CPU;

更快的本地 IO 设备:内存代替硬盘, SSD 代替机械硬盘, 增加内存减少分页;

更快的网络 IO 设备: 光纤及专线增加网络带宽, 万兆千兆网卡代替千兆百兆网卡。

快速计算资源代替慢速计算资源不局限于同类资源,比如快速存储代替慢速存储。 跨类型的资源优化也有很好的例子,比如本地计算换网络传输:压缩传输内容是一种常见的性能优化,增加 CPU 压缩解压缩时间,但可减少大量网络传输时间。

而运行平台的软件部分,比如操作系统,数据库,中间件等,调优的成本相对要高一些,并且有可能工作量大到不可接受,比如从 Windows 平台迁移到 Linux 平台,从数据库 A 切换到数据库 B,从 EJB 切换到 Spring...这些最好在初期就考虑好。

总的来说,这类调优见效快,但受制于预算及硬件本身的限制。 通常很快会在榨取最后一点计算资源后遇到瓶颈。 但是别着急,我们还有武器!

算法和资源间交互的优化

交互的调优是当前各种调优实践最集中的领域,包括:减少单台服务器(或单位计算资源)的处理量、充分利用系统资源、减少不必要的计算、减少不必要的IO等。

1:减少单台服务器(或单位计算资源)的处理量:当单台机器处理能力已达上限的情况下,需要把压力分散到多台机器上,从而使每台机器都能获得可接受的延迟或吞吐量。总的原则是分而治之。分的维度包括业务,组件边界,访问频率或对系统资源的消耗程度,瓶颈资源等。

业务:把大应用按业务分成独立的互相合作的系统,高层一点的SOA,内层一点的数据库分库

组件边界:web 服务器,应用服务器,数据库服务器,文件服务器...

对系统资源的消耗程度:读写分离

瓶颈资源:分表分片

一旦按上述维度分好了,还可以在所有维度上应用负载均衡,把访问量分散到不同服务器。

2:充分利用系统资源:采用多进程、多线程、异步操作以及负载均衡等手段。其中负载均衡的作用是防止某台服务器过满或过闲。

3:减少不必要的计算次数:缓存计算结果,尤其是服务端缓存,减少计算次数。

4:减少不必要的 IO 次数:

网络 IO 次数:客户端缓存、CDN 缓存、合并资源以减少请求次数。

磁盘 IO 次数:缓存常用数据, 如利用Reids,Memcached进行缓存。

同学们或许已经注意到了,缓存是减少不必要计算和IO的重要手段哦。

以上所有优化手段可单独使用,也可组合出拳,具体问题具体分析。怎么样,是不是一下子感觉有据可查有的放矢了呢?同学们下次可不要乱搬砖哦!

你可能感兴趣的:(来,性能调优请这样这样顺藤摸瓜!)