架构师训练营 week7 学习总结
性能测试的主要指标
响应时间:完成一次任务花费的时间
并发数:同时处理的任务数
吞吐量:单位时间内系统处理的请求数量,TPS 每秒事务数、HPS 每秒 HTTP 请求数、QPS 每秒查询数,吞吐量=(1000/响应时间 ms)*并发数
性能计数器:性能指标阈值,cpu、内存、硬盘、system load
全链路压测的挑战
数据构造:线上数据 dump--筛选脱敏--压测基础数据中心--数据构造--压缩--流量平台
数据隔离:
逻辑隔离,直接把测试数据和正常数据写到一起,通过特殊的标识能够区分开。 • 可能污染线上数据,破坏线上数据安全性。
虚拟隔离,在所有写数据的地方做 mock,并不真正的写进去。 • 这个方案不会对线上产生污染,但是 mock 对压测结果的准确性会产生干扰。
物理隔离,所有写数据的地方对压测流量进行识别,判断一旦是压测流量的写,就写到 隔离的位置,包括存储、缓存、搜索引擎等等。
流量构造:天猫双十一全链路压测的流量平台 是一个典型的 master+slave 结构, master 作为压测管控台管理着上千 个 slave 节点;slave 节点作为压测 引擎,负责具体的请求发送。 Master 作为整个压测平台的大脑, 负责的整个平台的运转控制、命令 发送、数据收集、决策等。Slave 节 点部署在全球各地的 cdn 节点上, 从而模拟从全球各地过来的用户请 求。整套全链路压测的流量平台在 压测过程当中平稳输出 1000+w/s 的用户请求、同时保持过亿的无线 用户长链接。
性能优化的分层思想
• 机房与骨干网络性能优化
• 服务器与硬件性能优化
• 操作系统性能优化
• 虚拟机性能优化
• 基础组件性能优化
• 软件架构性能优化
• 软件代码性能优化
软件架构性能优化三板斧 • 缓存 • 异步 • 集群
软件代码性能优化
遵循面向对象的设计原则与设计模式编程,很多时候程序性能不好不是因为性能上有什么技术挑战,仅仅就是因为代码太烂了。
并发编程,多线程与锁
资源复用,线程池与对象池
异步编程,生产者消费者
数据结构,数组、链表、hash 表、树
操作系统:计算机如何处理成百上千的并发请求
进程分时执行
线程栈、线程安全、临界区
避免阻塞引起的崩溃
限流:控制进入计算机的请求数,进而减少创建的线程数。
降级:关闭部分功能程序的执行,尽早释放线程。
反应式:异步;无临界区(Actor 模型)
锁:锁原语 CAS 与各类锁
锁原语 CAS CAS(V,E,N)
• V 表示要更新的变量
• E 表示预期值
• N 表示新值 如果 V 值等于 E 值,则将 V 的值设为 N,若 V 值和 E 值不同,什么都不做。
CAS 是一种系统原语,原语的执行必须是连续的,在执行过程中不允许被中断。
偏向锁 轻量级锁 重量级锁
偏向锁:指一段同步代码一直被一个线程所访问,那么该线程会自动获取锁,降低获取 锁的代价
轻量级锁:指当锁是偏向锁时,被另一个线程所访问,偏向锁就会升级为轻量级锁,其 他线程会通过自旋的形式尝试获取锁,不会阻塞,提高性能
重量级锁:指当锁是轻量级锁时,另一个线程虽然自旋,但自旋不会一直持续下去,当 自旋到一定次数时,还没获取到锁,就会进入阻塞,该锁膨胀为重量级锁,重量级锁会 让其他申请的线程进入阻塞,性能降低
总线锁与缓存锁
公平锁 非公平锁
可重入锁
独享锁/互斥锁 共享锁 读写锁
乐观锁 悲观锁
分段锁: 分段锁的设计目的是细化锁的粒度,当操作不需要更新整个数组的时候,就仅仅针对数 组的一段进行加锁操作。 JDK ConcurrentHashMap 是通过分段锁的形式来实现高效并发操作的。
自旋锁
案例:异步并发分布式编程框架 akka
Core concept: Actor
版权声明: 本文为 InfoQ 作者【花果山】的原创文章。
原文链接:【http://xie.infoq.cn/article/ce688471fc85430700c6d8c9d】。未经作者许可,禁止转载。
评论