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

news2025/1/20 14:50:37

针对于互联网应用来说,性能优化其实就是一直需要做的事情,因为系统响应慢,是非常影响用户的体验,可能回造成用户流失。所以对于性能非常重要。最近正好接到一个性能优化的需求,需要对所负责的系统进行性能提升。目前接口耗时基本在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.coloradmin.cn/o/966816.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python自动化小技巧22——获取中国高校排名数据

背景 【软科排名】2023年最新软科中国大学排名|中国最好大学排名 (shanghairanking.cn) 爬取这个网站所有的高校的数据,包括学习名称,层次,地区,分数等等信息:[办学层次,学科水平,办学资源,师资规模与结构,人才培养,…

红日靶场五(vulnstack5)渗透分析

环境搭建 win7 192.168.111.132(仅主机) 192.168.123.212(桥接) .\heart p-0p-0p-0win2008 ip: 192.168.111.131(仅主机) sun\admin 2020.comkali ip: 192.168.10.131(nat)vps&…

字节一面:说说地址栏输入 URL 敲下回车后发生了什么?

前言 最近博主在字节面试中遇到这样一个面试题,这个问题也是前端面试的高频问题,作为一名前端开发工程师,我们只有了解地址栏输入 URL 敲下回车后发生的事件,才知道性能优化如何下手,性能优化也是前端必备知识&#xf…

第一章_线程基础知识

先拜拜大神 Doug Lea(道格.利) java.util.concurrent在并发编程中使用的工具包 为什么学习并用好多线程极其重要 硬件方面 摩尔定律失效 摩尔定律:它是由英特尔创始人之一Gordon Moore(戈登.摩尔)提出来的。其内容为…

Centos 6.5 升级到Centos7指导手册

一、背景 某业务系统因建设较早,使用的OS比较过时,还是centos6.5的系统,因国产化需要,需将该系统升级到BClinux 8.6,但官方显示不支持centos 6.x升级到8,需先将centos6.5升级到centos7的最新版&#xff0c…

Python之作业(一)

Python之作业(一) 作业 打印九九乘法表 用户登录验证 用户依次输入用户名和密码,然后提交验证用户不存在、密码错误,都显示用户名或密码错误提示错误3次,则退出程序验证成功则显示登录信息 九九乘法表 代码分析 先…

【100天精通Python】Day52:Python 数据分析_Numpy入门基础与数组操作

目录 1 NumPy 基础概述 1.1 NumPy的主要特点和功能 1.2 NumPy 安装和导入 2 Numpy 数组 2.1 创建NumPy数组 2.2 数组的形状和维度 2.3 数组的数据类型 2.4 访问和修改数组元素 3 数组操作 3.1 数组运算 3.2 数学函数 3.3 统计函数 4 数组形状操作 4.1 重塑数组形…

Sentinel 流量控制框架

1. Sentinel 是什么? Sentinel是由阿里中间件团队开源的,面向分布式服务架构的轻量级高可用流量控制组件。 2. 主要优势和特性 轻量级,核心库无多余依赖,性能损耗小。 方便接入,开源生态广泛。 丰富的流量控制场景。 …

【C#】泛型

【C#】泛型 泛型是什么 泛型是将类型作为参数传递给类、结构、接口和方法,这些参数相当于类型占位符。当我们定义类或方法时使用占位符代替变量类型,真正使用时再具体指定数据类型,以此来达到代码重用目的。 泛型特点 提高代码重用性一定…

ThreadLocal源码剖析(简单理解)

Thread部分源码 public class Thread implements Runnable {ThreadLocal.ThreadLocalMap threadLocals null; }ThreadLocal源码,其中ThreadLocal有一个静态内部类ThreadLocalMap,这个Map不是类似二叉树类型的,只是一个普通数组,其中具体使用什么算法其实我也不太理解. 然后对…

【LeetCode】剑指 Offer <二刷>(5)

目录 题目:剑指 Offer 10- II. 青蛙跳台阶问题 - 力扣(LeetCode) 题目的接口: 解题思路: 代码: 过啦!!! 题目:剑指 Offer 11. 旋转数组的最小数字 - 力…

MIPI D-PHY的初始化(MIPI Alliance Xilinx)

DPHY的基本介绍及使用已有很多文章,基本是基于《MIPI Alliance Specification for D-PHY 》的内容,学习时也以此为准,可参考CSDN上的文章。着重讲述MIPI D-PHY的初始化部分 1 D-PHY的功能及使用 下面的文章讲的不错,既有理论&…

内存管理方式

内存管理 一、C/C内存分布1、内存空间的介绍2、示例题目3、示例题目图解 二、C语言动态内存管理方式1、代码2、介绍 三、C内存管理方式1、概念2、代码3、代码所代表的意义 四、new和delete操作自定义类型1、代码2、运行结果3、特点 五、operator new与operator delete函数1、概…

【算法系列篇】模拟算法

文章目录 前言1.替换所有问号1.1 题目要求1.2 做题思路1.3 Java代码实现 2. 提莫攻击2.1 题目要求2.2 做题思路2.3 Java代码实现 3. N 字形变换3.1 题目要求3.2 做题思路3.3 Java代码实现 4. 外观数列4.1 题目要求4.2 做题思路4.3 Java代码实现 5. 数青蛙5.1 题目要求5.2 做题思…

CXL.mem S2M Message 释义

🔥点击查看精选 CXL 系列文章🔥 🔥点击进入【芯片设计验证】社区,查看更多精彩内容🔥 📢 声明: 🥭 作者主页:【MangoPapa的CSDN主页】。⚠️ 本文首发于CSDN&#xff0c…

【操作系统】一文快速入门,很适合JAVA后端看

作者简介: 目录 1.概述 2.CPU管理 3.内存管理 4.IO管理 1.概述 操作系统可以看作一个计算机的管理系统,对计算机的硬件资源提供了一套完整的管理解决方案。计算机的硬件组成有五大模块:运算器、控制器、存储器、输入设备、输出设备。操作…

使用candump+grep查看CAN报文

在Linux系统中观察看CAN报文,我们一般使用candump,但是有时候会发现总线上CAN报文太多,例如开启了好几个PDO,这就导致想看的报文被夹杂到报文的海洋里,然后再去找,非常麻烦。 candump也提供了只观察某个报…

LeetCode 无重复字符的最长子串 打败100%的人

😀前言 LeetCode上的“无重复字符的最长子串”问题要求我们找到给定字符串中不包含重复字符的最长子串的长度。这个问题是一个典型的滑动窗口技巧的应用,需要有效地处理字符出现的情况来找到解决方案。 . 在本解决方案中,我们将探讨两种不同的…

EMC VNX2代一键关机方法

由于不正确的EMC VNX存储系统的关机导致客户业务中断,数据丢失的案例数不胜数。不正确的关机顺序,很容易造成内存中的数据丢失,进而导致dirty cache,然后系统的LUN和POOL就无法online,业务中断。本文仅仅对EMC 2代产品…

Vue——vue3+element plus实现多选表格使用ajax发送id数组

代码来源: Vue 3结合element plus(问题总结二)之 table组件实现多选和清除选中(在vue3中获取ref 的Dom)_multipletableref.value.togglerowselection()打印出来的是u_子时不睡的博客-CSDN博客 前言 为了实现批量删除功能的功能…