写点什么

第 7 周笔记:性能优化

用户头像
Melo
关注
发布于: 2020 年 07 月 18 日

优秀笔记推荐:https://xie.infoq.cn/article/56cec578d43e119e2502f2d13

1. 性能测试

主观视角:用户感受的性能

客观视角:性能指标衡量的性能

【用户感受到的快慢和客观的性能不是完全一样的】



指标:

响应时间 (从请求刚开始到接收到所有请求的数据/最后响应的数据)

并发数(类似的,还有在线用户数,系统用户数)

吞吐量 (TPS,QPS,HPS)单位时间内系统处理的请求数量。

吞吐量 = (1000 / 响应时间ms) * 并发数



性能计数器:是描述服务器或操作系统性能的数据指标。包括System Load(load最好等于CPU核心数),对象与线程数,内存使用,CPU使用,磁盘与网络的I/O。

b :系统最佳运行点

c : 系统最大负载点

d : 系统崩溃点

测试时,不断增加并发数。



2.性能优化

基本原则:

  • 不能优化一个没有性能测试的软件

  • 不能优化一个不了解的软件



一般方法:

  • 性能测试,获得性能指标

  • 指标分析,发现性能与资源瓶颈点

  • 架构与代码分析,寻找与性能与资源瓶颈关键所在

  • 架构与代码优化,优化关机技术点,平衡资源利用

  • 性能测试,进入性能优化的闭环



分层思想:

  1. 机房与骨干网络性能优化

异地多活的多机房架构

专线网络与自主CDN建设



  1. 服务器与硬件性能优化

垂直伸缩。

比如发现大量时间消耗在网络传输上。处理:压缩(不可取,消耗CPU);升级网卡(1G -> 10G)



  1. 操作系统的性能优化

Look at CPU utilization.



  1. 虚拟机性能优化

  2. 基础组建的性能优化

  3. 软件架构的性能优化 (缓存,异步,集群)

  4. 软件代码的性能优化



3. 操作系统

线程栈 -> 方法内部的变量不需要考虑线程问题,因为方法的局部变量是线程独有的,在线程栈内。栈里面存原始数据类型,reference to 对象. 如果对象是在这个线程里创建的,也不用担心线程安全。

这里多线程的环境来自于Tomcat。每个线程执行有独立的堆栈。



线程安全 -> 当某些代码修改内存堆(进程共享内存,new出的对象信息,不同线程可以访问一个对象,单例)里的数据的时候,如果有多个线程在同时执行,如果同时修改数据,就会有线程安全问题。



解决方法:

  • 临界区: 多个线程访问共享资源的这段代码称为临时区,主要是是使用锁。将临界区的代码枷锁,只有获得锁的线程,才可以进入临界区。



阻塞导致高并发系统崩溃

锁(IO)会引起线程阻塞。(比如,恶意攻击:不断发送慢网络数据,线程读不到完整数据就会阻塞)阻塞导致线程既不能继续执行,也不能释放资源。导致资源耗尽,导致系统崩溃。

方法:

  1. 降级

  2. 限流

  3. 反应式:异步;无临界区



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个副本了。





用户头像

Melo

关注

还未添加个人签名 2019.09.17 加入

还未添加个人简介

评论

发布
暂无评论
第7周笔记:性能优化