系统性能优化

一、概述

性能优化的目标:是提高系统或应用程序的响应时间、吞吐量、cpu、内存、磁盘IO、网络、流量、JVM、Tomcat、DB等方面的性能指标。

性能优化需要有一些技巧:对于整个产品或项目而言,比如可以从前端优化、后端优化、架构优化、高并发优化、Linux内核优化、常用中间件优化等方便去优化,当然每个方面侧重点不同,用的技术点也不同。

当然除了上述从技巧方面做优化,我们也必须通过使用性能测试工具进行性能基准测试,并根据测试结果进行有针对性的优化。注意的是,性能优化需要结合具体的应用场景和问题进行分析和调整,避免过度优化和过早优化。

二、技术优化之中间件优化

  1. Easticsearch性能优化包括:硬件优化(CPU、内存和磁盘空间,SSD硬盘可提高性能)、合理设置分片数量和副本数量、索引设计(选择合适的数据类型,避免过度索引字段。合理设置分词器和分析器,以便正确地处理文本数据)、查询优化(使用过滤器而不是查询来提高性能。缓存常用查询结果,避免重复计算)、合理的master节点数量、清晰的节点职能(master、data、coordinator)、冷热数据分离、JVM调优(调整JVM堆大小、垃圾回收器等参数、JDK升级)、集群拆分、ES参数优化(refresh_interval、thread_pool、cache、file descriptors、swap)、网络优化、日志管理等。具体的优化策略还需根据实际应用场景和需求进行调整和优化。

  2. Kafka性能优化包括:参数优化、合理的分区数量和副本数量、消息生产者优化(批量发送消息、异步发送、重试机制等)、消息消费者优化(调整消费者的并发度、使用多线程消费、增加缓存大小等方式)、消息压缩、监控和调优(消息延迟、消费者位移、磁盘使用率等)。

  3. Mysql性能优化包括:索引优化、读写分离、分库分表、查询优化、数据库深度分页,参数优化、硬件优化等。

  1. Redis性能优化包括:合理的数据结构(string、hash、list、set、zset)、合理的持久化存储(RDB、AOF)、合理的参数配置(最大客户端连接数、最大内存使用量等)、设置合理的过期时间、避免大key、合理的回收策略、热key处理、缓存穿透、缓存击穿、缓存雪崩等。

三、技术优化之高并发优化

  1. 缓存优化:缓存是提高系统性能的重要手段之一,可以采用本地缓存、分布式缓存、堆外缓存等技术来提高系统的并发处理能力和响应速度。本地缓存即JVM缓存,注意堆内存的合理设置以及防止出现堆内存溢出和堆内存泄露,分布式缓存如redis缓存等。注意,在选择缓存技术时需要考虑多种因素,如数据量、访问频率、数据更新的频率、缓存一致性等,同时也需要根据实际情况进行性能测试和优化。

  2. 消息队列:消息队列是一种异步通信机制,可以将任务的执行和结果的返回分离开来,从而提高系统的并发处理能力和可靠性。

  3. 限流:限流是一种重要的高并发优化手段,可以有效控制系统的并发访问量,保护系统免受过载的影响。比如令牌桶算法、漏桶算法、计数器限流、基于时间窗口的限流、分布式限流(基于redis或zookeeper的分布式令牌桶算法实现的全局的限流控制)、服务网关限流(如阿里的Sentinel)、弹性限流(根据系统实际负载和资源状况动态调整限流策略,实现限流的弹性和自适应性)。以上是一些常见的限流策略和技术,限流可以有效避免系统因过载而崩溃,保障系统的稳定性和可靠性。在实际应用中,需要根据系统的特点和需求选择合适的限流策略,并进行合理的配置和调优。

  4. 熔断:是一种用于高并发优化的重要机制,它可以提高系统的容错性和稳定性。当系统的某个服务出现故障或不可用时,熔断机制会暂时中断对该服务的请求,避免将故障传递给其他组件,从而保护整个系统的可用性。

  5. 降级:是一种在高并发环境下优化系统性能和提高可用性的常用策略。通过降低系统的某些功能或服务的负载,可以减轻系统压力,避免系统崩溃或过载。如服务降级、数据降级、异步处理、限制资源使用、容错处理、负载均衡等。

  6. 静态化:是一种常见的优化技术,可以有效降低系统的负载和提高性能,特别适用于高并发场景。静态化的核心思想是将动态生成的内容转化为静态文件,并直接返回给用户,从而减少服务器的计算和数据库的访问。在高并发方便可以从页面静态化、数据静态化、CDN缓存、静态资源优化等方面优化。需要注意的是,静态化对于某些动态内容或频繁变化的数据可能不适用,需要根据实际情况进行评估和选择。同时,静态化也需要考虑缓存更新、文件同步、页面动态交互等问题,以保证系统的稳定性和可用性。

  7. 拆分:高并发优化中,拆分是一种常用的策略,可以将系统拆分为多个独立的模块或服务,从而提高系统的可扩展性、并行处理能力和容错性。可以从功能拆分、数据库拆分、服务拆分、缓存拆分、请求拆分等几个方面优化。同时在进行拆分优化时需要考虑监控与调优、异常处理与容灾、部署与运维及相应的测试和压测。

