【面试突击】性能优化面试实战

news2024/12/23 15:01:32

🌈🌈🌈🌈🌈🌈🌈🌈
欢迎关注公众号(通过文章导读关注:【11来了】),及时收到 AI 前沿项目工具及新技术的推送!

在我后台回复 「资料」 可领取编程高频电子书
在我后台回复「面试」可领取硬核面试笔记

文章导读地址:点击查看文章导读!

感谢你的关注!

🍁🍁🍁🍁🍁🍁🍁🍁

性能优化面试实战

优化数据库连接池

高并发场景下的数据库连接池应该如何进行优化?

数据库连接池中存放的就是数据库的连接,要对连接池优化,可以从建立连接的超时时间、连接池中的连接数量限制来考虑

简单来说,就是如果建立连接或者发送请求失败,不要一直阻塞等待,设置超时时间,失败了就断开重连就好了!

  1. maxWait 设置

maxWait参数表示从连接池中获取连接时的最大等待时间,单位是毫秒

推荐设置值为 1000,表示等待 1s 之后还没有获取链接,就算等待超时

如果 maxWait 设置为 -1,那么在高并发场景下,瞬间连接池中的连接都被占用了,大量的请求拿不到连接,无限等待,最终导致 Tomcat 服务器中的线程耗尽,无法对外继续提供服务

  1. connectionProperties 设置

可以放 connectionTimeoutsocketTimeout 属性,表示 建立TCP连接的超时时间发送请求后等待响应的超时时间

推荐设置值为:

  • connectionTimeout = 1200
  • socketTimeout = 3000

不设置这两个值的话,如果高并发场景下,万一碰到了网络问题,导致和数据库的 Socket 连接异常无法通信,那么服务端的 Socket 一直阻塞等待响应,其他请求就无法获取这个连接处理自己的任务

通过设置这两个值,保证在一定时间没有处理完,就算超时,断开连接重连

  1. maxActive 设置

最大连接池数量,一般建议是设置个20就够了

如果确实有高并发场景,可以适当增加到 3~5 倍,但是不要太多,其实一般这个数字在几十到 100 就很大了,因为这仅仅是你一个服务连接数据库的数量,还有其他的服务,而且数据库整体能承受的连接数量是有限的

连接越多不是越好,数据库连接太多了,会导致 CPU 负载很高,可能反而会导致性能降低的,所以这个参数你一般设置个 20,最多再加几十个就差不多了

优化系统 TPS

如果压测的时候发现系统的 TPS 不达标,此时应该如何优化系统?

这里说一下优化系统的思路,首先,TPS 不达标,一定要去检查 SQL,比如存不存在比较慢的 SQL,比如一个 SQL 执行 500ms 或者 1s,那你线程再多,也处理不了多少的请求,所以要先检查慢 SQL,第一步:对数据库建立索引进行优化

接下来检查有没有耗时较长的接口,比如一个接口耗时 500ms 甚至 1s,不过接口耗时太长一般都是 SQL 太慢,如果 SQL 优化过之后,接口耗时还是很长,第二步:可以考虑异步化或多线程进行优化

还可以对 Tomcat 进行优化,通过修改 Tomcat 的参数,Tomcat 默认最大线程数是 200 个,那么可以扩大至 500 个或者 800 个,并且加大 Tomcat 中等待队列的长度以及连接建立数量的限制,主要是 3 个参数:maxThreads、acceptCount、maxConnections,第三步:对 Tomcat 进行优化

代码方面优化做完了,接下来就可以对机器方面进行优化,比如一台服务单机抗 800 个请求,你需要抗 3000 个请求,那么就再扩充 3 台机器,总共 4 台机器,每秒就可以抗 3200 个请求,第四步:扩充机器

Tomcat 调优

为什么对 SpringBoot 嵌入式的 Web 服务器 Tomcat 进行调优?

  • Tomcat三大配置maxThreads、acceptCount、maxConnections

    1. 最大线程数maxThreads

      决定了Web服务器最大同时可以处理多少个请求任务数量

      线程池最大线程数,默认值200

    2. 最大等待数accept-count

      是指队列能够接受的最大等待数,如果等待队列超了请求会被拒绝

      默认值100

    3. 最大连接数MaxConnections

      是指在同一时间,Tomcat能够接受的最大连接数,如果设置为-1,则不限制连接数

      最大连接数和最大等待数关系:当连接数达到最大连接数后还会继续接请求,但不能超过最大等待数,否则拒绝连接

