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

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

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

相关文章

Windows环境下RabbitMQ下载安装

一、准备安装文件 1、下载Erlang 登录网站Downloads - Erlang/OTP,选择“Download Windows installer”,如下图所示: 弹出框中,选在下载保存地址,保存文件,如下图所示: 2、下载RabbitMQ 登录…

ElasticSearch简介

一、基本概念 1、Index(索引) 动词,相当于 MySQL 中的 insert; 名词,相当于 MySQL 中的 Database 2、Type(类型) 在 Index(索引)中,可以定义一个或多个类…

无需公网IP,在家SSH远程连接公司内网服务器「cpolar内网穿透」

文章目录 1. Linux CentOS安装cpolar2. 创建TCP隧道3. 随机地址公网远程连接4. 固定TCP地址5. 使用固定公网TCP地址SSH远程 本次教程我们来实现如何在外公网环境下,SSH远程连接家里/公司的Linux CentOS服务器,无需公网IP,也不需要设置路由器。…

unity tolua热更新框架教程(2)

Lua启动流程 增加脚本luamain,继承luaclient 建立第一个场景GameMain,在对象GameMain挂载脚本LuaMain,启动场景 看到打印,lua被成功加载 lua入口及调用堆栈 这里会执行main.lua文件的main函数 C#接口导出 在此处配置C#导出的代码 …

【Python】爬虫练习-爬取豆瓣网电影评论用户的观影习惯数据

目录 前言 一、配置环境 1.1、 安装Python 1.2、 安装Requests库和BeautifulSoup库 1.3.、安装Matplotlib 二、登录豆瓣网(重点) 2.1、获取代理 2.2、测试代理ip是否可用 2.3、设置大量请求头随机使用 2.4、登录豆瓣网 三、爬取某一部热门电影…

【51单片机实验笔记】声学篇(一) 蜂鸣器基本控制

目录 前言硬件介绍PWM基础蜂鸣器简介 原理图分析蜂鸣器驱动电路 软件实现蜂鸣器短鸣蜂鸣器功能封装 总结 前言 蜂鸣器在生活中的应用实则相当广泛。通过本章你将学会制造噪声 (笑~)你将学会驱动它们,并发出响声。 硬件介绍 PWM基础 占空比…

shell bash中设置命令set

1 Preface/Foreword set命令用于shell脚本在执行命令时候,遇到异常的处理机制。 2 Usage 2.1 set -e 当执行命令过程中遇到异常,那么就退出脚本,不会往下执行其它命令。 #!/bin/bash #set -eroot GIT_TAG${CI_BUILD_TAG-NOTAG} GIT_REV…

设计模式之建造者模式与原型模式

目录 建造者模式 简介 使用场景 优缺点 模式结构 实现 原型模式 简介 应用场景 优缺点 模式结构 实现 建造者模式 简介 将复杂对象的构建与表示进行分离,使得同样的构建过程可以创建不同的表示。是一个将复杂的对象分解为多个简单的对象,然…

npm版本升级报错

解决方法: 执行npm install --legacy-peer-deps依赖对等 npm install xxx --legacy-peer-deps命令用于绕过peerDependency里依赖的自动安装;它告诉npm忽略项目中引入的各个依赖模块之间依赖相同但版本不同的问题,以npm v4-v6的方式去继续执行…

8天长假快来了,Python分析【去哪儿旅游攻略】数据,制作可视化图表

目录 前言环境使用模块使用数据来源分析 代码实现导入模块请求数据解析保存 数据可视化导入模块、数据年份分布情况月份分布情况出行时间情况费用分布情况人员分布情况 前言 2023年的中秋节和国庆节即将来临,好消息是,它们将连休8天!这个长假…

Docker 使用

简介 Docker是一个开源的容器引擎,它有助于更快地交付应用。 Docker可将应用程序和基础设施层隔离,并且能将基础设施当作程序一样进行管理。使用 Docker可更快地打包、测试以及部署应用程序,并可以缩短从编写到部署运行代码的周期。 Docker…

uniapp 项目实践总结(二)从零开始搭建一个项目

导语:本篇文章主要是项目方面的技术开发总结,新建一个项目可以选择使用可视化界面,也可以使用命令行搭建。 目录 可视化界面命令行搭建安卓开发环境苹果开发环境可视化界面 安装软件 使用官方推荐的 HbuilderX 软件,开发方式比较简单,内置相关环境以及终端,无需配置 no…

【python】可视化

柱状图 matplotlib之pyplot模块之柱状图(bar():基础参数、外观参数)_plt.bar_mighty13的博客-CSDN博客 bar()的基础参数如下: x:柱子在x轴上的坐标。浮点数或类数组结构。注意x可以为字符串数组! height&…

Unity中Shader的UV扭曲效果的实现

文章目录 前言一、实现的思路1、在属性面板暴露一个 扭曲贴图的属性2、在片元结构体中,新增一个float2类型的变量,用于独立存储将用于扭曲的纹理的信息3、在顶点着色器中,根据需要使用TRANSFORM_TEX对Tilling 和 Offset 插值;以及…

通过cpolar内网穿透,在家实现便捷的SSH远程连接公司内网服务器教程

文章目录 1. Linux CentOS安装cpolar2. 创建TCP隧道3. 随机地址公网远程连接4. 固定TCP地址5. 使用固定公网TCP地址SSH远程 本次教程我们来实现如何在外公网环境下,SSH远程连接家里/公司的Linux CentOS服务器,无需公网IP,也不需要设置路由器。…

Spring Boot 整合 Shiro(后端)

1 Shiro 什么是 Shiro 官网: http://shiro.apache.org/ 是一款主流的 Java 安全框架,不依赖任何容器,可以运行在 Java SE 和 Java EE 项目中,它的主要作用是对访问系统的用户进行身份认证、 授权、会话管理、加密等操作。 …

FreeRTOS操作系统中,断言输出 Error:..\..\FreeRTOS\portable\RVDS\ARM_CM4F\port.c,766 原因

分析:Error:..\..\FreeRTOS\portable\RVDS\ARM_CM4F\port.c,766 出现这个原因表示,你现在系统某个中断的优先级高于FreeRTOS可管理的优先级范围,一旦你这个中断触发,断言的信息即你串口就会输出这个条语句(前提你串口…

OpenCV(十九):模板匹配

1.模板匹配: OpenCV提供了一个模板匹配函数,用于在图像中寻找给定模板的匹配位置。 2.图像模板匹配函数matchTemplate void matchTemplate( InputArray image, InputArray templ, OutputArray result, int method, InputArray mask noArray() ); image…

《Python魔法大冒险》005 魔法挑战:自我介绍机器人

魔法师和小鱼坐在图书馆的一扇窗户旁,窗外的星空闪烁着神秘的光芒。魔法师轻轻地拍了拍小鱼的肩膀。 魔法师: 小鱼,你已经学会了编写简单的魔法程序,现在我要教你如何创造一个有自己思想的机器人,让它能够和我们一样&…

Ansible学习笔记6

stat模块:获取文件的状态信息,类似Linux的stat状态。 获取/etc/fstab文件的状态。 [rootlocalhost tmp]# ansible group1 -m stat -a "path/etc/fstab" 192.168.17.106 | SUCCESS > {"ansible_facts": {"discovered_inter…