架构师训练营 - 学习总结 第 6 周

发布于: 8 小时前

性能测试:

是性能优化的前提和基础,也是性能优化结果的检查和度量标准。要注意主观视角和客观视角的区别。

主观视角指用户感受到的性能,涉及到产品设计的体验优化。客观视角指性能指标衡量的性能,通过软

件测试来量化。

网站性能的测试指标主要有:响应时间,并发数,吞吐量,性能计数器等。其中,性能计数器指单机性

能的一些数据指标,可通过top、iostat、vmstat等命令实时查看,线上需要设置报警阙值。

性能测试的工具有LoadRunner、JMeter等,具体可分为性能测试、负载测试、压力测试、稳定性测试

等。性能测试、负载测试、压力测试逐渐增加了对系统的压力,最终能得到各种重要曲线(系统资源-TPS;并发用户数-响应时间等等,一些重要指标类似hystrix的看板);稳定性测试是真实生产情况的模拟;全链路压测是完全的生产演练(需要完善的数据构造平台,数据隔离策略,最终形成全链路压测流量平台)。

Spark应用性能测试:

学习需要观察哪些性能指标:CPU利用率(用户、系统);内存利用率;任务执行耗时;网络吞吐量;

磁盘吞吐量等。如何做指标分析,发现性能与资源瓶颈点;架构与代码分析;架构与代码优化;性能测试,进入性能优化闭环。

学习性能分析方法,从硬件、操作系统、虚拟机、代码执行等多维度分析观察到的指标。

系统性能优化的分层思想:

从宏观到微观,分为:机房与骨干网络性能优化;服务器与硬件性能优化;操作系统性能优化;虚拟机

性能优化;基础组件性能优化;软件架构性能优化;软件代码性能优化。

1)机房与骨干网络性能优化 异地多活的多机房架构;专线网络与自主CDN建设;都基于就近访问原则,降低网络延时。

2)服务器与硬件性能优化 使用更优的CPU、磁盘、内存、网卡等。要分析应用服务的特点,例如ES搜索服务要超大内存;Spark计算需要大内存和高CPU;智能坐席的呼叫代理服务需要超大流量网卡等。

3)操作系统性能优化 例如netty服务和ES服务都需要调大文件句柄数。

4)虚拟机性能优化 根据应用的并发量和长短生命周期的内存占用特点,针对性地优化GC的暂停时间和吞吐量。

5)基础组件性能优化 版本升级并做好所有的兼容性测试、性能测试等。

6)软件架构性能优化 注意使用好三板斧:缓存、异步、集群。

7)软件代码性能优化 注意使用并发编程、资源复用、异步编程、数据结构,灵活使用好设计模式。

操作系统:

程序运行时架构:代码从磁盘加载到内存交给CPU去执行,注意JVM运行模型。

操作系统具有进程分时执行的机制,进程具有运行、就绪和阻塞状态。而服务器应用通常是单进程多线程。

CPU密集型程序,线程数=CPU核心数+1

IO密集型程序,线程数=CPU核心数*(1+IO等待时间/CPU执行时间)

注意 Java Web应用的多线程运行时视图,提供了自底向上的分析视角。

多线程共享堆中的对象并都有修改时,会存在线程安全问题。需要对临界区的代码加锁。但是锁会引起线程阻塞,严重的情况下会耗尽系统资源,最终导致系统崩溃。

保证高可用的方案:利用Hystrix等做限流降级,利用netty等异步IO,使用akka等actor模型。

锁:

CAS,系统原语,compare and set,各种atomic变量都实现了CAS功能,能实现自增等线程安全的原子操作。

Java通过CAS原语在对象头中修改mark word实现加锁。锁状态是从正常、偏向锁、轻量级锁、重量级锁按照实际争用情况逐渐升级的,这使得synchronize的效率得到了很大提升。

多CPU情况下的锁一般实现了缓存一致性协议,是一种乐观锁,允许多CPU并发修改,但是1个CPU提交后会使得其他CPU对该缓存行的本地Cache失效,要重新去主存获取最新的值。

公平锁是排队获取,非公平锁是获取时争用的;可重入锁使用了持有锁线程对应的计数器,具体可参考AQS的实现源码。

锁还有互斥锁、共享锁、读写锁等类型;悲观锁、乐观锁两种机制;分段锁,concurrenthashmap已不再使用,但rockmq对1个topic的多个consume queue的加锁使用了类似分段的概念。

文件与硬盘I/O:

MySQL使用B+树作为底层存储,HBase使用LSM树作为底层存储,导致了各自数据操作的特点大不相同。

一个擅长做OLTP,能定义各种索引查询;一个则擅长写多读少,查最近的数据效率更高,或者按列族去查。

文件由若干个块和一个文件控制块所组成,具体见Linux inode的数据结构。RAID 独立硬盘冗余阵列,有RAID 0,1,10,5,6等几种冗余形式。

分布式文件系统(HDFS)在系统架构上由NameNode和DataNode组成,DataNode上可存放自定义数量的副本数,并可做跨机架、跨机房的分布式部署,大大提升了可用性;NameNode可用zk做HA方案,提供了集群的元数据管理。

AKKA:

是异步并发分布式编程框架,运行在JVM之上,使用Java和Scala语言,方便与Spring等基础框架做集成。注意其通过message来流转消息,actor来负责执行message,对编程模式是一个很大的革新,系统设计中不要有同步阻塞的操作,要切分为不同的actor让它们异步流动起来。AKKA特别适合做各种状态信息的收集,作为Web编程框架仍然需要最佳实践。

发布于: 8 小时前 阅读数: 2
用户头像

铁血杰克

关注

还未添加个人签名 2017.12.18 加入

还未添加个人简介

评论

发布
暂无评论
架构师训练营 - 学习总结 第 6 周