最大线程数的值应该设置多少合适呢?

  • 需要基于业务系统的监控结果来定:RT(响应时间)均值很低不用设置,RT均值很高考虑加线程数
  • 接口响应时间低于100毫秒,足以产生足够的TPS
  • 如果没有证据表明系统瓶颈是线程数,则不建议设置最大线程数
  • 个人经验值:1C2G线程数200,4C8G线程数800

调优结论:在高负载场景下,TPS提升近1倍,RT大幅降低,异常占比降低

注意:配置修改需确认配置生效,否则再苦再累也白搭!

Tomcat 调优配置

  1. 修改配置

在 SpringBoot 项目中的 yml 文件中,对嵌入的 Tomcat 进行如下配置:

# Tomcat的maxConnections、maxThreads、acceptCount三大配置,分别表示最大连接数,最大线程数、最大的等待数,可以通过application.yml配置文件来改变这个三个值,一个标准的示例如下:
server.tomcat.uri-encoding: UTF-8
# 思考问题:一台服务器配置多少线程合适?
server.tomcat.accept-count: 1000 # 等待队列最多允许1000个请求在队列中等待
server.tomcat.max-connections: 20000 # 最大允许20000个链接被建立
## 最大工作线程数,默认200, 4核8g内存,线程数经验值800
server.tomcat.threads.max: 800 # 并发处理创建的最大的线程数量
server.tomcat.threads.min-spare: 100 # 最大空闲连接数,防止突发流量

修改之后,我们使用 SpringBoot Actuator 来管理和监听应用程序

  1. 集成 Actuator

官方文档:https://docs.spring.io/spring-boot/docs/current/reference/html/actuator.html#actuator.enabling

  • 引入依赖
<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-actuator</artifactId>
    </dependency>
</dependencies>

  • 配置文件暴露监控点
# 暴露所有的监控点
management.endpoints.web.exposure.include: '*'
# 定义Actuator访问路径
management.endpoints.web.base-path: /actuator
# 开启endpoint 关闭服务功能
management.endpoint.shutdown.enabled: true
# 暴露的数据中添加application label
management.metrics.tags.application: hero_mall

访问 http://localhost:8081/actuator 可以查看所有配置

在这里插入图片描述

找到configprops,访问链接,搜索tomcat查看是否配置成功

在这里插入图片描述

Web 容器优化

将Tomcat容器升级为Undertow

Undertow是一个用Java编写的灵活的高性能Web服务器,提供基于NIO的阻塞和非阻塞API。

  • 支持Http协议
  • 支持Http2协议
  • 支持Web Socket
  • 最高支持到Servlet4.0
  • 支持嵌入式

SpringBoot的web环境中默认使用Tomcat作为内置服务器,其实SpringBoot提供了另外2种内置的服务器供我们选择,我们可以很方便的进行切换。

  • Undertow红帽公司开发的一款基于 NIO 的高性能 Web 嵌入式服务器 。轻量级Servlet服务器,比Tomcat更轻量级没有可视化操作界面,没有其他的类似jsp的功能,只专注于服务器部署,因此undertow服务器性能略好于Tomcat服务器;
  • Jetty开源的Servlet容器,它是Java的web容器。为JSP和servlet提供运行环境。Jetty也是使用Java语言编写的。

配置Undertow

  1. 在spring-boot-starter-web排除tomcat
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-web</artifactId>
  <exclusions>
    <exclusion>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-tomcat</artifactId>
    </exclusion>
  </exclusions>
</dependency>
  1. 导入其他容器的starter
<!--导入undertow容器依赖-->
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-undertow</artifactId>
</dependency>
  1. 配置
# 设置IO线程数, 它主要执行非阻塞的任务,它们会负责多个连接
server.undertow.threads.io: 800
# 阻塞任务线程池, 当执行类似servlet请求阻塞IO操作, undertow会从这个线程池中取得线# 默认值是IO线程数*8
server.undertow.threads.worker: 8000
# 以下的配置会影响buffer,这些buffer会用于服务器连接的IO操作,有点类似netty的池化内
存管理
# 每块buffer的空间大小越小,空间就被利用的越充分,不要设置太大,以免影响其他应用,合
适即可
server.undertow.buffer-size: 1024
# 每个区分配的buffer数量 , 所以pool的大小是buffer-size * buffers-per-region
# 是否分配的直接内存(NIO直接分配的堆外内存)
server.undertow.direct-buffers: true

