[Java实战]性能优化qps从1万到3万
一、问题背景
事情起因是项目上springboot项目提供的tps达不到客户要求,除了增加服务器提高tps之外,作为团队的技术总监,架构师,技术扛把子,本着我不入地狱谁入地狱的原则,决心从代码上优化,让客户享受到飞一般的感觉。虽然大多数编程工作在写下第一行代码时已经完成,但本着谦虚使人进步,骄傲使人落后的原则还是一步一个脚印的把问题慢慢展开,慢慢分析。以下内容是抽丝剥茧的心路历程,请君欣赏。
二、TPS与 QPS
说到性能优化就要说到高并发,说到高并发就要说到Tps和Qps。或许是小白第一次见到这个概念,但高手都是从低手走过来的,所以请高手以及高高手们,允许小人啰嗦的叙说吧!
以下是TPS(Transactions Per Second)与QPS(Queries Per Second)的核心区别及关联解析:
2.1. 定义与组成差异
-
TPS(每秒事务数)
• 定义:单位时间内系统完成的完整事务数量,一个事务包含从客户端请求到服务端处理并返回的全流程(例如:订单支付包含下单、扣款、生成凭证等多个操作)。
• 组成:通常包括三个阶段:
◦ 客户端发起请求
◦ 服务端处理(含业务逻辑、数据库操作等)
◦ 服务端返回响应结果。 -
QPS(每秒查询数)
• 定义:单位时间内服务端响应的独立查询请求数量,通常指单个接口或操作的调用次数(例如:一次商品详情页查询)。
• 组成:仅针对单一请求的响应,不涉及多步骤业务逻辑。
2. 应用场景与关系
| 指标 | 适用场景 | 与事务的关联性 | 典型示例 |
|---|---|---|---|
| TPS | 完整业务流程(如电商下单) | 一个事务可能包含多个QPS(如支付流程涉及库存查询、支付接口调用) | 支付系统需关注TPS以评估整体业务处理能力 |
| QPS | 单一接口或查询(如API调用) | 单个查询可能属于某个事务的组成部分 | 商品搜索接口需关注QPS以优化响应速度 |
关系公式:
• 当单事务仅包含一次查询时,TPS = QPS
• 当单事务包含多次查询时,QPS = TPS × 单事务内查询次数
• 系统整体吞吐量受限于性能最差的环节(如数据库瓶颈可能导致高QPS但低TPS)
3. 性能测试中的差异
-
测试目标
• TPS反映系统处理复杂业务链路的综合能力(如银行转账事务)
• QPS更关注接口层或服务的单点性能(如高并发下的缓存查询) -
瓶颈分析
• TPS低可能由事务中某个子环节(如第三方支付接口延迟)导致,需定位具体步骤
• QPS低通常与服务器资源(CPU、内存)或代码效率直接相关 -
优化策略
• 提升TPS:优化事务内耗时最长的环节(如数据库批量操作、异步处理)
• 提升QPS:减少单次查询的响应时间(如索引优化、缓存命中率)
4. 总结
• 核心区别:TPS衡量完整业务流程的吞吐量,QPS衡量单一操作的频率。
• 选择依据:需根据业务场景决定主优化方向:
• 电商大促需优先保障TPS(确保订单流程不积压)
• 搜索引擎需优先优化QPS(提升单次查询效率)
• 关联性:两者共同构成系统吞吐量的评估体系,实际应用中常需结合分析。
通过以上专业的介绍,想必各位已经知道了什么是Tps还是Qps了,如果各位还是不明白,那不能怪你们,要怪就怪小人说的太专业了。
知道了客户想要的是什么,那么接下来就好办了,结合本身提供的api服务所使用的技术架构就很容易想到NIO和BIO,因为springboot项目打成jar包后是用的内嵌的tomcat,而tomcat7之前是BIO模式,sprinboot2.x内嵌的tomcat已经是8以上了,在spirngboot自动配置中,创建tomcat实例,默认启用NIO连接器。这一不小心又说的专业了,那BIO与NIO又是什么呢?对于小白来说,满脸的黑人问号,而高手只是轻轻一笑,这小伙子又在搞什么名堂,且待我慢慢看来。
三、BIO与NIO
从TPS和QPS,再到BIO与NIO,各位看官辛苦了。虽然说是“书山有路勤为径,学海无涯苦作舟”,但是方法不对,努力全费,知道了需求,怎么去解决,那么了解BIO和NIO就是正确的解决之道了。
BIO(Blocking I/O)和NIO(New I/O 或 Non-blocking I/O)是两种常见的I/O模型,它们在处理网络请求和数据传输时有显著的区别,适用于不同的应用场景。
1. BIO(Blocking I/O)
- 定义:BIO是同步阻塞I/O模型。线程在执行I/O操作时会被阻塞,直到数据准备完成。
- 工作原理:每个连接都需要一个独立的线程来处理,线程在等待数据时无法执行其他任务。
- 优点:实现简单,代码直观。
- 缺点:线程资源消耗高,不适合高并发场景。
- 适用场景:连接数较少且稳定的场景。
2. NIO(New I/O 或 Non-blocking I/O)
- 定义:NIO是同步非阻塞I/O模型。线程在发起I/O请求后不会被阻塞,而是可以继续执行其他任务。
- 工作原理:通过
Selector(选择器)和Channel(通道)来管理多个连接。单个线程可以监听多个通道的I/O事件(如读、写、连接),从而实现高并发。 - 优点:支持高并发,资源利用率高。
- 缺点:编程复杂度较高,需要手动管理事件循环。
- 适用场景:连接数多且连接较短(轻操作)的场景,如聊天服务器。
3. BIO与NIO的对比
| 特性 | BIO | NIO |
|---|---|---|
| 阻塞模式 | 阻塞 | 非阻塞 |
| 数据处理方式 | 流(Stream) | 块(Buffer) |
| 核心组件 | Socket/ServerSocket | Channel/Buffer/Selector |
| 并发能力 | 低(一线程一连接) | 高(单线程多连接) |
| 编程复杂度 | 简单 | 复杂 |
4. 应用领域
- BIO:适用于低并发、简单应用场景,如内部工具或原型验证。
- NIO:适用于高并发、实时通信场景,如API网关、聊天服务。
总结来说嘛,BIO和NIO各有优缺点,选择合适的I/O模型需要根据实际的业务需求和并发场景来决定。
知道了目前已经是NIO模式了,那么怎么增加性能呢,换个语言不就得了,换个c吧,c是世界上最好的语言,嗯,是个不错的选择,换go吧,go是世界上最好的语言,嗯,这个也不错。想的都对,但还是用Java,Java是世界上最好的语言。
于是在一番思索后,依旧使用Java,因为 gRPC 实现依赖了netty,所以netty应该能满足客户的需求,那接下来就是见证奇迹的时刻, “实践是检验真理的唯一标准” ,是骡子是马是时候该拉出来溜溜了。
四、Netty方案
在薅掉十几根头发后,终于写出了这个替代方案,代码如下:
package com.example.demo;import io.netty.bootstrap.ServerBootstrap;
import io.netty.buffer.PooledByteBufAllocator;
import io.netty.channel.*;
import io.netty.channel.nio.NioEventLoopGroup;
import 相关文章:
[Java实战]性能优化qps从1万到3万
一、问题背景 事情起因是项目上springboot项目提供的tps达不到客户要求,除了增加服务器提高tps之外,作为团队的技术总监,架构师,技术扛把子,本着我不入地狱谁入地狱的原则,决心从代码上优化,让客户享受到飞一般的感觉。虽然大多数编程工作在写下第一行代码时已经完成…...
30天学习Java第四天——设计模式
设计模式概述 设计模式是一套被广泛接受的、经过试验的、可反复使用的基于面向对象的软件设计经验总结,它是开发人员在软件设计时,对常见问题的解决方案的总结和抽象。 一句话就是,设计模式是针对软件开发中常见问题和模式的通用解决方案。 …...
HTML块级元素和内联元素(简单易懂)
在HTML中,元素可以分为块级元素(Block-level elements)和内联元素(Inline elements)。这两类元素在页面布局和样式应用上有不同的特点和用途。 一、块级元素(Block-level elements) 1. 定义 …...
Webpack 和 Vite 的主要区别
Webpack 和 Vite 的主要区别,从构建机制、开发体验、生产优化等多个维度进行对比: 1. 构建机制与速度 Webpack 全量打包:启动时必须分析所有模块依赖关系,进行全量打包,生成 Bundle 文件。项目越大,冷启动时…...
大数据-spark3.5安装部署之standalone模式
真实工作中还是要将应用提交到集群中去执行,Standalone模式就是使用Spark自身节点运行的集群模式,体现了经典的master-slave模式。集群共三台机器,具体如下 u22server4spark: master worker u22server4spark2: worke…...
技术视界|构建理想仿真平台,加速机器人智能化落地
在近期的 OpenLoong 线下技术分享会 上,松应科技联合创始人张小波进行了精彩的演讲,深入探讨了仿真技术在机器人智能化发展中的关键作用。他结合行业趋势,剖析了现有仿真平台的挑战,并描绘了未来理想仿真系统的设计理念与实现路径…...
AutoGen多角色、多用户、多智能体对话系统
2023-03-11-AutoGen 使用【autoGenchainlitdeepSeek】实现【多角色、多用户、多智能体对话系统】 1-核心思路 01)技术要点:autoGenchainlitdeepSeek02)什么是autoGen->autogen是微软旗下的多智能体的框架03)什么是chainlit-&g…...
SQL99 多表查询
内连接: select name, depart_name, city from employee e join department d on e.depart_id d.depart_id join location l on d.locat_id l.locat_id; 外连接 注:本图取自博客园大佬"anliux"的博客,原帖链接:【学…...
ubuntu20.04装nv驱动的一些坑
**1.一定要去bios里面关闭secure boot,否则驱动程序需要签名,安装了的驱动无法被识别加载 2.假如没有关闭secure boot然后装了驱动,然后再去关闭secure boot,可能会导致进入不了ubuntu的情况 此时,先恢复secure boot&…...
sql靶场5-6关(报错注入)保姆级教程
目录 sql靶场5-6关(报错注入)保姆级教程 1.第五关 1.步骤一(闭合) 2.步骤二(列数) 3.报错注入深解 4.报错注入格式 5.步骤三(数据库表名) 6.常用函数 7.步骤四(表…...
矩阵分析-浅要理解(深度学习方向)
梯度分析与最优化 在深度学习的任务中,我们所期望的是训练一个神经网络,使得预测结果与真实标签之间的误差最小化,这可以近似看作是一个提供梯度下降等优化找到全局最优解的凸优化问题。 奇异值分解 在信息工程领域,对数据处理的…...
校园安全用电怎么保障?防触电装置来帮您
引言 随着教育设施的不断升级和校园用电需求的日益增长,校园电力系统的安全性和可靠性成为了学校管理的重要课题。三相智能安全配电装置作为一种电力管理设备,其在校园中的应用不仅能够提高电力系统的安全性,还能有效保障师生的用电安全&am…...
第十五届蓝桥杯大学B组(握手问题、小球反弹、好数)
一、握手问题 思路1: 1)先让所有人相互握手 第一个人49次 第二个人48次 第五十个人0次 共计01249 2)减去7个没握手的 016 #include<stdio.h> int main() {int a 50*49/2 - 7*6/2;printf("%d\n",a);return 0; } 运行结果…...
【教学类-43-26】20240312 数独4宫格的所有可能(图片版 576套样式,空1格-空8格,每套65534张*576小图=3千万张小图)
背景需求: 之前做了三宫格所有可能图片 510小图*12套6120图,所以3分钟就生成了 【教学类-43-25】20240311 数独3宫格的所有可能(图片版 12套样式,空1格-空8格,每套510张,共6120小图)-CSDN博客…...
如何手动使用下载并且运行 QwQ-32B-GGUF
首先使用安装 pip install ModelScope 使用 ModelScope 下载对应的模型 modelScope download --model Qwen/QwQ-32B-GGUF qwq-32b-q4_k_m.gguf 第二步开始下载 ollama git clone https://githubfast.com/ggerganov/llama.cpp # githubfast.com 可以加速下载 切换到目录&am…...
Spring Boot对接twilio发送邮件信息
要在Spring Boot应用程序中对接Twilio发送邮件信息,您可以使用Twilio的SendGrid API。以下是一个简单的步骤指南,帮助您完成这一过程: 1. 创建Twilio账户并获取API密钥 注册一个Twilio账户(如果您还没有的话)。在Twi…...
约束优化技术:KKT条件的完整推导与应用
前言 本文隶属于专栏《机器学习数学通关指南》,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出,谢谢! 本专栏目录结构和参考文献请见《机器学习数学通关指南》 ima 知识库 知识库广场搜索&#…...
大数据面试之路 (二) hive小文件合并优化方法
大量小文件容易在文件存储端造成瓶颈,影响处理效率。对此,您可以通过合并Map和Reduce的结果文件来处理。 一、合并小文件的常见场景 写入时产生小文件:Reduce任务过多或数据量过小,导致每个任务输出一个小文件。 动态分区插入&…...
对比文章相似度的余弦相似度算法的原理
近期不是项目遇到对比代码的相似度,来判断代码是否存在抄袭嘛。通过研究采用了余弦相似度来对比。既然接触的一个新的东西,怎么也得研究下吧。 一、什么是余弦相似度 利用余弦相似度对比文章相似度的原理,主要基于向量空间模型,通…...
使用vue的路由打开新标签页跳转
vue的路由只支持在本标签页跳转,要用vue的路由打开新标签页需要做处理再用window.open方法打开: // 在当前标签页中跳转 router.push({path: /new-page,query: {id: id.toString(),} });// 在新标签页中打开 const routeData router.resolve({path: /n…...
山东省新一代信息技术创新应用大赛-计算机网络管理赛项(样题)
目录 竞赛试题 网络拓扑 配置需求 虚拟局域网 IPv4地址部署 OSPF及路由部署 配置合适的静态路由组网 MSTP及VRRP链路聚合部署 IPSEC部署 路由选路部署 设备与网络管理部署 1.R1 2.R2 3.S1 4.S2 5.S3 竞赛试题 本竞赛使用HCL(华三云实验室)来进行网络设备选择…...
DeepSeek结合Mermaid绘图(流程图、时序图、类图、状态图、甘特图、饼图)转载
思维速览: 本文将详细介绍如何利用DeepSeek结合Mermaid语法绘制各类专业图表,帮助你提高工作效率和文档质量。 ▍DeepSeek入门使用请看:deepseek保姆级入门教程(网页端使用 本地客户端部署 使用技巧) DeepSeek官网…...
玩转云服务器——阿里云操作系统控制台体验测评
在云服务器日益普及的背景下,运维人员对操作系统管理工具的要求不断提高。我们需要一款既能直观展示系统状态,又能智能诊断问题,提供专业指导的控制台。阿里云操作系统管理平台正是基于API、SDK、CLI等多种管理方式,致力于提升操作…...
Linux 安装 Oh My Zsh
1. 简介 Zsh(Z Shell)是一款功能强大的 Shell,相比 Bash 提供了更强的 自动补全、命令高亮、插件支持 等功能。而 Oh My Zsh 是一个 Zsh 的增强管理工具,让你可以轻松安装插件和主题,极大提高开发效率。 本教程将详细…...
LuaJIT 学习(3)—— ffi.* API 函数
文章目录 GlossaryDeclaring and Accessing External Symbolsffi.cdef(def)ffi.Cclib ffi.load(name [,global])例子:ffi.load 函数的使用 Creating cdata Objectscdata ffi.new(ct [,nelem] [,init...]) cdata ctype([nelem,] [init...])例子:匿名 C…...
方差,协方差及协方差矩阵的计算
1.方差 方差是用来衡量一组数据的离散程度,数序表达式如下: σ 2 1 N ∑ i 1 N ( x i − μ ) 2 \sigma^2\frac1N\sum_{i1}^N(x_i-\mu)^2 σ2N1i1∑N(xi−μ)2 σ 2 σ^2 σ2表示样本的总体方差, N N N 表示样本总数, x i x _i xi…...
DeepSeek-R1思路训练多模态大模型-Vision-R1开源及实现方法思路
刚开始琢磨使用DeepSeek-R1风格训练多模态R1模型,就看到这个工作,本文一起看看,供参考。 先提出问题,仅靠 RL 是否足以激励 MLLM 的推理能力? 结论:不能,因为如果 RL 能有效激励推理能力&#…...
Unity 创建签名证书、获取签名证书信息,证书指纹
目录 一:创建签名证书 二:自动填写密码 编辑 三:获取签名证书的信息 后言 👑👑👑 一:创建签名证书 首先确保Unity是安卓打包,然后按图操作 会打开下图页面 选择你要创建到的…...
VIC模型率定验证
在气候变化问题日益严重的今天,水文模型在防洪规划,未来预测等方面发挥着不可替代的重要作用。目前,无论是工程实践或是科学研究中都存在很多著名的水文模型如SWAT/HSPF/HEC-HMS等。虽然,这些软件有各自的优点;但是&am…...
在AIStudio飞桨星河社区一键部署DeepSeek-r1:70b模型
随着DeepSeek的火热,市面上出现大量的第三方的API服务区,但是对于对安全、隐私、控制有一定需求的用户,还是会希望能够自主部署DeepSeek 。 实践下来,用自己的机器部署是一条解决之道,但是推理起来,cpu和内…...
