性能测试
性能测试 是 性能优化 的 前提和基础
性能测试 是 性能优化结果的 检查和衡量标准
主观视角:用户感受到的性能
客观视角:性能指标衡量的性能
性能测试指标
-
响应时间
请求到收到最后响应数据所经过的时间 -
并发数
并发数,指的是 系统能够同时处理请求的数目。
注意是同时
,指的是,同一时间点上的 请求数
在同一时间点上请求的数目,实际上不会太多
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怎么处理这个变量的缓存
还有其他锁的分类
公平锁 非公平锁 :排队处理,还是抢占处理
可重入锁
独占所/互斥锁 共享锁/读写锁
乐观锁 悲观锁 :先获取数据再判断是否有效再加锁,还是先直接加锁
分段锁
自旋锁
网友评论