小结:

  • 更换了服务容器之后,RT更加平稳,TPS的增长趋势更平稳,异常数(超时3s)几乎为0。
  • 在低延时情况下,接口通吐量不及Tomcat。
  • 稳定压倒一切,如果只是写json接口,且对接口响应稳定性要求高,可以选用Undertow

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

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

相关文章

【博士每天一篇论文-综述】Deep Echo State Network (DeepESN)_ A Brief Survey

阅读时间&#xff1a;2023-11-22 1 介绍 年份&#xff1a;2017 作者&#xff1a;C. Gallicchio 比萨大学计算机科学系终身教授助理教授&#xff0c;A. Micheli&#xff0c;比萨大学计算机科学系 期刊&#xff1a; ArXiv 引用量&#xff1a;68 这是两个大牛的论文&#xff0c;…

仓储管理系统——软件工程报告(需求分析)②

需求分析 一、系统概况 仓库管理系统是一种基于互联网对实际仓库的管理平台&#xff0c;旨在提供一个方便、快捷、安全的存取货物和查询商品信息平台。该系统通过在线用户登录查询&#xff0c;可以线上操作线下具体出/入库操作、查询仓库商品信息、提高仓库运作效率&#xff…

年货节电视盒子哪个好?内行分享权威网络电视盒子排行榜

淘宝、京东等已经开始了年货节促销&#xff0c;很多消费者买电视盒子会选择在此时入手&#xff0c;我近来收到了很多关于电视盒子哪个好的咨询&#xff0c;考虑到大家在选购时会参考排行榜&#xff0c;我这次要分享的是网络电视盒子排行榜&#xff0c;目前业内公认最好的电视盒…

LeetCode.2788. 按分隔符拆分字符串

题目 题目链接 分析 题目的意思是给我们一个字符串数组和一个分隔符&#xff0c;让我们按照分隔符把字符串数组分割成新的字符串数组。 看到这个描述&#xff0c;这不就是直接就是利用 按照分隔符分割字符串的系统库函数split()&#xff0c;这个函数的意思就是 把一个字符串…

C++(14.5)——再谈拷贝构造与深浅拷贝

上篇文章中&#xff0c;通过模拟的方式完成了类对象中常用的函数。在本篇文章中&#xff0c;将通过一个例子来进一步说明拷贝构造与深浅拷贝。 目录 1.再谈深浅拷贝与拷贝构造&#xff1a; 2. 流插入与流提取&#xff1a; 2.1 流插入&#xff1a; 2.2 流提取&#xff1a; …

性能优化-OpenCL运行时API介绍

「发表于知乎专栏《移动端算法优化》」 本文首先给出 OpenCL 运行时 API 的整体编程流程图&#xff0c;然后针对每一步介绍使用的运行时 API&#xff0c;讲解 API 参数&#xff0c;并给出编程运行实例。总结运行时 API 使用的注意事项。最后展示基于 OpenCL 的图像转置代码。在…

matlab模型变量一般说明,标定和显示量,以及产生a2l文件,自动填充a2l地址,并使用标定工具ati进行标定(推荐重要)

注意我是用的是matlab2019b 1&#xff0c;输入标定量&#xff0c;使用constant&#xff0c;用cal函数包裹 2&#xff0c;输出显示量&#xff0c;在划线上标注&#xff0c;然后用display函数包裹&#xff0c; 第一步和第二步完成以后&#xff0c;生产标定量a2l 3&#xff0c;输入…

分类预测 | Matlab实现LSTM-Attention-Adaboost基于长短期记忆网络融合注意力机制的Adaboost数据分类预测/故障识别

分类预测 | Matlab实现LSTM-Attention-Adaboost基于长短期记忆网络融合注意力机制的Adaboost数据分类预测/故障识别 目录 分类预测 | Matlab实现LSTM-Attention-Adaboost基于长短期记忆网络融合注意力机制的Adaboost数据分类预测/故障识别分类效果基本描述程序设计参考资料 分类…

2024年【焊工(初级)】考试内容及焊工(初级)新版试题

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 焊工&#xff08;初级&#xff09;考试内容参考答案及焊工&#xff08;初级&#xff09;考试试题解析是安全生产模拟考试一点通题库老师及焊工&#xff08;初级&#xff09;操作证已考过的学员汇总&#xff0c;相对有…

Centos7 安装redis 详细步骤访问不了github和windows系统下载