四、技术优化之后端优化

  1. jvm优化

1、堆内存调优
2、垃圾回收器选择和调优
3、线程堆栈大小调优
4、调整年轻代和老年代的比例
5、设置Survivor区比例
6、启用GC日志和调试
7、设置最大停顿时间目标
8、启用类数据共享
9、调整大对象直接进入老年代的阈值
10、调整GC日志文件的回滚和大小限制
11、配置线程局部分配缓冲(TLAB)
12、使用并行垃圾回收器
  1. 池化技术:池化技术是常用的一种优化方法,主要用于减少对象、内存等资源的重复创建和销毁,从而提高程序的性能和效率。常见的池化技术包括对象池、线程池、内存池、连接池及文件池等。不过需要注意池大小的配置、内存泄漏的问题和并发访问的竞争等问题。

  2. 批量操作:批量操作是指一次性处理多个数据或任务的操作。它可以提高程序的效率和性能,减少代码的复杂性,并且可以避免频繁的单个操作。比如批量增删改、批量文件操作、批量网络请批量数据处理等。需要注意的是合理的批量操作大小、合理的数据结构、合理的异常处理来保证操作的稳定性和可靠性。

  3. 异步处理:异步处理是一种编程模式,通过将任务提交给异步执行的机制,可以在任务执行的同时继续执行其他操作,提高程序的并发性和响应性。常见的异步处理方式有异步IO操作、异步回调/事件驱动、多线程/多进程异步处理、消息队列等。

  4. 并发处理:并发处理是指在同一时间段内同时执行多个任务的能力。它可以提高程序的效率和性能,充分利用计算资源,并减少用户等待时间。可以使用多线程、多进程等。

  5. 网络IO优化:网络IO是指在计算机网络中进行输入和输出操作的过程。它涉及到数据的发送和接收,以及与网络通信相关的操作。常见的操作有数据发送、数据接收。实现方式有同步阻塞IO(BIO)、同步非阻塞IO(NIO)及异步IO(AIO)。可以从减少网络IO次数(比如前面提到的批处理、批请求等方式)、减少网络IO等待时间(异步IO或者多线程并发处理)、优化网络传输效率(比如压缩数据、使用更高效的网络协议或优化带宽等)及优化网络连接管理(复用连接、限制同时连接数量等方式)等方面优化。

  6. 锁优化:减少锁粒度、使用读写锁、使用无锁结构(CAS)、使用分段锁、避免锁嵌套等。

  7. 数据预加载:数据预加载策略,顾名思义就是提前把部分要用到的数据,初始化到缓存。

项目启动执行方法:

可以通过实现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");}
}

总结:

  1. 注解方式@PostConstruct 始终最先执行
  2. 如果监听的是ApplicationStartedEvent 事件,则一定会在CommandLineRunner和ApplicationRunner 之前执行;
  3. 如果监听的是ApplicationReadyEvent 事件,则一定会在CommandLineRunner和ApplicationRunner 之后执行;
  4. CommandLineRunner和ApplicationRunner 默认是ApplicationRunner先执行,如果双方指定了@Order 则按照@Order的大小顺序执行,小的先执行。

10. 时间回调:

  • 如果你调用一个系统B的接口,但是它处理业务逻辑,耗时需要10s甚至更多。然后你是一直阻塞等待,直到系统B的下游接口返回,再继续你的下一步操作吗?这样显然不合理。
  • 我们可以采用事件回调机制,即我们不用阻塞等待系统B的接口,而是先去做别的操作。等系统B的接口处理完,通过事件回调通知,我们接口收到通知再进行对应的业务操作即可。如IO多路复用模型实现。

11. 串行改并行

可以使用CompletableFuture 并行调用提高性能,类似也可以使用多线程处理。

12. 数据暂存文件

如果接口耗时瓶颈就在数据库插入操作这里,用批量操作等策略,效果还不理想,就可以考虑用文件或者消息队列、redis等暂存。有时候批量数据放到文件,会比插入数据库效率更高。该策略的主要思想:就是在大数据量时,将业务数据写入文件中,再通过异步的方式去消费文件中的数据,执行对应的业务逻辑,减少数据库DB的瞬时压力。

