写点什么

性能优化 (一)

用户头像
olderwei
关注
发布于: 2020 年 07 月 21 日

性能测试

性能优化的前提是性能测试,首先我们需要通过性能测试来找到系统的瓶颈点,然后进行优化,优化之后再进行性能测试,对比两者结果来评估我们的优化是否有效。也就是说性能测试是性能优化的前提和基础,也是性能优化结果的检查和度量标准。从主观视角来看,是用户感受到的快慢;从客观视角来看,是各项性能指标衡量的。主要的性能指标有如下几个:

  • 响应时间:指应用系统从发出请求开始到最后收到响应数据所需要的时间

  • 并发数:系统能够同时处理请求的数据,重点是同时,如100个用户同一时刻提交订单,那并发数是100

  • 吞吐量:指单位时间内系统处理的请求数量,体现系统的处理能力

  • 性能计数器:描述服务器或操作系统性能的一些数据指标,包括System Load(一段时间内CPU正在处理以及等待CPU处理的进程数),CPU使用率,内存使用率,对象数和线程数,磁盘IO和网络IO。

响应时间、并发数、吞吐量这三者一般是有关系的,吞吐量=(1000/响应时间ms) * 并发数,也即响应时间短,并发数高,则吞吐量高。

性能测试具体可以分为:

  • 性能测试:对系统不断施加压力,验证系统在资源可接受范围内,是否能达到性能预期。

  • 负载测试:对系统不断施加压力,当系统资源达到临界值,系统处理能力不会继续提升,反而会下降。

  • 压力测试:对系统继续施加压力,知道系统不能再处理或者崩溃,获取系统的最大承受并发数。

  • 稳定性测试:对系统施加持续的压力,检测系统是否稳定。需要对系统不均匀的施加压力。

一般性能测试TPS曲线符合下图:

性能优化

我们在做软件优化的时候,一定要遵循两个原则:

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

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

性能优化的一般方法:

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

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

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

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

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

性能优化的分层思想:

  • 机房与骨干网络性能优化(异地多活,CDN,专线网络,可以就近访问以及降低机房同步的延时)

  • 服务器与硬件性能优化(如网卡升级,千兆网卡升级万兆网卡)

  • 操作系统优化(如优化操作系统参数)

  • 虚拟机性能优化(如我们熟知的JVM调优)

  • 基础组件性能优化(如常用web容器以及JDK版本)

  • 软件架构性能优化

  • 缓存:主要优化读操作

  • 异步:主要优化写操作

  • 集群:增加机器增加处理能力

  • 软件代码性能优化(并发编程,资源复用也即连接池、对象池,异步编程,更优的数据结构)

  • 并发编程

  • 资源复用:连接池、对象池

  • 异步编程:生产消费模式

  • 数据结构:hash表、树等

操作系统

程序是放在磁盘上的静态代码,当运行的时候,会被加载到内存交给cpu执行,这时候就是一个进程。

计算机的CPU核心数是固定的,但是我们可以同时运行很多程序,比如IDEA、Chrome、QQ音乐,因为计算机是分时执行的,也就是计算机把它的运行时间分为多个时间段,并且将这些时间段平均分配给用户指定的任务,轮流的为每个任务运行一定的时间,如此循环,直至完成所有任务。

进程是资源分配的最小单位,线程是CPU调度的最小单位。进程从操作系统获得基本的内存空间,所有线程共享进程的内存空间。每个线程也会拥有自己私有的内存地址,其他线程不能访问。因为线程共享进程的内存空间,所以就会存在安全问题,比如线程A要对共享内存空间的变量X加1,而线程B也要对X加1,最终有可能只会加1,而正常的结果应该是加2,这种情况下我们需要依赖锁来解决这个问题,当线程A操作变量X的时候先进行加锁,其他线程没有获取锁则不能进行修改。在Java中有两种加锁的方式,一种是synchronize,一种是concurrent包中提供的Lock

synchronize是JVM通过CAS对象头的Markword来进行加锁操作

而Lock是通过构造一个AQS来进行加锁以及唤醒的操作

文件系统

文件系统是计算机存储和组织数据的方式,常见的文件系统有Windows的FAT32、NTFS、FAT16,Linux的ext2、ext3、ext4等,

文件系统将硬盘空间以块为单位进行划分,每个文件占据若干块,然后再通过一个文件控制块FCB记录文件名以及文件的其他信息(包括属性,大小,权限以及文件数据块的索引也即linux文件系统的inode结构)。inode的结构如下图所示:

文件系统为了解决高可用和告诉读写,引入了磁盘阵列,也即RAID

  • RAID0

  • RAID1

  • RAID3

  • RAID5

  • RAID6

  • RAID10

文件系统为了解决大文件存储的问题,所以引入了分布式文件系统例如HDFS。

用户头像

olderwei

关注

还未添加个人签名 2018.04.26 加入

还未添加个人简介

评论

发布
暂无评论
性能优化(一)