windows系统下载 https://hellowindows.cn/ VMware虚拟机安装Windows Server 2016 VL https://blog.csdn.net/qq_37545849/article/details/134828341 VMware全屏时不显示上方命令栏的边缘 此时如果要返回&#xff0c;可以把鼠标移动至屏幕上方边缘短暂停留以呼出命令栏。或使…

MNIST 数据集详析:使用残差网络RESNET识别手写数字(文末送书)

MNIST 数据集已经是一个几乎每个初学者都会接触的数据集, 很多实验、很多模型都会以MNIST 数据集作为训练对象, 不过有些人可能对它还不是很了解, 那么今天我们一起来学习一下MNIST 数据集&#xff0c;同时构建残差网络来识别手写数字。 1.MNIST 介绍 MNIST手写数字数据库具有…

RabbitMQ数据隔离

1、新建用户 2、登录用户&#xff0c;设置虚拟主机 登录用户只能操作自己的虚拟主机&#xff0c;交换机等&#xff0c;不能操作其他人的&#xff01;&#xff01;&#xff01;

【书生·浦语大模型实战营06】《OpenCompass 大模型评测》学习笔记

《OpenCompass 大模型评测》 文档&#xff1a;OpenCompass大模型评测教程 1、主观评测 2、提示词工程 李华每周给2个不同的朋友写一封3页的信&#xff0c;一周写两次。他一年总共写了多少页的信? 李华每周给2个不同的朋友写一封3页的信&#xff0c; 一周写两次。他一年总共…

【数据结构和算法】--- 二叉树(3)--二叉树链式结构的实现(1)

目录 一、二叉树的创建(伪)二、二叉树的遍历2.1 前序遍历2.2 中序遍历2.3 后序遍历 三、二叉树节点个数及高度3.1 二叉树节点个数3.2 二叉树叶子节点个数3.3二叉树第k层节点个数3.4 二叉树查找值为x的节点 四、二叉树的创建(真) 一、二叉树的创建(伪) 在学习二叉树的基本操作前…

OTA 升级软件推荐,附带MD5,CRC16,CRC32,AES算法工具

说明&#xff1a;推荐 OTA 工具软件&#xff0c;可以通过串口按 OTA 协议发送 bin 文件给 MCU,完成 bootloader 升级app 功能 , 这个软件 附带提供 MD5,CRC16,CRC32,AES 算法工具。 文档持续完善中... 1. OTA界面 2.AES.MD5.CRC界面 3.下载链接&#xff1a; 链接: https://p…

逆序对数量(归并排序做法)

先给出上一篇文章归并排序模板-CSDN博客里的归并排序模板&#xff1a; #include<iostream> using namespace std;const int N 100010;int n; int q[N], temp[N];void merge_sort(int q[], int l, int r) {if(l > r) return;int mid (lr) >> 1;merge_sort(q, …

打造专业级ChatGPT风格聊天界面:SpringBoot与Vue实现动态打字机效果,附完整前后端源码

大家好&#xff0c;今天用SpringBoot、vue写了一个仿ChatGPT官网聊天的打字机效果。 所有代码地址:gitee代码地址 &#xff0c;包含前端和后端&#xff0c;可以直接运行 使用本技术实现的项目&#xff1a;aicnn.cn&#xff0c;欢迎大家体验 如果文章知识点有错误的地方&#xf…

HTTPS基本概念

HTTP 与 HTTPS 有哪些区别&#xff1f; HTTP 是超文本传输协议&#xff0c;信息是明文传输&#xff0c;存在安全风险的问题。HTTPS 则解决 HTTP 不安全的缺陷&#xff0c;在 TCP 和 HTTP 网络层之间加入了 SSL/TLS 安全协议&#xff0c;使得报文能够加密传输。HTTP 连接建立相…

VScode 好用的插件合集

VS Code是一个轻量级但功能强大的源代码编辑器&#xff0c;轻量级指的是下载下来的VS Code其实就是一个简单的编辑器&#xff0c;强大指的是支持多种语言的环境插件拓展&#xff0c;也正是因为这种支持插件式安装环境开发让VS Code成为了开发语言工具中的霸主&#xff0c;让其同…

如何保持工业产线业务安全稳定运行?IoT设备敏捷准入方案有诀窍

在工业数字化转型过程中&#xff0c;企业在工业产线和数字化场景&#xff0c;除了面临大量互联网终端&#xff0c;还有传统的工控终端和新加入的物联网&#xff08;IoT&#xff09;设备。在日益严峻的网络攻击面前&#xff0c;工控终端和IoT设备几乎“裸奔”&#xff0c;传统安…