【性能优化】聊聊性能优化那些事

针对于互联网应用来说,性能优化其实就是一直需要做的事情,因为系统响应慢,是非常影响用户的体验,可能回造成用户流失。所以对于性能非常重要。最近正好接到一个性能优化的需求,需要对所负责的系统进行性能提升。目前接口耗时基本在30S左右,争取可以提升到16S内。所以就先了解以下相关的性能优化,其实我理解性能优化,一个是在预防,一个是出现问题后进行解决。二前期主要在架构设计与编码层面,后期是如何找到性能瓶颈进行有效的优化。

衡量性能优化

QPS:通常指代的是查询操作
TPS :指代的是写操作
响应时间 :系统请求之后返回来的时间
吞吐量

架构设计

缓存、异步、集群 是性能优化的三板斧。缓存从一定程度上可以提升系统的读性能。异步可以提升系统写性能,而集群可以提升系统整体的吞吐量。

缓存:传统意义上的缓存,可以从客户端缓存->CDN缓存->网关缓存->负载均衡缓存->应用程序缓存->分布式缓存->数据库缓存->文件缓存->CPU缓存等进行一路拦截,通过将请求拦截在越前面,越能提升系统的整体读性能。
在这里插入图片描述

异步:异步主要是通过进行将穿行执行的过程,进行异步执行。然后通过回调结果就可以。比如JUC中的工具类,Go中的协程。消息队列等。
在这里插入图片描述
除了以上的架构层面,其实还需要在编码层面进行优化,比如使用并发编程、线程池复用、异步编程、更高效的算法等。
所以总结起来就是如下几点

  • 网络层面优化
  • 服务器硬件层面优化
  • 操作系统优化
  • JVM性能优化
  • 基础组建优化(MySQL、Kafka、Redis等)
  • 软件架构层面优化
  • 软件代码优化

如何进行性能优化

性能优化六大原则

在这里插入图片描述
在性能优化的时候,其实要先找到性能最大的瓶颈,是存储、计算、网络问题。然后根据数据分析进优化,而不应该两手一把抓。而大多数的时候,都是程序和数据库层面的问题,这个时候我们需要使用计时工具进行先记录各个流程的耗时,然后根据不同的耗时进行优化。
找到根本原因,然后进行平衡成本与工作投入比。任何的优化方案都可能是trade-off。所以我们需要平衡。根据不同性能指标权衡,找到一个最优解达到总体和整体最优。

而在性能优化的过程中,我们不能过度优化,比如一个系统只有几个人使用,而过去去优化,显然成本与收益不平衡。
在这里插入图片描述
所以,我们不能过早的优化,优化的时间点,一般都是在一个产品比较成熟的时候,为了进一步提升整体的性能而做的优化。

在这里插入图片描述

性能优化十大策略

在这里插入图片描述

时空转换

空间换时间
空间换时间的本质是,通过将空间增加存储,来提升时间。
对于一个全球业务,可以采用CDN进行多分数据的拷贝,覆盖每个地方的用户。
集群也是通过多台服务器的空间减少延迟的减少。

时间换空间
时间换空间的本质是通过,增加时间减少空间的存储,对于系统来说,CPU、内存是比较稀缺的空间资源。

  • 可以通过改变数据结构或者数据格式,减少存储数据的大小
  • 进行数据压缩。采用压缩算法。可以降低网络传输和外部存储。
  • 内存数据存储到磁盘中

而衡量一个压缩算法主要就是三个指标,压缩比例、压缩速度、使用内存。
案例:Kafka采用压缩算法进行压缩数据。生产者压缩,消费者解压缩。RPC通过自定义数据结构,减少调用方和被调用方的网络传输。

预先和延后处理

预先处理
预先处理,其实就是将数据或者三方调用进行提前调用。比如操作系统中文件、CPU和内存都会进行局部性原理数据读取,提前加载顺俗读取的数据,以及提升执行速度。

延后处理
延后处理,一般是在非要的时候才进行计算,操作。COW就是这个案例,当多个线程操作同一份共享数据的时候,如果只是读,那么可以直接操作,但是当有线程进行写的时候,就复制一份进行专门写,而不会影响别的线程进行读取。
在linux中,fork一个子进程就是写的时候会进行复制,还有java CopyOnWrite中也是如此。

并行/异步操作

并行
并行是通过一个任务处理慢,可以多个任务同时执行,以此来提升速度。可以在服务器、多线程、指令级别进行操作。比如JUC、Go中协程等。
异步
异步是相对于同步来说,异步可以不用等待结果的返回阻塞在哪里,比如IO多路复用就是通过异步操作,虽然增加来一点操作复杂度,但是性能提升非常明显。

缓存/批量合并

缓存
缓存其实是无处不在,CPU、内存、文件系统、存储系统、内容分发、数据库、框架、中间件等。本质是通过存储数据提升访问速度。

批量合并处理
其实主要是针对IO和网络IO的时候,将一批数据进行读写,可以提升吞吐量、提升性能。
比如Kafka中就是为了减少网络传输,一次发送一批的数据到Broker中。
MySQL也建议通过尽量合并读写。比较顺序的IO读写 速度更快。

算法和数据结构

