写点什么

学习总结 - 架构师训练营 - 第七周

发布于: 2020 年 07 月 22 日
  • 性能测试

主观视角:用户感受

客观视角:性能指标

  • 网站性能测试主要指标:

响应时间:开始请求到响应的时间。直观反映系统的快慢

并发数:系统能同时处理请求的数量。并发用户数、在线用户数、可访问系统总用户数

吞吐量:单位时间内系统处理的请求数量,体现系统的处理能力。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:数据分开写;两份校验,循环放到不同的盘


用户头像

还未添加个人签名 2020.04.13 加入

还未添加个人简介

评论

发布
暂无评论
学习总结 - 架构师训练营 - 第七周