13.避免长事务

  • 长事务在DB服务端的表现是session持续时间长;
  • 期间可能伴随cpu、内存升高,严重者可导致DB服务端整体响应缓慢,导致在线应用无法使用;
  • 所以在线高并发业务中应该尽量避免长事务的发生。产生长事务的原因,除了sql本身可能存在问题外,和应用层的事务控制逻辑也有很大的关系。

如何避免长事务问题:

  1. RPC远程调用不要放到事务里面;
  2. 一些查询相关的操作,尽量放到事务之外;
  3. 事务中避免处理太多数据;
  4. 并发场景下,尽量避免使用@Transactional注解声明式事务粒度太大,使用TransactionTemplate的编程式事务灵活控制事务的范围。

五、技术优化之架构优化

  1. 技术选型:技术选型要从是否满足业务需求、系统稳定性、性能及技术社区的成熟度等方面综合考虑。

  2. 空间换时间:比如可以采用一些缓存、预计算及冗余等空间换时间的操作。

  3. 分布式:高并发、高扩展、容错、集群化等手段。

  4. 云原生:容器化、自动运维、弹性伸缩、微服务等。

  5. 微服务:可以做到服务单一化、高扩展性且灵活。

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

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

相关文章

基于STM32设计的粮食仓库(粮仓)环境监测系统

一、前言 当前项目使用的相关软件工具、传感器源代码工程已经上传到网盘&#xff08;实时更新项目内容&#xff09;&#xff1a;https://ccnr8sukk85n.feishu.cn/wiki/QjY8weDYHibqRYkFP2qcA9aGnvb?fromfrom_copylink 1.1 项目开发背景 随着现代农业的发展和粮食储存规模的…

基于STM32的智能导盲/智能拐杖系统

基于STM32的智能导盲/智能拐杖系统 持续更新&#xff0c;欢迎关注!!! ** 基于STM32的智能导盲/智能拐杖系统 ** 据统计&#xff0c;全球视障人士的数量已经超过2.5亿&#xff0c;其中大部分人需要一种有效的辅助器具来帮助他们感知周围环境&#xff0c;安全行走。 近年来&am…

关于idea-Java-servlet-Tomcat-Web开发中出现404NOT FOUND问题的解决

在做web项目时&#xff0c;第一次使用servlet开发链接前端和后端的操作&#xff0c;果不其然&#xff0c;遇到了诸多问题&#xff0c;而遇到最多的就是运行项目打开页面时出现404NOT FOUND的情况。因为这个问题我也是鼓捣了好久&#xff0c;上网查了许多资料才最终解决&#xf…

【数据结构——栈与队列】链栈的基本运算(头歌实践教学平台习题)【合集】

目录&#x1f60b; 任务描述 相关知识 测试说明 我的通关代码: 测试结果&#xff1a; 任务描述 本关任务&#xff1a;编写一个程序实现链栈的基本运算。 相关知识 为了完成本关任务&#xff0c;你需要掌握&#xff1a; 初始化栈、销毁栈、判断栈是否为空、进栈、出栈、取栈…

与 Cursor AI 对话编程:2小时开发报修维修微信小程序

本文记录了如何通过与 Cursor AI 对话&#xff0c;全程不写一行代码的情况下&#xff0c;完成一个完整的报修小程序。整个过程展示了 AI 如何帮助我们&#xff1a; 生成代码 、解决问题、优化实现、完善细节。 先看一下效果图&#xff1a; 一、项目配置 首先我是这样和 AI 对…

基于windows环境使用nvm安装多版本nodejs

目录 前言 一、卸载node 二、nvm是什么&#xff1f; 三、nvm安装 1.官网下载 nvm 包 2. 安装nvm-setup.exe 3. 配置路径和下载镜像 4. 检查安装是否完成 四、 使用nvm安装node 五、修改npm默认镜像源为淘宝镜像 六、环境变量配置 1. 新建目录 2. 设置环境变量 七…

MVP模式的理解和实践

MVP&#xff08;Model-View-Presenter&#xff09;模式是一种用于组织代码的架构模式&#xff0c;主要用于用户界面的开发。它通过将应用程序的三个主要组件分开&#xff0c;提高了应用的可维护性和可测试性。本文将详细介绍MVP模式的理解和实践&#xff0c;并通过Java语言提供…

在Liunx中安装JDK、Tomcat、mysql、lrzsz、Nginx

一.软件安装方式 在Linux系统中&#xff0c;安装软件的方式主要有四种&#xff0c;这四种安装方式的特点如下&#xff1a; 二.安装JDK 上述我们介绍了Linux系统软件安装的四种形式&#xff0c;接下来我们就通过第一种(二进制发 布包)形式来安装JDK。 在/下创建soft目录&…

神经网络基础-初识神经网络

