系统性能优化
一、概述
性能优化的目标
:是提高系统或应用程序的响应时间、吞吐量、cpu、内存、磁盘IO、网络、流量、JVM、Tomcat、DB
等方面的性能指标。
性能优化需要有一些技巧
:对于整个产品或项目而言,比如可以从前端优化、后端优化、架构优化、高并发优化、Linux内核优化、常用中间件优化等方便去优化,当然每个方面侧重点不同,用的技术点也不同。
当然除了上述从技巧方面做优化,我们也必须通过使用性能测试工具进行性能基准测试,并根据测试结果进行有针对性的优化。注意的是,性能优化需要结合具体的应用场景和问题进行分析和调整,避免过度优化和过早优化。
二、技术优化之中间件优化
-
Easticsearch
性能优化包括:硬件优化(CPU、内存和磁盘空间,SSD硬盘可提高性能)、合理设置分片数量和副本数量、索引设计(选择合适的数据类型,避免过度索引字段。合理设置分词器和分析器,以便正确地处理文本数据)、查询优化(使用过滤器而不是查询来提高性能。缓存常用查询结果,避免重复计算)、合理的master节点数量、清晰的节点职能(master、data、coordinator)、冷热数据分离、JVM调优(调整JVM堆大小、垃圾回收器等参数、JDK升级)、集群拆分、ES参数优化(refresh_interval、thread_pool、cache、file descriptors、swap)、网络优化、日志管理等。具体的优化策略还需根据实际应用场景和需求进行调整和优化。 -
Kafka
性能优化包括:参数优化、合理的分区数量和副本数量、消息生产者优化(批量发送消息、异步发送、重试机制等)、消息消费者优化(调整消费者的并发度、使用多线程消费、增加缓存大小等方式)、消息压缩、监控和调优(消息延迟、消费者位移、磁盘使用率等)。 -
Mysql
性能优化包括:索引优化、读写分离、分库分表、查询优化、数据库深度分页,参数优化、硬件优化等。
-
Redis
性能优化包括:合理的数据结构(string、hash、list、set、zset)、合理的持久化存储(RDB、AOF)、合理的参数配置(最大客户端连接数、最大内存使用量等)、设置合理的过期时间、避免大key、合理的回收策略、热key处理、缓存穿透、缓存击穿、缓存雪崩等。
三、技术优化之高并发优化
-
缓存优化
:缓存是提高系统性能的重要手段之一,可以采用本地缓存、分布式缓存、堆外缓存等技术来提高系统的并发处理能力和响应速度。本地缓存即JVM缓存,注意堆内存的合理设置以及防止出现堆内存溢出和堆内存泄露,分布式缓存如redis缓存等。注意,在选择缓存技术时需要考虑多种因素,如数据量、访问频率、数据更新的频率、缓存一致性等,同时也需要根据实际情况进行性能测试和优化。 -
消息队列
:消息队列是一种异步通信机制,可以将任务的执行和结果的返回分离开来,从而提高系统的并发处理能力和可靠性。 -
限流
:限流是一种重要的高并发优化手段,可以有效控制系统的并发访问量,保护系统免受过载的影响。比如令牌桶算法、漏桶算法、计数器限流、基于时间窗口的限流、分布式限流(基于redis或zookeeper的分布式令牌桶算法实现的全局的限流控制)、服务网关限流(如阿里的Sentinel)、弹性限流(根据系统实际负载和资源状况动态调整限流策略,实现限流的弹性和自适应性)。以上是一些常见的限流策略和技术,限流可以有效避免系统因过载而崩溃,保障系统的稳定性和可靠性。在实际应用中,需要根据系统的特点和需求选择合适的限流策略,并进行合理的配置和调优。 -
熔断
:是一种用于高并发优化的重要机制,它可以提高系统的容错性和稳定性。当系统的某个服务出现故障或不可用时,熔断机制会暂时中断对该服务的请求,避免将故障传递给其他组件,从而保护整个系统的可用性。 -
降级
:是一种在高并发环境下优化系统性能和提高可用性的常用策略。通过降低系统的某些功能或服务的负载,可以减轻系统压力,避免系统崩溃或过载。如服务降级、数据降级、异步处理、限制资源使用、容错处理、负载均衡等。 -
静态化
:是一种常见的优化技术,可以有效降低系统的负载和提高性能,特别适用于高并发场景。静态化的核心思想是将动态生成的内容转化为静态文件,并直接返回给用户,从而减少服务器的计算和数据库的访问。在高并发方便可以从页面静态化、数据静态化、CDN缓存、静态资源优化等方面优化。需要注意的是,静态化对于某些动态内容或频繁变化的数据可能不适用,需要根据实际情况进行评估和选择。同时,静态化也需要考虑缓存更新、文件同步、页面动态交互等问题,以保证系统的稳定性和可用性。 -
拆分
:高并发优化中,拆分是一种常用的策略,可以将系统拆分为多个独立的模块或服务,从而提高系统的可扩展性、并行处理能力和容错性。可以从功能拆分、数据库拆分、服务拆分、缓存拆分、请求拆分等几个方面优化。同时在进行拆分优化时需要考虑监控与调优、异常处理与容灾、部署与运维及相应的测试和压测。
四、技术优化之后端优化
-
jvm优化
:
1、堆内存调优
2、垃圾回收器选择和调优
3、线程堆栈大小调优
4、调整年轻代和老年代的比例
5、设置Survivor区比例
6、启用GC日志和调试
7、设置最大停顿时间目标
8、启用类数据共享
9、调整大对象直接进入老年代的阈值
10、调整GC日志文件的回滚和大小限制
11、配置线程局部分配缓冲(TLAB)
12、使用并行垃圾回收器
-
池化技术
:池化技术是常用的一种优化方法,主要用于减少对象、内存等资源的重复创建和销毁,从而提高程序的性能和效率。常见的池化技术包括对象池、线程池、内存池、连接池及文件池等。不过需要注意池大小的配置、内存泄漏的问题和并发访问的竞争等问题。 -
批量操作
:批量操作是指一次性处理多个数据或任务的操作。它可以提高程序的效率和性能,减少代码的复杂性,并且可以避免频繁的单个操作。比如批量增删改、批量文件操作、批量网络请批量数据处理等。需要注意的是合理的批量操作大小、合理的数据结构、合理的异常处理来保证操作的稳定性和可靠性。 -
异步处理
:异步处理是一种编程模式,通过将任务提交给异步执行的机制,可以在任务执行的同时继续执行其他操作,提高程序的并发性和响应性。常见的异步处理方式有异步IO操作、异步回调/事件驱动、多线程/多进程异步处理、消息队列等。 -
并发处理
:并发处理是指在同一时间段内同时执行多个任务的能力。它可以提高程序的效率和性能,充分利用计算资源,并减少用户等待时间。可以使用多线程、多进程等。 -
网络IO优化
:网络IO是指在计算机网络中进行输入和输出操作的过程。它涉及到数据的发送和接收,以及与网络通信相关的操作。常见的操作有数据发送、数据接收。实现方式有同步阻塞IO(BIO)、同步非阻塞IO(NIO)及异步IO(AIO)。可以从减少网络IO次数(比如前面提到的批处理、批请求等方式)、减少网络IO等待时间(异步IO或者多线程并发处理)、优化网络传输效率(比如压缩数据、使用更高效的网络协议或优化带宽等)及优化网络连接管理(复用连接、限制同时连接数量等方式)等方面优化。 -
锁优化
:减少锁粒度、使用读写锁、使用无锁结构(CAS)、使用分段锁、避免锁嵌套等。 -
数据预加载:数据预加载策略,顾名思义就是提前把部分要用到的数据,初始化到缓存。
项目启动执行方法:
可以通过实现ApplicationRunner接口中的run方法,实现启动时执行。方法执行时,项目已经初始化完毕,是可以正常提供服务
public class DataInitUtil implements ApplicationRunner{@Overridepublic void run(ApplicationArguments args) throws Exception {System.out.println("在项目启动时,会执行这个方法中的代码");}
}
-
使用注解@PostConstruct,需要在项目执行之前执行一些方法,就在目标方法上添加该注解, 存在问题:若执行方法耗时过长,会导致项目在方法执行期间无法提供服务。
-
实现CommandLineRunner接口 然后在run方法里面调用需要调用的方法即可, 可以通过java -jar demo.jar arg1传参;
-
实现ApplicationListener接口
@Component
public class ApplicationListenerImpl implements ApplicationListener<ApplicationStartedEvent> {@Overridepublic void onApplicationEvent(ApplicationStartedEvent event) {System.out.println("listener");}
}
总结:
- 注解方式@PostConstruct 始终最先执行
- 如果监听的是ApplicationStartedEvent 事件,则一定会在CommandLineRunner和ApplicationRunner 之前执行;
- 如果监听的是ApplicationReadyEvent 事件,则一定会在CommandLineRunner和ApplicationRunner 之后执行;
- CommandLineRunner和ApplicationRunner 默认是ApplicationRunner先执行,如果双方指定了@Order 则按照@Order的大小顺序执行,小的先执行。
10. 时间回调:
- 如果你调用一个系统B的接口,但是它处理业务逻辑,耗时需要10s甚至更多。然后你是一直阻塞等待,直到系统B的下游接口返回,再继续你的下一步操作吗?这样显然不合理。
- 我们可以采用事件回调机制,即我们不用阻塞等待系统B的接口,而是先去做别的操作。等系统B的接口处理完,通过事件回调通知,我们接口收到通知再进行对应的业务操作即可。如IO多路复用模型实现。
11. 串行改并行
可以使用CompletableFuture 并行调用提高性能,类似也可以使用多线程处理。
12. 数据暂存文件
如果接口耗时瓶颈就在数据库插入操作这里,用批量操作等策略,效果还不理想,就可以考虑用文件或者消息队列、redis等暂存。有时候批量数据放到文件,会比插入数据库效率更高。该策略的主要思想:就是在大数据量时,将业务数据写入文件中,再通过异步的方式去消费文件中的数据,执行对应的业务逻辑,减少数据库DB的瞬时压力。
13.避免长事务
- 长事务在DB服务端的表现是session持续时间长;
- 期间可能伴随cpu、内存升高,严重者可导致DB服务端整体响应缓慢,导致在线应用无法使用;
- 所以在线高并发业务中应该尽量避免长事务的发生。产生长事务的原因,除了sql本身可能存在问题外,和应用层的事务控制逻辑也有很大的关系。
如何避免长事务问题:
- RPC远程调用不要放到事务里面;
- 一些查询相关的操作,尽量放到事务之外;
- 事务中避免处理太多数据;
- 并发场景下,尽量避免使用@Transactional注解声明式事务粒度太大,使用TransactionTemplate的编程式事务灵活控制事务的范围。
五、技术优化之架构优化
-
技术选型
:技术选型要从是否满足业务需求、系统稳定性、性能及技术社区的成熟度等方面综合考虑。 -
空间换时间
:比如可以采用一些缓存、预计算及冗余等空间换时间的操作。 -
分布式
:高并发、高扩展、容错、集群化等手段。 -
云原生
:容器化、自动运维、弹性伸缩、微服务等。 -
微服务
:可以做到服务单一化、高扩展性且灵活。
相关文章:

