架构师训练营第 0 期第 7 周学习总结
0、本周学习的主要内容
架构师掌握系统的设计能力(面向对象,分层),解决高并发场景的能力(MQ、缓存、数据分片),还需要了解系统的瓶颈在哪里,以及通过找到系统性能瓶颈,要知道相应的性能优化方法。
本周的学习内容:
性能测试,包括性能测试的指标和方法;
性能优化,包括性能优化的原则、方法和层次思想;
在操作系统方面,主要内容有 进程与线程的说明、线程各种锁的介绍、文件IO及HDFS大文件存储;
最后就是分布式编程框架Akka,通过Actor模型的编程思想,如何实现真正的异步编程;
1、性能测试
【性能测试】是【性能优化】的【前提】,也是【性能优化】结果的检查和【度量标准】,通过性能测试,不仅是发现系统需要优化的点在哪里,并且也是优化后究竟有没有解决问题的验证手段。
不同视角下,有不同的性能优化手段:
主观视角:用户感受到的性能,比如用户觉得与竞对的产品比,系统打开页面较慢,首先需要了解清楚慢的地方,找到问题进行优化;
客观视角:性能指标是真实反映系统真实运行状态的数据,这些指标包括 响应时间、并发数、吞吐量等;
所以,对于性能优化,要了解用户体验,为什么用户会觉得系统很慢?慢的地方在哪儿?用户感觉慢是表面现象,通过表面现象找到【实际的问题】才是关键;只有发现问题,才能明确决绝问题的方法,而不是一上来就用各种技术;课上多次提到的,问题是什么最重要;技术是手段,而不是答案,性能是由数据表现;
要先了解问题,通过找到问题,明确解决问题的思路,并且要知道解决问题方法过程中会遇到哪些困难;
总结:
没有性能测试,就不要进行性能优化;
要先找到瓶颈在哪里;
通过性能测试,找到响应时间,特别是每个点的调用时间,包括数据库、方法、服务、缓存的调用时间;
2、软件性能优化
2-1、软件性能优化基本原则
不能优化一个没有性能测试的软件;
不能优化一个不了解的软件;
2-2、性能优化方法
性能优化,不是盲目的堆积最新的技术,而是需要一套合理的方法进行指导;
软件性能优化的方法:
首先,必须通过【性能测试】,找到系统的【性能指标(响应时间、并发数、吞吐量、性能技术器)】,如果说一个系统有性能问题,就像一个人生病去医院看病,医生不会立马开药或者直接动手术,肯定是先要做各项检查,拿到检查结果后才好对症下药;
获得【性能指标】后,针对各项数据进行【指标分析】,发现软件性能与资源瓶颈点,这个过程非常重要,只有分析出性能瓶颈点,确定问题发生的位置;
找到问题发生的位置,在结合【架构与代码分析】,寻找性能与资源瓶颈的关键点;
接下来,才是对【架构或代码】进行优化,技术是解决性能瓶颈问题的,但是一项技术优化 会影响原本的软件架构,带来一系列复杂问题,要清楚知道面对的困难,找到困难点结合技术进行优化;
【优化】不是终点,优化完成后,需要再次进行【性能测试】,验证优化后的结果是否解决原本的问题,也通过【性能测试】,完成一个闭环。
2-3、性能优化的分层思想
性能优化不仅仅是从架构或者代码层面进行优化,而是有一套分层思想,分别是:
机房与骨干网络性能优化;
服务器与硬件性能优化;
操作系统性能优化;
虚拟机性能优化;
基础组件性能优化;
软件架构性能优化;
软件代码性能优化;
下面这张图形象的解释分层思想的优化逻辑:
物理服务器是软件运行的基础,服务器硬件性能决定IO数量、计算速度和存储;
而操作系统负责进程和硬件资源的管理,相当于进程和物理资源的过渡,决定进程对资源的有效利用;
一个进程单独占用内存和其他资源,与其他进程是隔离的,JVM进程的内存分配、垃圾收集器选择影响软件运行性能;Java应用的基础就是JVM,JVM帮助Java语言屏蔽了不同操作系统的区别,JVM负载管理类和对象的生命周期,每个线程栈管理;
如果开发的是一个普通Java应用,直接运行main方法就可以启动并执行,但是WEB应用(servlet)并不能直接运行在JVM上,需要一个【WEB容器】提供运行环境、端口访问和程序生命周期管理;一台服务器启动一个JVM进程,多个WEN容器(如Tomcat)共享这个JVM的内存;
一个应用程序的启动和关闭都依赖WEB容器管理,而一个WEB容器上可以同时运行多个WEB应用;
2-3-1、机房骨干网络性能优化
主要方法:
异地多活的多机房架构;
专线网络与自主CDN建设;
首先,用户或者系统发起一次请求,需要经过网络传输,在传输速度固定的情况下,用户到【机房】的距离越短,意味着请求到达服务器的耗时就越短,所以需要合理部署机房,采用就近原则,将用户请求发送到最近的机房,同样,公司内部各个系统间也是远程访问,交互比较频繁的系统,最好也部署在同一个机房,或者系统可以部署在多个机房,但是访问策略采用【同机房优先】的形式访问,以减少【跨机房访问】;
2-3-2、服务器与硬件性能优化
使用更优的CPU、磁盘、内存、网卡,对软件的性能优化可能是数量级的,有时候远远超过代码和架构的性能优化;
系统都是运行在【服务器】上,服务器的【硬件资源】决定处理请求速度快慢和数量,比如一个2C4G的服务器最多只能处理100个请求,而4C8G的处理器可以同时处理400个请求;所以服务器资源的升级,在某种程度上是【快速解决】系统性能问题的方法;
2-3-3、操作系统性能优化
一些默认操作系统参数或者版本间的差异,对处理应用的性能影响较大,这里需要对操作系统本身非常熟悉,并且要有较好的工具,帮助我们分析瓶颈;
2-3-4、虚拟机性能优化
对于Java、Scale、Groovy语言开发的系统,程序都是运行在JVM上,这些语言是依靠JVM自身的垃圾收集器(GC)进行对象回收,在GC进行时必须停顿所有的【Java执行线程】(SUN称为 Stop The World),选择最合适的垃圾收集器,对性能的影响较大;m
对于用户体验要求交高的系统,要求请求的【响应时间】越短越好,那这时就要选择【停顿时间短】的垃圾收集器,比如 ParNew、CMS,因为ParNew是多线程的新生代收集器,可以快速执行垃圾回收,而CMS收集器将耗时最长的【标记】和【清除】过程【并发】的与用户线程一起执行,对用户线程影响较小;
而对于高吞吐量的应用,对CPU时间高效利用要求较高,可以选择Parallel Scavenge收集器进行垃圾回收;
垃圾收集器的回收,在于虚拟机的运行模式(Client模式还是Server模式),还有服务器的CPU数量(单核或多核)有关,这些都是选择GC需要考虑的,对系统的性能提升有较大帮助;
2-3-5、基础组件性能优化
软件程序的【基础组件】,包括WEB容器,数据库中间件等,不同【基础组件】因为版本不同,对性能进行不同程度的优化,基础组件性能的好坏也决定了软件程序的性能;
2-3-6、软件架构性能优化
在硬件资源较好或已经达到资源上限,操作系统、虚拟机和基础组件都已经调优到最佳性能后,如果还需要提升软件的性能,就要从系统架构方法进行优化;
系统架构优化主要的方法:
缓存;
异步;
集群;
2-3-6-1、缓存
缓存主要优化读操作,特别是针对读占用比较多的业务;
缓存主要有以下优点:
从内存获取数据,减少响应时间;
减少数据库访问,降低对存储设备负载压力;
缓存结果对象,而不是原始数据,减少CPU计算;
2-3-6-2、异步
异步优化主要针对写操作,更准确的是对【耗时较长】的写操作;
异步的优点在于:
即时响应,带来更好的用户体验;
可以控制消费速度,减少系统负载压力;
2-3-6-3、集群
更多用户访问需要消耗更多的计算资源,单一服务器计算资源的增加时有限的,所以需要增加更多服务器。将多个服务器组成集群,共同对外服务,而用户不需要感知后台运行服务器的数量;
2-3-6、软件代码性能优化
很多时候,程序性能不好不是因为硬件资源或者架构设计不合理,仅仅就是因为代码太烂。
软件代码优化的方法有:
遵循面向对象的设计原则与设计模式编程;面向对象使软件可扩展,可复用,易于维护;
并发编程,多线程与锁;并发充分利用多核CPU,提升处理能力;
资源复用,线程池与数据库连接池;线程和数据库连接创建成本较高,使用池化技术对资源进行管理,减少资源重复创建成本,并且可以合理利用资源;
异步编程,生产者消费者;
根据场景选择合适的数据结构,如 数组、链表、hash表、树等;
2-3-7、性能优化总结
性能优化的方法,可以从【硬件】和【软件】角度考虑:
硬件方面,包括 机房与网络性能,服务器;
软件方面,包括 操作系统,虚拟机,基础组件,软件架构,软件代码;
版权声明: 本文为 InfoQ 作者【Arthur】的原创文章。
原文链接:【http://xie.infoq.cn/article/af9eb1ef5ff1392f85f842d0c】。未经作者许可,禁止转载。
评论