写点什么

架构师训练营第 0 期第 7 周学习总结

用户头像
Arthur
关注
发布于: 2020 年 07 月 22 日

0、本周学习的主要内容

架构师掌握系统的设计能力(面向对象,分层),解决高并发场景的能力(MQ、缓存、数据分片),还需要了解系统的瓶颈在哪里,以及通过找到系统性能瓶颈,要知道相应的性能优化方法。

本周的学习内容:

  • 性能测试,包括性能测试的指标和方法;

  • 性能优化,包括性能优化的原则、方法和层次思想;

  • 在操作系统方面,主要内容有 进程与线程的说明、线程各种锁的介绍、文件IO及HDFS大文件存储;

  • 最后就是分布式编程框架Akka,通过Actor模型的编程思想,如何实现真正的异步编程;



1、性能测试

【性能测试】是【性能优化】的【前提】,也是【性能优化】结果的检查和【度量标准】,通过性能测试,不仅是发现系统需要优化的点在哪里,并且也是优化后究竟有没有解决问题的验证手段。

不同视角下,有不同的性能优化手段:

  • 主观视角:用户感受到的性能,比如用户觉得与竞对的产品比,系统打开页面较慢,首先需要了解清楚慢的地方,找到问题进行优化;

  • 客观视角:性能指标是真实反映系统真实运行状态的数据,这些指标包括 响应时间、并发数、吞吐量等;



所以,对于性能优化,要了解用户体验,为什么用户会觉得系统很慢?慢的地方在哪儿?用户感觉慢是表面现象,通过表面现象找到【实际的问题】才是关键;只有发现问题,才能明确决绝问题的方法,而不是一上来就用各种技术;课上多次提到的,问题是什么最重要;技术是手段,而不是答案,性能是由数据表现;

要先了解问题,通过找到问题,明确解决问题的思路,并且要知道解决问题方法过程中会遇到哪些困难;



总结:

  • 没有性能测试,就不要进行性能优化;

  • 要先找到瓶颈在哪里;

  • 通过性能测试,找到响应时间,特别是每个点的调用时间,包括数据库、方法、服务、缓存的调用时间;



2、软件性能优化

2-1、软件性能优化基本原则

  • 不能优化一个没有性能测试的软件;

  • 不能优化一个不了解的软件;



2-2、性能优化方法

性能优化,不是盲目的堆积最新的技术,而是需要一套合理的方法进行指导;

软件性能优化的方法:

  1. 首先,必须通过【性能测试】,找到系统的【性能指标(响应时间、并发数、吞吐量、性能技术器)】,如果说一个系统有性能问题,就像一个人生病去医院看病,医生不会立马开药或者直接动手术,肯定是先要做各项检查,拿到检查结果后才好对症下药;

  2. 获得【性能指标】后,针对各项数据进行【指标分析】,发现软件性能与资源瓶颈点,这个过程非常重要,只有分析出性能瓶颈点,确定问题发生的位置;

  3. 找到问题发生的位置,在结合【架构与代码分析】,寻找性能与资源瓶颈的关键点;

  4. 接下来,才是对【架构或代码】进行优化,技术是解决性能瓶颈问题的,但是一项技术优化 会影响原本的软件架构,带来一系列复杂问题,要清楚知道面对的困难,找到困难点结合技术进行优化;

  5. 【优化】不是终点,优化完成后,需要再次进行【性能测试】,验证优化后的结果是否解决原本的问题,也通过【性能测试】,完成一个闭环。



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、性能优化总结

性能优化的方法,可以从【硬件】和【软件】角度考虑:

硬件方面,包括 机房与网络性能,服务器;

软件方面,包括 操作系统,虚拟机,基础组件,软件架构,软件代码;



发布于: 2020 年 07 月 22 日阅读数: 80
用户头像

Arthur

关注

还未添加个人签名 2018.08.31 加入

还未添加个人简介

评论

发布
暂无评论
架构师训练营第 0 期第 7 周学习总结