写点什么

Week7 学习总结

用户头像
wyzwlj
关注
发布于: 2020 年 07 月 19 日

一、性能测试

1、是什么

    1)检查和度量系统的性能,是性能优化的前提和基础

    2)性能分为:用户感受到的性能--主观视角、性能指标衡量的性能--客观性能

    3)性能优化并不是一定要提升系统的性能指标,也可以考虑提升用户的体验

2、为什么

    分析系统的各项性能指标,寻找系统的性能问题,以此为基础,优化系统的性能

3、怎么做性能测试

    1)性能测试的三个目标

        a. 判断系统能否到达性能预期--性能测试

        b. 判断系统的安全临界值--负载测试

        c. 判断系统的崩溃点--压力测试

        -->正常情况下,应保证系统在 预期性能点之下、或 预期性能点和安全点之间 运行

    2)稳定性测试

        a. 在特定的硬件、软件、网络环境条件下,为系统设置一定的负载压力,并进行长时间的运行测试,以检测系统的稳定性

        b. 为了模拟真实环境,测试时应不均匀的对系统施加压力

    3)系统的性能曲线

        a. TPS与并发数的关系



        b. 响应时间与并发数的关系



二、性能测试指标

1、响应时间

    完成一次任务花费的时间

2、并发数

    同时处理的任务数

3、吞吐量

    a. 单位时间完成的任务数

    b. TPS:每秒事务数,事务指范事务,表明一个处理任务

    c. QPS:每秒查询数

    ->TPS&QPS的关系:TPS包含QPSS,比如访问一个页面,包含很多样式、JS和AJAX请求,这算一个TPS,但是是N个QP

    ->响应时间&并发数&吞吐量的关系:吞吐量=(1000/响应时间ms)* 并发数

4、性能计数器

    描述服务器 or 操作系统性能的 一些数据指标

    1)System Load

        a. 大于CPU核数:表明有任务在等待,CPU过载

        b. 等于CPU核数:没有任务在等待,且每个CPU都在执行任务

        c. 小于CPU核数:没有任务在等待,但是有CPU空闲

    2)线程数

    3)进程数

    4)CPU

    5)内存

    6)磁盘

    7)网络使用率

三、性能优化

1、优化的原则

    1)不能优化一个没有测试的软件

    2)不能优化一个你不了解的软件

2、优化的一般方法

    1)性能测试,获得性能指标

    2)指标分析,发现性能与资源瓶颈

    3)架构与代码分析,寻找性能与资源瓶颈关键所在

    4)架构与代码优化,优化关键技术点,平衡资源利用

    5)性能测试,进入性能优化闭环

3、分层优化的思想

    1)优化机房与骨干网络性能

        a. 异地多活的多机房架构

        b. 专线网络

        c. 自主CDN建设

    2)优化服务器与硬件性能

        a. 使用更优的CPU、磁盘、内存、网卡

    3)优化操作系统性能

        a. Linux性能优化

    4)优化虚拟机性能

        a. JVM性能优化:垃圾回收、空间分配

    5)优化基础组件性能

        a. MySQL升级

        b. Web容器升级或替换

        c. 负载均衡软件升级,eg. 使用nginx

    6)优化软件架构性能

        a. 三板斧

        b. 缓存

            ->从内存直接获取数据,减少数据库访问,降低存储设备的负载压力

            ->缓存结果对象,而不是原始数据,减少CPU计算

            ->主要优化的是读操作

        c. 异步

            ->即时响应,更好的用户体验

            ->控制消费速度,保持合适的负载压力

            ->主要优化写操作

        d. 集群

            ->多台机器作为一个统一的对象,对外提供服务

    7)优化代码性能

        a. 遵循面向对象的设计原则&设计模式,好的代码才能便于优化

        b. 并发编程,多线程与锁

        c. 资源复用,线程池与对象池

        d. 异步编程,生产者&消费者

        e. 数据结构:数组、链表、hash表、树

四、程序运行时架构

1、整体结构

2、 进程&线程

    1)进程运行期状态

        a. 运行

        b. 就绪

        c. 阻塞

    2)多线程进程模型

    3)线程栈

        a. 堆空间&栈空间

        b. 栈帧结构、方法栈

        c. 一次函数调用对应一个方法栈帧的入栈和出栈