系统性能优化
一、概述 性能优化的目标:是提高系统或应用程序的响应时间、吞吐量、cpu、内存、磁盘IO、网络、流量、JVM、Tomcat、DB等方面的性能指标。 性能优化需要有一些技巧:对于整个产品或项目而言,比如可以从前端优化、后端优化、架构优化、高并发…...

IMX6ULL开发板挂载 Ubuntu 的 NFS 目录,并以交叉编译得到的hello程序进行测试
首先参考博文 https://blog.csdn.net/wenhao_ir/article/details/144404637 使得IMX6ULL开发板、PC机上的USB网卡、VMware中的Ubuntu能互相Ping 通 然后开始将Ubuntu 的 NFS 目录挂载到Ubuntu中。 为什么挂载? 答:其实是把 Ubuntu中的某个目录通过NFS网…...
Xcode模拟器运行报错:The request was denied by service delegate
Xcode模拟器运行报错:The request was denied by service delegate 造成的原因: (1)新的苹果M系列芯片的Mac电脑 (2)此电脑首次安装启动Xcode的应用程序 (3)此电脑未安装Rosetta 2 解决方法: …...

ubuntu18.04配置实时内核
ubuntu系统:18.04 当前内核:5.4.0-84-generic 待安装实时内核: 5.6.19-rt11 1、查看当前版本 uname -r 2、下载内核与补丁 一种方式从官网自己下载 官方内核下载地址官方补丁下载地址阿里镜像内核下载地址(速度快࿰…...

Unity中Mesh重叠顶点合并参考及其应用
在Unity中,如果将一个模型文件(比如从max里面导出一个fbx文件)导入到编辑器中之后,Unity会把所有在原来在面列表中公用的顶点复制一份,保证每个三角形使用的顶点都是单独的,不与其它三角形共用顶点…...

倚光科技助力自由曲面设计与加工
近年来,自由曲面因其在光学、汽车、航空航天等领域的广泛应用,受到设计师和工程师的高度关注。自由曲面作为一种具有更高自由度的非球面透镜,能够在光学系统中实现更加精确的光线控制,优化像差校正,并且在满足功能需求…...

PWM调节DCDC参数计算原理
1、动态电压频率调整DVFS SOC芯片的核电压、GPU电压、NPU电压、GPU电压等,都会根据性能和实际应用场景来进行电压和频率的调整。 即动态电压频率调整DVFS(Dynamic Voltage and Frequency scaling),优化性能和功耗。 比如某SOC在…...

[Pro Git#3] 远程仓库 | ssh key | .gitignore配置
目录 1. 分布式版本控制系统的概念 2. 实际使用中的“中央服务器” 3. 远程仓库的理解 4. 新建远程仓库 5. 克隆远程仓库 6. 设置SSH Key 实验 一、多用户协作与公钥管理 二、克隆后的本地与远程分支对应 三、向远程仓库推送 四、拉取远程仓库更新 五、配置Git忽略…...

Freertos任务切换
一、操作系统进行任务切换的时机: 采用信号量实现任务的互斥: 二、FreeRTOS 任务切换场合 PendSV 中断的时候提到了上下文(任务)切换被触发的场合: ● 可以执行一个系统调用 ● 系统滴答定时器(SysTick)中断。 1、执行系统调用 执行系统…...
go开发中interface和方法接收器的使用
Go 语言中的接口和方法接收器学习 Go 中的 interface 就像是一个神奇的魔法杖,能让你轻松地将不同的类型拉到同一个阵营里。与其他语言的接口不同,Go 的接口无需显式声明“我实现了你”,只要你满足了接口规定的方法,Go 就会自动认…...

vue3-tp8-Element:对话框实现
效果 参考框架 Dialog 对话框 | Element Plus 具体实现 一、建立view页面 /src/views/TestView.vue 二、将路径写入路由 /src/router/index.js import { createRouter, createWebHistory } from vue-router import HomeView from ../views/HomeView.vueconst router create…...

高中数学:随机变量-正态分布
文章目录 一、连续性随机变量二、大致图像三、正态分布图像及解析式图像特点均值与方差公式正态分布各区域概率 一、连续性随机变量 二、大致图像 三、正态分布图像及解析式 图像特点 均值与方差公式 正态分布各区域概率...

游戏引擎学习第47天
仓库: https://gitee.com/mrxiao_com/2d_game 昨天我们花了一点时间来修复一个问题,但基本上是在修复这个问题的过程中,我们决定添加一个功能,那就是在屏幕上控制多个实体。所以如果我有一个手柄,我可以添加另一个角色࿰…...

Git 仓库托管教程
git远程仓库 常用的远程仓库-->托管服务:github、码云、gitlab等 github需要魔法上网,速度较慢因为在国外且仅仅支持Git,如果不是Git项目是不支持的;码云--gitee国内的代码托管平台,服务器在国内速度快一些&#…...

基于51单片机的简易时钟/定时器闹钟proteus仿真
地址: https://pan.baidu.com/s/1uez4cwZuXpchmihmRqnLEg 提取码:1234 仿真图: 芯片/模块的特点: AT89C52/AT89C51简介: AT89C52/AT89C51是一款经典的8位单片机,是意法半导体(STMicroelectro…...
Jackson @JsonProperty 注解
1. 概述 Jackson 是一个流行的Java库,用于将Java对象转换为JSON格式以及从JSON反序列化回Java对象。一种常见的需求是在序列化为JSON或从JSON反序列化时自定义字段的命名。Jackson 的 JsonProperty 注解正好满足了这一需求。 JsonProperty 注解概览 JsonProperty…...
【Excel学习记录】02-单元格格式设置
1.单元格格式工具美化表格 单元格格式位置 选中单元格,右键→设置单元格格式 合并居中 跨越合并 字体类型、大小、颜色、填充底纹、边框 斜线 软回车:alt enter 格式刷 2.单元格数字格式 格式不影响数值,只是展示形式 日期本质也是数…...

支持自定义离线地图地理区域,查询组件及数据源功能增强,DataEase开源BI工具v2.10.3 LTS发布
2024年12月9日,人人可用的开源BI工具DataEase正式发布v2.10.3 LTS版本。 这一版本的功能变动包括:数据源方面,API数据源和Excel数据源支持对字段类型和长度进行设置;图表方面,离线类地图支持自定义地理区域设置&#…...
LF CRLF
这个提示的含义是:Git 检测到你当前的 file3.txt 文件中使用了 LF(换行符,Line Feed,\n) 作为换行符,但在你系统的 Git 配置中,指定要将其转换为 CRLF(回车换行,Carriage…...

【从零开始入门unity游戏开发之——C#篇01】理论开篇,理解什么是编程
文章目录 前言前置条件进制什么是十进制、二进制二进制有什么用?为什么计算机用二进制而不用十进制?二进制转十进制十进制转二进制二进制运算 计算机中的数据存储单位什么是编程?什么是代码?什么是编程语言?常见的编程…...

调用支付宝接口响应40004 SYSTEM_ERROR问题排查
在对接支付宝API的时候,遇到了一些问题,记录一下排查过程。 Body:{"datadigital_fincloud_generalsaas_face_certify_initialize_response":{"msg":"Business Failed","code":"40004","sub_msg…...

HTML 列表、表格、表单
1 列表标签 作用:布局内容排列整齐的区域 列表分类:无序列表、有序列表、定义列表。 例如: 1.1 无序列表 标签:ul 嵌套 li,ul是无序列表,li是列表条目。 注意事项: ul 标签里面只能包裹 li…...
JVM垃圾回收机制全解析
Java虚拟机(JVM)中的垃圾收集器(Garbage Collector,简称GC)是用于自动管理内存的机制。它负责识别和清除不再被程序使用的对象,从而释放内存空间,避免内存泄漏和内存溢出等问题。垃圾收集器在Ja…...
macOS多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用
文章目录 问题现象问题原因解决办法 问题现象 macOS启动台(Launchpad)多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用。 问题原因 很明显,都是Google家的办公全家桶。这些应用并不是通过独立安装的…...
什么?连接服务器也能可视化显示界面?:基于X11 Forwarding + CentOS + MobaXterm实战指南
文章目录 什么是X11?环境准备实战步骤1️⃣ 服务器端配置(CentOS)2️⃣ 客户端配置(MobaXterm)3️⃣ 验证X11 Forwarding4️⃣ 运行自定义GUI程序(Python示例)5️⃣ 成功效果 协议是一种串行总线协议,专门用于在数字音频设备之间传输数字音频数据。它由飞利浦(Philips)公司开发,以其简单、高效和广泛的兼容性而闻名。 1. 信号线 I2S 协议通常使用三根或四根信号线&a…...
flow_controllers
关键点: 流控制器类型: 同步(Sync):发布操作会阻塞,直到数据被确认发送。异步(Async):发布操作非阻塞,数据发送由后台线程处理。纯同步(PureSync…...

动态规划-1035.不相交的线-力扣(LeetCode)
一、题目解析 光看题目要求和例图,感觉这题好麻烦,直线不能相交啊,每个数字只属于一条连线啊等等,但我们结合题目所给的信息和例图的内容,这不就是最长公共子序列吗?,我们把最长公共子序列连线起…...

Redis上篇--知识点总结
Redis上篇–解析 本文大部分知识整理自网上,在正文结束后都会附上参考地址。如果想要深入或者详细学习可以通过文末链接跳转学习。 1. 基本介绍 Redis 是一个开源的、高性能的 内存键值数据库,Redis 的键值对中的 key 就是字符串对象,而 val…...