算法
算法本质是为了解决不同的场景下的问题,可以通过利用不同算法提升性能。比如LRU可以数据淘汰算法、排序算法解决排序问题。
数据结构
而不同的结构,也有不同的适用场景,Set、List、Map等。去重、有序、key、value

在这里插入图片描述

小结

本篇主要从预防性能的架构设计和编码层面去聊性能优化,以及当出现性能瓶颈后,应该采用三要三不要,以及对应的十大优化策略进行优化。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/95069.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

单调递增的数字【贪心算法】

单调递增的数字 当且仅当每个相邻位数上的数字 x 和 y 满足 x < y 时&#xff0c;我们称这个整数是单调递增的。 给定一个整数 n &#xff0c;返回 小于或等于 n 的最大数字&#xff0c;且数字呈 单调递增 。 public class Solution {public int monotoneIncreasingDigits…

【MATLAB第70期】基于MATLAB的LightGbm(LGBM)梯度增强决策树多输入单输出回归预测及多分类预测模型(全网首发)

【MATLAB第70期】基于MATLAB的LightGbm(LGBM)梯度增强决策树多输入单输出回归预测及多分类预测模型&#xff08;全网首发&#xff09; 一、学习资料 (LGBM)是一种基于梯度增强决策树(GBDT)算法。 本次研究三个内容&#xff0c;分别是回归预测&#xff0c;二分类预测和多分类预…

度矩阵、邻接矩阵

度矩阵&#xff08;degree matrix&#xff09; 度矩阵是对角阵&#xff0c;对角上的元素为各个顶点的度&#xff0c;顶点vi的度表示和该顶点相关联的变得数量。 在无向图中&#xff0c;顶点vi的度d(vi)N(i)&#xff08;即与顶点相连的边的数目&#xff09;有向图中&#xff0…

qt day 5

1>实现闹钟功能 ---------------------------------------------------------------------- .pro ---------------------------------------------------------------------- QT core gui texttospeechgreaterThan(QT_MAJOR_VERSION, 4): QT widgetsCONFIG c11# T…

vue可编辑表格

内容包含:校验。下拉框。输入框。日期控件 效果图 1.代码目录 2.index.js import SjjEditable from ./src/editable.vue // import Vue from vueSjjEditable.install = function (Vue) {Vue.component(SjjEditable.name, SjjEditable) }export default SjjEditable 3.util…

SpringMVC-学习笔记

文章目录 1.概述1.1 SpringMVC快速入门 2. 请求2.1 加载控制2.2 请求的映射路径2.3 get和post请求发送2.4 五种请求参数种类2.5 传递JSON数据2.6 日期类型参数传递 3.响应3.1 响应格式 4.REST风格4.1 介绍4.2 RESTful快速入门4.3 简化操作 1.概述 SpringMVC是一个基于Java的Web…

手写Mybatis:第8章-把反射用到出神入化

文章目录 一、目标&#xff1a;元对象反射类二、设计&#xff1a;元对象反射类三、实现&#xff1a;元对象反射类3.1 工程结构3.2 元对象反射类关系图3.3 反射调用者3.3.1 统一调用者接口3.3.2 方法调用者3.3.3 getter 调用者3.3.4 setter 调用者 3.4 属性命名和分解标记3.4.1 …

Django传递dataframe对象到前端网页

在django前端页面上展示的数据&#xff0c;还是使用django模板自带的语法 方式1 不推荐使用 直接使用 【df.to_html(indexFalse)】 使用to_html他会生成一个最基本的表格没有任何的样式&#xff0c;一点都不好看&#xff0c;如果有需要的话可以自行修改表格的样式&#xff0c;…

bazel远程缓存(Remote Cache)

原理 您可以将服务器设置为构建输出&#xff08;即这些操作输出&#xff09;的远程缓存。这些输出由输出文件名列表及其内容的哈希值组成。借助远程缓存&#xff0c;您可以重复使用其他用户的 build 中的构建输出&#xff0c;而不是在本地构建每个新输出。 增量构建极大的提升…

区块链技术与应用 - 学习笔记1【引言】

大家好&#xff0c;我是比特桃。本系列主要将我之前学习区块链技术时所做的笔记&#xff0c;进行统一的优化及整合。其中大量笔记源于视频课程&#xff1a;北京大学肖臻老师《区块链技术与应用》公开课。肖老师的课让我找回了求知若渴般的感觉&#xff0c;非常享受学习这门课的…

【大数据】Apache Iceberg 概述和源代码的构建

Apache Iceberg 概述和源代码的构建 1.数据湖的解决方案 - Iceberg1.1 Iceberg 是什么1.2 Iceberg 的 Table Format 介绍1.3 Iceberg 的核心思想1.4 Iceberg 的元数据管理1.5 Iceberg 的重要特性1.5.1 丰富的计算引擎1.5.2 灵活的文件组织形式1.5.3 优化数据入湖流程1.5.4 增量…

使用多线程std::thread发挥多核计算优势(解答)

使用多线程std::thread发挥多核计算优势&#xff08;题目&#xff09; 单核无能为力 如果我们的电脑只有一个核&#xff0c;那么我们没有什么更好的办法可以让我们的程序更快。 因为这个作业限制了你修改算法函数。你唯一能做的就是利用你电脑的多核。 使用多线程 由于我们…