3、线程安全问题

    1)是什么:多个线程同时修改堆内存数据,导致的数据不一致问题

    2)如何解决: 临界区&锁

    3)使用锁引发的新问题:线程阻塞导致的高并发系统的崩溃,大量线程被阻塞导致无法释放资源,导致资源耗尽

    4)如何避免阻塞造成系统崩溃?

            a. 限流:控制进入计算机的请求数,减少线程的创建数量

            b. 降级:关闭部分功能程序的执行,尽早释放线程

            c. 避免阻塞:异步IO、无临界区(Actor模型)

五、锁机制

1、CAS锁原语

    1)通过CAS原语保证锁的获取

    2)CAS原语是系统级别的,其执行过程必须是连续的,不允许中断

2、Java锁机制

    1)JVM通过CAS原语进行加锁

    2)JVM锁类型:偏向锁、轻量级锁(非公平锁、自旋锁)、重量级锁(公平锁)

    ->Java中的加锁,最终都是竞争某个对象,因此最后都是通过修改对象头中的Mark Word实现加锁

    ->代码块对应指定的对象,非静态的同步方法对应this对象,静态的同步方法对应class对象

3、JMM--多CPU情况下的锁

    1)总线锁--悲观锁

        a. 执行CAS原语的时候,锁的不是CPU自身的缓存,而是锁住总线

        b. 性能低,导致所有的CPU都无法访问内存

    2)缓存锁--乐观锁

        a. 性能高,不会导致所有的CPU都无法访问内存

        b. 由 缓存数据的一致性 保证CAS原语的正确性

4、锁的分类

    1)公平锁 VS 非公平锁

    2)乐观锁 VS 悲观锁

    3)可重入锁

    4)独享锁/互斥锁

    5)共享锁

    6)读写锁

    7)分段锁

    8)自旋锁

六、文件&硬盘IO

1、B+树 & LSM树



2、文件系统

    1)文件控制块



3、RAID阵列



4、分布式文件系统HDFS

    1)NameNode:类似于文件控制块

    2)DataNode

        a. 服务器级别的文件读写,高性能

        b. 每个数据都有3份(分布在不同的DataNode节点上),一个DataNode崩溃时,会根据备份数据,进行崩溃节点的数据恢复

七、其他

1、异步并发分布式编程框架--akka

    1)Actor编程模型。使用actor代替线程,支持更高的并发度

    2)无锁、无竞争,不会导致阻塞

        a. 一个线程对应一个actor,actor的执行是串行的;actor执行的时候,从MailBox中拿到消息顺序进行处理;基于单线程+串行执行,程序不存在并发问题、竞争问题

        b. 一个actorRef可以对应多个actor,多个actor可以按集群部署;actor之间可以分布式部署  -->异步的+并发的+分布式的 编程框架

        c. 使用akka不用考虑 程序or代码 的并发问题,但是使用分布式方案的时候,是不是还是要考虑数据层面的并发问题, 比如多个actor更新数据的时候,需要考虑使用CAS机制更新数据 or 使用分布式锁??

            ->一般情况下是需要考虑这样的处理,来避免数据更新时的竞争问题

            -> 但是数据层面的操作可以交给某个actor统一操作,都给这个actor发消息, 而不是每个actor自己分别操作数据,从而避免竞争

    3)akka模型图

    4)相关应用:Dew、HiMeter

    5)akka的缺点:

a. 目前没有最佳的开发实践

b. 整个一套流程都需要保证异步,如异步的数据库。如果某个环节不是异步的话,当其阻塞时,影响面会很大,因为会导致对应的actor阻塞,导致所有的后续请求都无法处理(一个actor是单线程处理的)

2、 学会想象

    1)想象程序运行的整个过程,经历了哪些环节,每个环节做了什么......

    2)想象知识,让知识活起来,更加生动起来,而不是靠死记硬背知识点

    3)构建知识体系,知识之间可以相互推导,而不是死记硬背,某个知识点遗忘时,可以相互推导

        ->知识之间是统一的,不要零零散散的学知识       

       ->构建知识体系       

       ->核心的知识(第一性原理)就那么几个,抓住核心知识,构建体系

        



用户头像

wyzwlj

关注

还未添加个人签名 2018.05.02 加入

还未添加个人简介

评论

发布
暂无评论
Week7 学习总结