第 7 周笔记:性能优化
优秀笔记推荐:https://xie.infoq.cn/article/56cec578d43e119e2502f2d13
1. 性能测试
主观视角:用户感受的性能
客观视角:性能指标衡量的性能
【用户感受到的快慢和客观的性能不是完全一样的】
指标:
响应时间 (从请求刚开始到接收到所有请求的数据/最后响应的数据)
并发数(类似的,还有在线用户数,系统用户数)
吞吐量 (TPS,QPS,HPS)单位时间内系统处理的请求数量。
吞吐量 = (1000 / 响应时间ms) * 并发数
性能计数器:是描述服务器或操作系统性能的数据指标。包括System Load(load最好等于CPU核心数),对象与线程数,内存使用,CPU使用,磁盘与网络的I/O。
b :系统最佳运行点
c : 系统最大负载点
d : 系统崩溃点
测试时,不断增加并发数。
2.性能优化
基本原则:
不能优化一个没有性能测试的软件
不能优化一个不了解的软件
一般方法:
性能测试,获得性能指标
指标分析,发现性能与资源瓶颈点
架构与代码分析,寻找与性能与资源瓶颈关键所在
架构与代码优化,优化关机技术点,平衡资源利用
性能测试,进入性能优化的闭环
分层思想:
机房与骨干网络性能优化
异地多活的多机房架构
专线网络与自主CDN建设
服务器与硬件性能优化
垂直伸缩。
比如发现大量时间消耗在网络传输上。处理:压缩(不可取,消耗CPU);升级网卡(1G -> 10G)
操作系统的性能优化
Look at CPU utilization.
虚拟机性能优化
基础组建的性能优化
软件架构的性能优化 (缓存,异步,集群)
软件代码的性能优化
3. 操作系统
线程栈 -> 方法内部的变量不需要考虑线程问题,因为方法的局部变量是线程独有的,在线程栈内。栈里面存原始数据类型,reference to 对象. 如果对象是在这个线程里创建的,也不用担心线程安全。
这里多线程的环境来自于Tomcat。每个线程执行有独立的堆栈。
线程安全 -> 当某些代码修改内存堆(进程共享内存,new出的对象信息,不同线程可以访问一个对象,单例)里的数据的时候,如果有多个线程在同时执行,如果同时修改数据,就会有线程安全问题。
解决方法:
临界区: 多个线程访问共享资源的这段代码称为临时区,主要是是使用锁。将临界区的代码枷锁,只有获得锁的线程,才可以进入临界区。
阻塞导致高并发系统崩溃
锁(IO)会引起线程阻塞。(比如,恶意攻击:不断发送慢网络数据,线程读不到完整数据就会阻塞)阻塞导致线程既不能继续执行,也不能释放资源。导致资源耗尽,导致系统崩溃。
方法:
降级
限流
反应式:异步;无临界区
锁
CAS是一种系统原语,原语的执行必须是连续的。
CAS(V, E, N)
V:要更新的变量
E:预期值
N:新值
如果V等于E,将V设为N。Otherwise, do nothing。
Java中通过CAS原语在对象头修改Mark Word实现加锁:对象的对象头,前64bits 是Mark Word。
轻量级锁是unfair的。重量级用了monitor(内部是队列),是公平锁。锁膨胀是自动的。
多CPU情况下的锁(多CPU,多Cache)
总线锁:悲观锁。
缓存锁:乐观锁。
4.反应式编程框架Akka
The core concept: Actor + 不需要处理并发细节。+ manage failures easily
State: shielded from the rest of the system, no need for synchronization
Communication: Interact with other actors exclusively via messages
Behavior: React on messages it receives
一个线程管理Mailbox, 所以没有并发的问题。
ActorRef可以对应多个Actor,ActorRef负责负载均衡。
5.文件系统
Based on the Linux file system,
如何存储大文件?
如何保证硬盘损坏时,数据不丢失?
如何增加硬盘的访问速度?
RAID(Redundant Array of Inexpensive Disks)
RAID0 - 数据分块,提高数据读写的速度,任何一个硬盘损坏之后,整个文件系统就不可用了,可用性降低了。
RAID1 - stores contents of each disk on the 2nd/3rd disk.
Advantage: read faster, more available
Disadvantage: write no faster
RAID4 , RAID5, RAID 6: refer to the link:
https://en.wikipedia.org/wiki/Standard_RAID_levels#RAID_4
分布式文件系统HDFS
高性能。数据备份3个副本,存在不同的机架之中。
初始化register后,DataNode会定时向Namenode发送心跳。超时之后,Namenode向影响的DataNode发送通知,复制影响的blocks(Those blocks which now have only two copies),这样又有3个副本了。
评论