第 07 周 优化系统性能 -01 学习总结
性能测试
性能测试的不同视角
性能核心指标
- 主要指标
- 响应时间
- 并发数 : 同时提交请求到服务器处理的数目
- 吞吐量 : 单位时间内系统处理的请求的数量
- TPS : 每秒事务数
- HPS : 每秒HTTP请求数
- QPS : 每秒查询数
- 性能计数器
- System Load : 当前正在执行的线程数 + 等待处理的线程数
- 等于cpu核数 刚好
- 线程数
- 进程数
- 磁盘
- IO
性能指标之间的关系
- 吞吐量 = (1000 / 响应时间ms) * 并发数
性能测试方法
- 性能测试
- 正常情况系统负载情况
- 负载测试
- 最大承受能力
- 压力测试
- 崩溃点在哪里
- 稳定性测试
- 运行一段时间检测系统是否稳定
性能优化
优化的两个基本原则
- 你不能优化一个没有测试的软件
- 你不能优化一个你不了解的软件
性能优化的一般方法
- 性能测试,获得性能指标
- 指标分析,发现性能与资源瓶颈点
- 架构与代码分析,寻找性能与资源瓶颈关键所在
- 架构与代码优化,优化关键技术点,平衡资源利用
- 性能测试,进入性能优化闭环
性能优化方法
- 找问题点
- 采用什么技术来解决
- 解决过程中又有什么样的问题
系统性能优化的分层思想
- 机房与骨干网络性能优化
- 异地多活的多机房架构
- 专线网络与自主CDN建设
- 服务器与硬件性能优化
- 使用更优的CPU,磁盘,内存,网卡,对软件的性能优化可能是数量级的,有时候远远超过代码和架构的性能优化。
- 操作系统性能优化
- 资源利用分析,发现大量CPU操作为sys类型,消耗大量计算资源。
- 调查发现,起因是部分 Linux版本缺省情况打开 tranparent huge page导致
- 优化方案:关闭 transparent huge page
- 虚拟机性能优化
- FULL GC
- 基础组件性能优化
- 更换性能更好的组件
- 更新稳定版
- 软件架构性能优化
- 缓存
- 异步
- 集群
- 软件代码性能优化
- 遵循面向对象的设计原则与设计模式编程,很多时候程序性能不好不是因为性能上有什么技术挑战,仅仅就是因为代码太烂了.
- 并发编程,多线程与锁
- 资源复用,线程池与对象池
- 异步编程,生产者消费者
- 数据结构,数组、链表、hash表、树
操作系统
程序运行时架构
- 进程
- 线程
操作系统多任务运行环境
- 进程分时执行
进程运行期状态
- 运行
- 就绪
- 阻塞
进程 VS 线程
Java Web 应用多线程运行时视图
线程安全问题
- 当某些代码修改內存堆(进程共享內存)里的数据的时候,如果有多个线程在同时执行就可能会出现同时修改数据的情况,
- 比如,两个线程同时对一个堆中的数据执行+1操作,最终这个数据只会被加一次,这就是人们常说的线程安全问题,实际上线程的结果应该是依次加一,即最终的结果应该是+2
临界区
多个线程访问共享资源的这段代码被称为临界区
```
lock.lock(); //线程获得锁
i++; //临界区代码,i位于堆中
lock.unlock(); //线程释放锁
```
解决线程安全问题的主要方法是使用锁
- 将临界区的代码加锁,只有获得锁的线程才能执行临界区代码.
阻塞导致高并发系统崩溃
- 锁(IO)会引起线程阻塞。
- 阻塞导致线程既不能继续执行,也不能释放资源。
- 进而导致资源耗尽。最终导致系统崩溃。
避免阻塞引起的崩溃
- 限流:控制进入计算机的请求数,进而减少创建的线程数。
- 降级:关闭部分功能程序的执行,尽早释放线程。
- 反应式:异步;无临界区( Actor模型)
锁
- 公平锁 与 非公平锁
- 可重入锁
- 独享锁/互斥锁 共享锁 读写锁
- 乐观锁 悲观锁
- 分段锁
- 自旋锁
akka 的特性
- 垂直伸缩,水平伸缩
- 并发
- 分布式
- 容错能力
- 简单的单一模型
核心 Actor
- 行为
- 状态
HiMeter 性能分析框架
硬盘
硬盘
机械硬盘
固态硬盘
B+ 与 LSM 树
文件控制
文件系统将硬盘空间以块为单位进行划分,每个文件占据若干个块然后再通过一个文件控制块FCB记录每个文件占据的硬盘数据块。
Linux Inode文件控制块
- inode中记录着文件权限、所有者、修改时间和文件 大小等文件属性信息及文件数据块硬盘地址索
- inode是固定结构的,能够记录的硬盘地址索引数也是固定的,只有15个索引
- 每个 inode最多可以存储12+256+256256+2562 56256个数据块,如果每个数据块的大小为4k 也就是单个文件最大不超过70G。
大文件存储的几个问题?
- 如何存储大文件?
- 文件高可用?
- 文件高速读写?
RAID 独立硬盘冗余阵列
- RAID 0
- 多块硬盘,数据分成多块同时写.
- 性能提高可用性降低容易损坏
- RAID 1
- RAID 10
- RAID 5(常用)
- RAID 6
分布式文件系统HDFS
- 角色
- NameNode 元数据
- DataNodes 存储数据
评论