架构师训练营第七周总结

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

响应时间,并发数,吞吐量(TPS_每秒吞吐量),性能测试和优化标准三要素 



性能测试 --以系统性能初期规划的性能指标为预期目标,对系统不断实施压力,验证系统在资源可接受范围内,是否能达到性能预期。也就是在开始时,给系统增加并发量来测试吞吐量和响应时间

负载测试 -- 在性能测试后,也就是达到系统最佳性能点后,对系统不断增加并发数,知道系统吞吐量达到最高点,然后继续增加并发量测试,使得并发量下降。

压力测试 -- 超过安全负载的时候,对系统持续施压,直到并发数增加到某个点,同时吞吐量下降到某个点,系统发生了崩溃。不能正常运行了。这个时候压力测试结束



系统最佳性能点 : 就是随着并发的增加,响应数开始由平稳变为增长的时候。也就是b点







性能优化 : 主观优化,客观优化



基本原则: 不能优化没有测试的软件;不能优化一个不了解的软件。



了解一个系统,要测试系统性能

性能测试主要指标:

响应时间:完成一次任务花费的时间

并发数:同时处理的任务数

吞吐量:单位时间内完成的任务数

性能计数器:system load,线程数,进程数,cpu,内存,磁盘,网络使用率



JOB,state ,任务



性能优化一般方法:

性能测试,获得性能指标  -- 响应时间,吞吐,并发,cpu,磁盘,网络,内存

指标分析,发现性能与资源瓶颈点  -- 响应时间何时变慢,系统资源发生了什么样的变化,分析是什么样的操作产生了这样的情况

架构与代码分析,寻找性能与资源瓶颈关键所在  -- 找到关键点,思考如何优化关键点

架构与代码优化,优化关键技术点,平衡资源利用  -- 系统架构与性能有关,分部署服务器增加,用于增加处理能力,分摊负载压力。在高并发的情况下处理更多的用户请求,哪些是数据点访问的压力点大,还是用户请求计算的压力大,cpu,磁盘,内存,数据库哪个不足,对对应的点或代码进行优化,平衡资源利用

性能测试,进入性能优化闭环 -- 



了解问题要比掌握技术关键!!!



系统性能优化的分层思想

机房与骨干网络

服务器与硬件性能优化 --- 垂直伸缩

操作系统性能优化

虚拟机性能优化 -- 垃圾回收,即使编译,锁 对性能的影响

基础组件性能优化 -- tomcat spring mvc ,使用的组件对性能的影响

软件架构性能优化 -- 使用了分布式系统,分布式缓冲,异步消息队列

软件代码性能优化



软件架构性能优化三板斧

缓存  -- 缓存是优化读性能,而且是热点数据

从内存读取数据,减少响应时间,减少数据库访问,缓存结果对象,非原始数据,



异步 -- 优化写操作

即时响应,更好的用户体验,控制消费速度,合适的负载压力



集群

使很多台服务器对使用者而言看起来像一台服务器。



软件代码性能优化

遵循面向对象的涉及原则与设计模式编程

并发编程,多线程与锁

资源复用,线性池与对象池

异步编程,生产者与消费者

数据结构,数组,链表,hash表,树



程序代码 -->内存(成为进程)-- CPU执行

进程是有生命的

包含:可执行代码,退内存空间,占内存空间,进程数据结构



操作系统多任务运行环境

CPU核心数有限,通过分时执行进程,多个进程抢时间片,实现并发

运行,就绪,阻塞(进程等待I/O而暂停,即使把CPU分配给进程也无法运行)



因不同进程轮流在CPU上执行,每次都在进程间切换CPU,代价巨大,导致单进程多线程出现

进程从操作系统获取内存空间,旗下所有线程共享进程的内存地址空间。且不和其他进程共享。

进程的堆空间线程可以共享,线程的堆空间不能共享 -- 堆空间先进后出(堆空间中使用进程,对象,实例) ,栈空间先进先出(执行上下文,局部变量,用完后即垃圾处理)



线程:自己的堆栈,通过线程栈空间使得线程并发执行,互相不会影响

线程栈遵循先进后出



代码在进程空间中,所有线程共享进程中的代码,线程获得生命周期并执行代码。所有的线程并发执行同样的代码。

方法都放在线程的堆栈空间中,

线程处于运行期的时候,操作系统会为每个(函数)方法建立一个栈桢(方法进出堆栈的标识)。



线程一定是在栈顶执行。



内存溢出:栈太小了;递归调用,没有退出函数,持续在栈顶调用自己,最后溢出。



架构师面试:1、编程知识,设计方法,设计原则;2、分布式架构方法架构知识;3、操作系统,文件系统,数据结构,网络通信,数据库,虚拟机



方法内的x++永远不会有安全问题,加锁问题,没有线程冲突。



tomcat容器(脚本或批处理文件)启动war包应用(java进程,JVM进程):用java启动bootstrap,参数是“$@” start,然后执行tomcat指定的方法即 min函数,类中一定有min方法,



tomact 启动,再启动JVM,初始化虚拟机内部结构,创建主线程,主线程开始执行,执行tomcat指定入口类中的min函数,即执行入口中的args(min函数)

min中启动一系列线程,tomcat监听8080端口等待用户命令,用户http到达,tomcat创建socket通信套接字,分配一个空线程监听soctet,用户请求来了,线程就绪,读其中的用户字节流,构造request对象(tcp包解析),如果剩下的tcp包还不来,当前进程就阻塞等待以便解析tcp包。完整解析http协议后,构建request对象,交给war包中的serverlet执行,serverlet又要调用微服务http调用,访问数据库tcp网络通信等,等响应,没有响应,这也会有阻塞。线程完成后,出栈,serverlet的读get方法,resopnce.write结果写到sockte中去,释放线程。



new出来的对象放在堆空间中,栈里放的是对象中局部变量的引用地址,多个线程修改对象信息的时候,这几个线程就会发生冲突。 -- 有点绕



解决线程安全方法:在临界区给代码加锁,只有获得锁的线程才能执行临界区代码



避免阻塞引起的崩溃:限流:控制进入计算机的请求数;降级:关闭部分功能程序的执行;反应式:异步,无临界区。



CAS(V,E,N)

V表示要更新的变量,E表示预期值,N表示新值



偏向锁,轻量级锁,重量级锁

总线锁,缓存锁

公平锁,非公平锁

独享锁/互斥锁 共享锁 读写锁

乐观锁 悲观锁

分段锁

自旋锁



文件与硬盘I/O

LSM树

linux lnode文件控制块 

RAID独立硬盘冗余阵列





用户头像

跨域刀

关注

还未添加个人签名 2020.03.18 加入

还未添加个人简介

评论

发布
暂无评论
架构师训练营第七周总结