这周的主要内容,主要集中在性能测试,性能测试问题优化,操作系统原理,锁,文件IO、磁盘等内容。
概念
性能优化的前提和基础
性能优化结果检查和衡量标准
不同视角,标准不同,优化手段不同
- 主观视角:客户能感受到的性能
- 客观视角:性能指标衡量的性能
性能测试指标
响应时间
- 应用系统从发出请求开始响应到收到最后响应数据的时间
- 最重要的指标,直接反映系统的快慢
并发数
- 系统能够同时处理请求的数目
- 反映了系统的负载特性
- 并发数即系统并发用户数,同时提交请求的用户数目
- 在线用户数
- 当前登录系统的用户数
- 系统用户数
- 可能访问系统的用户总数
吞吐量
- 单位时间内系统处理的请求数量,体现系统的处理能力
- 对于网站,可以衡量
- 请求数/秒
- 页面数/秒
- 访问人数/天
- 处理的业务数/小时
- TPS、QPS、HPS
- (1000/响应时间ms)*并发数
性能计数器
- 描述服务器或者操作系统性能的一些指标数据
- system load
- 对象与线程数
- 内存使用
- cpu使用
- 磁盘与io网络指标
- 也是监控的指标,指标超过阈值,报警
性能测试方法
性能测试
- 以系统设计初期规划的性能目标为预期目标,不断施加压力,验证系统在资源可接受范围内,是否能达到性能预期
负载测试
- 对系统不断增加并发请求以增加系统压力,直到系统某项或者多项系统指标达到临界值,如某种资源已经呈饱和状态,这时继续对系统施加压力,系统的处理能力不但不能提升,反而下降
压力测试
- 超过安全负载的情况下,对系统继续施加压力,直到系统崩溃或不能再处理任何请求,以此获得系统最大压力承受能力
稳定性测试
- 被测试系统在特定软件、硬件、网络环境条件下,给系统加载一定业务压力,使系统运行较长一段时间,以此检测系统是否稳定
- 生产环境压力是不稳定的,呈波浪特性,稳定性测试也应该不均匀的对系统施加压力
按照https://time.geekbang.org/column/article/178076里的分析,上面的分类有一些争议,下面是一个用场景的定义来替换概念的分类:
各类测试的性能曲线图
- 曲线图
全链路压测
挑战
- 压力数据全涉及,无死角
- 如果制造压测数据
- 保证对线上无影响
- 大型促销活动的压力如何制造
数据构造
- 数据构造平台
数据隔离
- 逻辑隔离
- 虚拟隔离
- 物理隔离
流量制造
- 流量制造
全链路压测平台化
- 压测平台化
性能优化
基本原则
- 不能优化一个没有测试的软件
- 不能优化一个不了解的软件
主要指标
性能优化的一般方法
- 性能测试
- 指标分析
- 架构与代码优化,寻找性能与资源瓶颈关键
- 架构与代码优化,优化关键技术点,平衡资源利用
- 性能测试,进入性能优化闭环
性能优化分层
- 机房与骨干网络优化
- 服务器与硬件优化
- 操作系统性能优化
- 虚拟机性能优化
- 基础组件性能优化
- 软件架构性能优化
- 缓存
- 异步
- 集群
- 软件代码性能优化
- 并发编程
- 资源复用
- 异步编程
- 数据结构
性能测试,极客时间有一门专门的课程 https://time.geekbang.org/column/intro/100041101
本人做性能测试的经验有限,在学习专栏后初步有了一些体系化的知识,但是还都是皮毛,实际落地的经验还需要继续丰富
操作系统
程序运行时架构
从大的层面上来说,计算机如何运行的,应该对计算机体系结构有一定的了解
对于我们平时写程序有时候需要关心的内容,包括老师讲解的
- 操作系统多任务运行环境
- 进程的运行期状态
- 进程、线程
- 线程栈
- 线程安全
- 临界区
- 阻塞,高并发处理
锁
锁是我们进行并发设计和编程的时候一个重要的工具。学习并发编程,可以从下面三个方面进行分析:分工,协作,互斥(https://time.geekbang.org/column/intro/159)
老师的课程,对各类锁进行了细化分类的讲解
- CAS
- java中锁的实现 markword
- 偏向锁,轻量级锁,重量级锁
- 多cpu情况下的锁
- 总线锁,缓存锁
- 公平锁,非公平锁
- 可重入锁
- 独享锁,互斥锁,共享锁,读写锁
- 乐观锁,悲观锁
- 分段锁
- 自旋锁
文件与硬盘IO
硬盘分类 机械硬盘 SSD硬盘
文件的组织形式 B+树 LSM树
文件控制块,linux innode 文件控制块
RAID
HDFS