学习总结 - 架构师训练营 - 第七周
性能测试
主观视角:用户感受
客观视角:性能指标
网站性能测试主要指标:
响应时间:开始请求到响应的时间。直观反映系统的快慢
并发数:系统能同时处理请求的数量。并发用户数、在线用户数、可访问系统总用户数
吞吐量:单位时间内系统处理的请求数量,体现系统的处理能力。TPS(每秒事务数)、HPS(每秒 HTTP 请求数)、QPS(每秒查询数)
性能计数器:描述性能的一些数据指标。负载、线程数、内存、CPU、磁盘、IO,进行告警
性能测试方法:
分类:
性能测试:以系统设计初期规划的性能指标为预期目标。对系统加压,验证系统资源在正常范围内能否达到性能预期。
负载测试:对系统加压,直到系统的某项或多项性能指标达到安全临界值。系统的最大处理能力,性能瓶颈。
压力测试:超过安全临界的情况下,继续对系统加压。直到系统崩溃或无法处理请求。获得系统最大压力承受能力,崩溃点。
稳定性测试:长时间的高并发,能否稳定。稳定性测试也应不均匀对系统施加压力。
系统应该在 b 点左右运行。
全链路压测:
特定业务场景下,完整链路施压,尽可能模拟出真实的用户行为。
暴露性能瓶颈,有指导的在大促前进行容量规划和性能优化。
全链路压测的挑战:
数据构造:数据模型与真实贴近
数据隔离:对线上无影响
流量构造
软件性能优化的基本原则:
不能优化一个没有测试的软件
不能优化一个不了解的软件
关注性能测试的主要指标,优化的依据和答案。
性能优化的一般方法:
性能测试:获得性能指标
指标分析:发现性能与资源瓶颈点
架构与代码分析:寻找造成瓶颈的关键
架构与代码优化:优化关键技术点,平衡资源利用
性能测试:进入性能优化闭环
系统性能优化的分层:
机房与骨干网络:异地多活多机房、专线网络与自主 CDN 建设
服务器与硬件:更优的硬件
操作系统:操作系统的配置等
虚拟机:
基础组件:web 服务器、json 等
软件架构:
缓存 - 主要优化读(从内存读、减少存储压力、减少数据库访问、缓存结果减少计算)、
异步 - 主要优化写(及时响应、控制消费速度和负载压力)
集群(多服务器对使用者而言,看起来像一台服务器)
软件代码:
并发编程(多线程与锁)
资源复用(线程池与对象池)
异步编程(生产者消费者)
数据结构(数组、链表、Hash 表、树)
操作系统运行时架构:
程序是静态的,进程是动态的
进程分时执行
运行 - 就绪(等待 CPU)- 阻塞(等待某一事件发生,I/O、锁等)
进程(CPU 切换代价大)与线程(多线程共享进程内存空间,拥有自己私有的内存地址)
线程栈:栈顶为当前执行函数,函数返回后出栈
线程安全
临界区:多线程访问共享资源的这段代码。
解决线程安全问题主要方法:临界区加锁
锁:
CAS(V,E,N),原语执行必须是连续的,在执行过程中不允许被中断
琐升级:偏向锁(拥有锁的线程自动/低代价获取锁)、轻量级锁(其他线程自旋)、重量级锁(自旋一定次数,阻塞)
多 CPU 情况下的锁:
缓存一致性协议(从 CPU 缓存写到内存时,缓存一致性机制保证其他 CPU 回写已被锁定的缓存行时,使其他 CPU 的缓存行无效)
总线锁机制(其他处理器请求被阻塞,处理器独占内存)
公平锁:按申请顺序获取锁
非公平锁:尝试直接获取,然后排队
可重入锁:持有外层锁时,直接获取内层的锁
独享锁:单写
共享锁:多读
乐观锁:直接进行更新操作,有修改就放弃
悲观锁:先锁,再操作
分段锁:细化锁粒度,针对数组的一段加锁。ConcurrentHashMap。
自旋锁:循环尝试获取锁,消耗 CPU
机械硬盘:磁头寻址时间
文件控制块:
FCB
Linux Inode:
直接数据指针 0-11;一级间接、二级间接、三级间接;
单个文件最大(12+256+256^2+256^3)*4k,约 70G
RAID:
RAID 0:数据分开,并发写多块盘
RAID 1:一份冗余
RAID 10:数据分开+冗余
RAID 5:数据分开写;一份校验,循环放到不同的盘
RAID 6:数据分开写;两份校验,循环放到不同的盘
评论