总结7

作者: yz08150 | 来源:发表于2020-07-22 17:15 被阅读0次

    性能测试

    性能测试 是 性能优化 的 前提和基础
    性能测试 是 性能优化结果的 检查和衡量标准
    主观视角:用户感受到的性能
    客观视角:性能指标衡量的性能

    性能测试指标
    • 响应时间
      请求到收到最后响应数据所经过的时间

    • 并发数
      并发数,指的是 系统能够同时处理请求的数目。
      注意是 同时,指的是,同一时间点上的 请求数

    在同一时间点上请求的数目,实际上不会太多
    1s内的 10W个请求,100ms的响应时间,大概同时也只能有 1000个并发

    • 吞吐量
      TPS QPS
      单位时间内的请求的数量
      吞吐量=(1000/响应时间ms) * 并发数
      根据上面的并发数的分析,可以看出来

    • 性能计数器
      描述服务器或操作系统性能的一些数据指标
      比如 cpu使用率,内存使用,网络,磁盘等性能指标

    性能测试方法

    image.png
    性能测试

    以系统设计初期的性能指标 为 预期目标,
    对系统不断施加压力,验证系统在资源可接受范围内,是否能够达到性能预期
    如上图中的 a-b 段

    负载测试

    在性能测试基础上,
    对系统不断施加压力,直到系统的某项或多项性能指标到达安全临界值,
    这时,继续对系统施加压力,系统的处理能力不但不能提高,反而会下降
    如上图中的 b-c 段

    压力测试

    在负载测试基础上,
    对系统继续施加压力,直到系统崩溃,或不能再处理任何请求,
    以此获得系统最大压力承受能力
    如上图中的 c-d 段

    稳定性测试

    被测试系统,在特定 硬件、软件、网络环境下,
    给系统加载一定业务压力,并使系统运行一段较长时间
    以此检测系统是否稳定。

    实际生产环境中,请求压力是不均匀的,稳定性测试,也应该不均匀的施加压力来测试


    image.png

    全链路压测

    模拟用户真实行为的请求测试,请求会走完所有的服务链路
    测试以便找出性能瓶颈,以测试出整个系统的真实的处理能力,以确定以后如何扩容

    全链路压测的挑战
    • 压测相关的业务系统众多,并且涉及链路上的所有基础设施和中间件,如何保证压测流量能够畅通无阻,没有死角?
    • 压测的数据怎么构造?亿万级的商品和用户,数据模型如何与真实接近?
    • 全链路压测直接在线上的真实环境进行模拟,怎么保证对线上无影响?
    • 大型促销活动所带来的巨大流量要怎么制作出来?
    数据构造
    image.png
    数据隔离
    image.png
    流量构造
    image.png
    全链路压测平台化
    image.png

    针对每一层进行优化

    • 机房与骨干网路
      异地多活的多机房架构
      专线网络 和 自主CDN建设

    • 服务器与硬件
      使用更好的 CPU 硬盘 内存 网卡
      垂直伸缩

    • 操作系统
      各种系统参数优化

    • jvm虚拟机
      堆栈等参数优化

    • 基础组件
      选择更好的组件,更合适的版本

    • 软件架构

      • 缓存
      • 异步
      • 集群
    • 软件代码
      设计模式 设计原则 数据结构 算法
      并发 异步 资源复用

    临界区

    多个线程 访问 共享资源的这段代码 被 称为 临界区
    解决线程安全问题的主要方法是使用锁

    但是,加锁,会导致线程阻塞。多个线程阻塞,可能会导致系统崩溃

    应避免阻塞引起的崩溃:

    • 限流,控制请求数
    • 降级,关闭部分功能程序的执行,尽早释放线程
    • 避免阻塞,比如 使用 异步I/O,无临界区(Actor模型)

    CAS原语

    CAS 有对应的系统的指令,可以原子的执行 CAS操作

    java 通过 CAS原语 在对象头中修改 Mark Word实现加锁

    偏向锁 轻量级锁 重量级锁
    • 偏向锁
      如果一段代码一直被一个线程访问,那么这个线程会自动获取锁,降低获取锁的代价

    • 轻量级锁
      指当锁是偏向锁的时候,其他线程来获取锁,则偏向锁就会升级为轻量级锁,其他线程会通过自旋的形式尝试获取锁,不会阻塞,可以提高性能

    • 重量级锁
      指当锁是轻量级锁时,尝试获取锁的线程虽然会自旋获取锁,但是不会一直自旋下去,如果一定次数后,还没有获取到锁,则锁膨胀为 重量级锁,此时尝试获取锁,就会进入阻塞

    总线锁 与 缓存锁

    因为每个CPU都有自己的缓存行,所以当多个线程同时操作一个变量时,可能会导致多个CPU都有这个变量的缓存,那么,这些CPU就需要缓存一致性协议来保证CPU中的缓存的一致

    可以通过 总线锁的方式,独占共享内存,代价大

    缓存锁 可以通过缓存一致性协议,来告诉其他CPU怎么处理这个变量的缓存

    还有其他锁的分类

    公平锁 非公平锁 :排队处理,还是抢占处理
    可重入锁
    独占所/互斥锁 共享锁/读写锁
    乐观锁 悲观锁 :先获取数据再判断是否有效再加锁,还是先直接加锁
    分段锁
    自旋锁

    相关文章

      网友评论

          本文标题:总结7

          本文链接:https://www.haomeiwen.com/subject/cpwxkktx.html