人工神经网络&#xff08; Artificial Neural Network&#xff0c; 简写为ANN&#xff09;也简称为神经网络&#xff08;NN&#xff09;&#xff0c;是一种模仿生物神经网络结构和功能的计算模型。人脑可以看做是一个生物神经网络&#xff0c;由众多的神经元连接而成。各个神经…

Python中PyTorch详解

文章目录 Python中PyTorch详解一、引言二、PyTorch核心概念1、张量&#xff08;Tensor&#xff09;1.1、创建张量1.2、张量操作 2、自动求导&#xff08;Autograd&#xff09;2.1、自动求导示例 三、构建神经网络1、使用nn模块2、优化器&#xff08;Optimizer&#xff09; 四、…

云服务器挖矿程序占用资源处理

云服务器挖矿程序占用资源处理 文章目录 云服务器挖矿程序占用资源处理top查看服务器后台运行情况关闭病毒删除病毒文件top 云服务器通过手机短信发送了多次预警&#xff0c;疑似出现挖矿程序&#xff0c;登录口令可能已经被暴力破解。处理方法是立即更改口令&#xff0c;然后处…

电脑文件夹打不开了,能打开但是会闪退,提示“找不到iUtils.dll”是什么原因?

电脑运行时常见问题解析&#xff1a;文件夹打不开、闪退及“找不到iUtils.dll”报错 在使用电脑的过程中&#xff0c;我们可能会遇到文件夹打不开、软件闪退或系统报错等问题&#xff0c;特别是提示“找不到iUtils.dll”的报错&#xff0c;更是让人困惑不已。今天我将为大家详…

【教程】让Jupyter支持打开CSV和Excel(xlsx)文件

转载请注明出处&#xff1a;小锋学长生活大爆炸[xfxuezhagn.cn] 如果本文帮助到了你&#xff0c;欢迎[点赞、收藏、关注]哦~ 支持CSV JupyterLab本身支持直接打开CSV文件&#xff0c;因此只需要在JupyterLab的文件浏览器中找到CSV文件并双击它&#xff0c;就可以在JupyterLab的…

自动驾驶域控制器简介

汽车智能驾驶功能持续高速渗透&#xff0c;带来智能驾驶域控制器市场空间快速增 长。智驾域控制器是智能驾驶决策环节的重要零部件&#xff0c;主要功能为处理感知 信息、进行规划决策等。其核心部件主要为计算芯片&#xff0c;英伟达、地平线等芯 片厂商市场地位突出。随着消费…

计算机网络-传输层 TCP协议(上)

目录 报头结构 TCP的可靠传输机制 核心机制一&#xff1a;确认应答 TCP的序号和确认序号 核心机制二&#xff1a;丢包重传 核心机制三&#xff1a;连接管理 建立连接-三次握手 断开连接-四次挥手 核心机制四&#xff1a;滑动窗口 数据包已经抵达, ACK被丢了 数据包就…

5.2章节python字符串的格式化三种方式

在Python中&#xff0c;格式化字符串是编程中常见的任务&#xff0c;它用于将变量或表达式的值嵌入到字符串中。以下是三种常见的格式化字符串的方式&#xff1a; 1.百分号&#xff08;%&#xff09;格式化&#xff1a; 这是Python早期版本中常用的字符串格式化方法。通过在字…

【经验分享】容器云运维的知识点

最近忙于备考没关注&#xff0c;有次点进某小黄鱼发现首页出现了我的笔记还被人收费了 虽然我也卖了一些资源&#xff0c;但我以交流、交换为主&#xff0c;笔记都是免费给别人看的 由于当时刚刚接触写的并不成熟&#xff0c;为了避免更多人花没必要的钱&#xff0c;所以决定公…

Spring Boot 集成 MyBatis 全面讲解

Spring Boot 集成 MyBatis 全面讲解 MyBatis 是一款优秀的持久层框架&#xff0c;与 Spring Boot 集成后可以大大简化开发流程。本文将全面讲解如何在 Spring Boot 中集成 MyBatis&#xff0c;包括环境配置、基础操作、高级功能和最佳实践。 一、MyBatis 简介 1. SqlSession …

Keil-MDK开发环境编译后axf自动转换bin格式文件

编译选项添加如下&#xff0c;调用fromelf工具自动完成转换&#xff1a; fromelf --bin -o "$LL.bin" "#L"

Python爬虫之Selenium的应用

【1】Selenium基础介绍 1.什么是selenium&#xff1f; &#xff08;1&#xff09;Selenium是一个用于Web应用程序测试的工具。 &#xff08;2&#xff09;Selenium 测试直接运行在浏览器中&#xff0c;就像真正的用户在操作一样。 &#xff08;3&#xff09;支持通过各种driv…