当前位置: 首页 > news >正文

java-SpringBoot-线程池配置-压力测试(理论版)

线程池

描述

  • 当代码中需要创建线程时使用(如:异步订单处理,批量数据处理,数据导出导入类等不需要实时返回的情况)

原理

  1. 配置线程池
  2. 使用线程池工具创建线程(new Thread() 不算)
  3. 当执行创建第一个线程代码时,开始创建第一次核心线程
  4. 每次创建线程,判断是否超线程池配置的最小值,如果未超正常创建核心线程
  5. 超了线程池配置的最小值,进队列
  6. 队列满了,判断是否达到线程池配置的最大值,如果未超,创建非核心线程
  7. 超了线程池配置的最大值,后续超出的线程根据配置的拒绝策略执行

线程池配置

线程池配置来源:可以根据压力测试得到的结果来做配置

主要参数

线程池最小值

描述:每次创建线程,判断是否超线程池配置的最小值,如果未超正常创建核心线程

线程池最大值

描述:当前线程达到线程池配置的最小值,并且队列满了,判断是否达到线程池配置的最大值,如果未超,创建非核心线程

队列最大长度

描述:每次创建线程,判断是否超线程池配置的最小值,如果未超正常创建核心线程,超了线程池配置的最小值,进队列,当前线程达到线程池配置的最小值,并且队列满了,判断是否达到线程池配置的最大值,如果未超,创建非核心线程

线程池前缀

描述:用于日志区分对应线程

//创建线程池对象 ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); //配置线程池最小数量 executor.setCorePoolSize(10); //配置线程池最大数量 executor.setMaxPoolSize(200); //配置队列最大长度 executor.setQueueCapacity(10); //配置线程池前缀 executor.setThreadNamePrefix("executor-");
线程池拒绝策略

描述:当队列满了,并且线程达到线程池配置的最大值,后续超出的线程根据配置的拒绝策略执行


配置线程池代码

ps:拿已上线springBoot工程配置代码

import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.core.task.TaskExecutor; import org.springframework.scheduling.annotation.EnableAsync; import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; import java.util.concurrent.ThreadPoolExecutor; @Configuration @EnableAsync(proxyTargetClass = true) public class AsycTaskConfig { /** * 线程池维护线程的最小数量. */ @Value("${asyc-task.corePoolSize:10}") private int corePoolSize; /** * 线程池维护线程的最大数量 */ @Value("${asyc-task.maxPoolSize:200}") private int maxPoolSize; /** * 队列最大长度 */ @Value("${asyc-task.queueCapacity:10}") private int queueCapacity; /** * 线程池前缀 */ @Value("${asyc-task.threadNamePrefix:executor-}") private String threadNamePrefix; @Bean public TaskExecutor taskExecutor() { ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); executor.setCorePoolSize(corePoolSize);//最小线程池数量 executor.setMaxPoolSize(maxPoolSize);//最大线程池数量 executor.setQueueCapacity(queueCapacity);//队列最大长度 //这个项目的线程池前缀,方便看日志区分是哪个线程 executor.setThreadNamePrefix(threadNamePrefix); /* * 线程池拒绝策略:当线程池内数量达到 maxPoolSize 且工作队列已满时, * 才会触发拒绝策略,根据配置的拒绝策略处理当前已超出的线程,默认抛异常 */ /* * AbortPolicy(默认策略) * 行为:直接抛出 RejectedExecutionException 异常 * 适用场景:必须保证任务不能丢失,需要上层捕获异常处理 */ // executor.setRejectedExecutionHandler( // new ThreadPoolExecutor.AbortPolicy()); /* * CallerRunsPolicy(调用者运行策略) * 行为:不在新线程中执行,而是由提交任务的线程(调用者)自己执行 * 适用场景:降低新任务提交速度,起到反压作用,避免任务丢失 */ executor.setRejectedExecutionHandler( new ThreadPoolExecutor.CallerRunsPolicy()); /* * DiscardPolicy(丢弃策略) * 行为:直接丢弃新提交的任务,不抛出异常 * 适用场景:允许任务丢失,对结果不敏感的场景 */ // executor.setRejectedExecutionHandler( // new ThreadPoolExecutor.DiscardPolicy()); /* * DiscardOldestPolicy(丢弃最旧策略) * 行为:丢弃队列中最老的任务(最早进入队列的),然后重新尝试提交新任务 * 适用场景:优先处理新任务,允许旧任务过期 */ // executor.setRejectedExecutionHandler( // new ThreadPoolExecutor.DiscardOldestPolicy()); //配置完成,初始化 executor.initialize(); return executor; } }

创建线程代码

taskExecutor.execute(() -> { //线程池执行代码 //发送短信,邮件 //异步修改订单状态等 });

压力测试-获取线程池配置

ps:纯理论,从AI那得到的信息

描述

  • 最好在生产环境下压测
  • 根据调整并发数看压测结果,来调整线程池配置

下载压测工具

打开 Apache JMeter 的官方下载页面:https://jmeter.apache.org/download_jmeter.cgi

点击 apache-jmeter-5.6.3.zip apache-jmeter-x.x.x.zip,下载压缩包 如:apache-jmeter-5.6.3.zip

解压后双击bin/jmeter.bat即可运行

压测工具配置

改成中文

测试计划配置

定义测试计划名称

在左侧的“测试计划”上点击鼠标右键,选择添加->线程(用户)->线程组

线程组配置

  • 线程数:并发用户数(同时执行请求的线程数量)

  • Ramp-Up时间:启动所有线程所需的时间,例如:线程数=10Ramp-Up=5秒→ 每秒启动2个线程

  • 循环次数:每个线程执行请求的次数,总请求数 = 线程数 × 循环次数

  • 调度器:

    • 不勾选调度器:线程启动后,执行完循环次数就结束,总请求数 = 线程数 × 循环次数(固定)

    • 勾选调度器:循环次数此时会失效(或建议设为“永远”);线程会在持续时间内反复执行;启动延迟:是指调度器延迟多久开始执行,只延迟一次

下图配置:1秒内启动1000个线程,在线程全部启动后,120秒内线程会重复执行,总时长 1(Ramp-Up时间) + 120(持续时间) =121秒

每次修改线程组需要保存,最好清除一下聚合报告再启动

单接口配置

目标请求配置

在刚建好的“线程组”上点击鼠标右键。选择添加->取样器->HTTP请求

  • 请求名称:自定义
  • 协议:http 或 https
  • 服务器名称或ip:自己根据服务器配置,本地的话配 localhost
  • 端口号:自己根据代码配置
  • HTTP请求:自己根据接口配置
  • 路径:自己根据接口配置
下图配置: GET http://localhost:8080/hello
监听器配置

还是在“线程组”上点击鼠标右键。选择添加->监听器->聚合报告

也可以多加个查看结果树,它能显示每个请求的详细请求数据和返回结果,方便你第一时间确认脚本配置是否正确,压测的时候禁用查看结果树(右键 -> 禁用),会消耗大量本地的CPU和内存资源,导致测试结果不准确

聚合报告:分析时用。压测结束后,这个报告会汇总关键数据,比如平均响应时间吞吐量(TPS)错误率等。这些就是你调整线程池配置的重要依据

多接口配置

吞吐量控制器

右键线程组 →添加逻辑控制器吞吐量控制器

下图配置,按百分比分配请求,并且占比50%,如果多个吞吐量控制器总数不是100%,会按比例分配

目标请求配置

在刚建好的多个“吞吐量控制器”上点击鼠标右键。选择添加->取样器->HTTP请求,分别配置多个接口,其他跟上面跟单接口配置一样一样配置

监听器配置

在线程组新建,跟上面跟单接口配置一样一样配置

查看聚合报告

聚合报告
指标描述数值
样本数本次压测中,总共发送的请求数量(总请求数)1,922,779
平均值所有请求的平均耗时62 ms
中位数50%的请求 ≤ 这个值64 ms
90%分位90%的请求在 X ms 内完成85 ms
95%分位95%的请求在 X ms 内完成92 ms
99%分位99%的请求在 X ms 内完成118 ms
最小值最快响应时间0ms
最大值最慢响应时间1298 ms
异常率失败请求占比0.07%
吞吐量每秒处理的请求数(QPS)16,030 /秒


压测数据导出

如果有压测目标,则直接按目标配置线程组数量,如果没有,则慢慢增加压测线程数直到吞吐量最大值,得出最大值后,优化代码,线程池,数据库,缓存,架构等优化

每个压测数量最好跑3次,取平均值
ps:可以把数据发给AI 让AI帮忙整理分析,给建议

修改代码线程池配置

根据项目类型初步配置代码线程池参数

初步线程池配置
任务类型特点线程池max 建议线程数原因

CPU 密集型

大量计算,CPU一直忙

CPU 核心数 + 1

避免上下文切换

IO 密集型

等待数据库/网络/磁盘

CPU 核心数 × (1 + IO等待时间/CPU时间)

让 CPU 不空闲

混合型

两者都有

根据压测调整

找拐点

根据吞吐量,请求耗时,调整线程池最大值以及队列长度

生产环境线程池配置

AI答复:生产环境在压测最优值(10/50/100)基础上放大 20-50%,推荐 core=20, max=100, queue=300,既能应对突发,又不浪费资源


压测完成后,根据数据检查这5个问题:

1. 异常率是否 > 1%? → 是:修错误 | 否:继续
2. 99%分位是否超过预期? → 是:优化响应 | 否:继续
3. 吞吐量是否达到目标? → 是:达标 | 否:扩容/优化
4. 资源利用率是否合理? → CPU/内存/连接池是否打满
5. 波动是否过大? → 中位数与平均值是否接近

http://www.jsqmd.com/news/513433/

相关文章:

  • Tao-8k代码审查实战:自动发现潜在缺陷与安全漏洞
  • 音频设备管理工具效率革命:无缝切换体验指南
  • 《爬虫对抗:ZLibrary反爬机制实战分析》
  • 用FDTD算法仿真超透镜:探索光学世界的新视角
  • HUNYUAN-MT 7B翻译终端Win11右键菜单集成:快速翻译选中文本
  • 无锡市智能体应用开发源头公司在模型训练、工具链与私有化部署上的实践特点
  • 单细胞测序宝藏:扎实的教学视频与代码分享
  • Qwen3-32B-Chat API服务部署案例:Python调用/v1/chat/completions接口详解
  • 小悦智险:保险全链路智能运营平台
  • OpenClaw硬件加速方案:QwQ-32B模型在M系列MacGPU优化
  • 2026年大健康包装定制厂家推荐:钙片包装盒/高端健康礼盒/企业礼品定制专业供应商 - 品牌推荐官
  • 低成本玩转AI:Qwen3-0.6B本地化部署实践
  • 深度强化学习驱动的混合RIS辅助ISAC系统波束成形设计
  • Qwen3.5-9B企业落地:物流单据图像理解+运单信息结构化提取
  • 实际运行的资产和设备管理系统平台源码(Java)
  • 光伏发电、电池储能与Simulink仿真:MPPT(增量导纳法)与双向buck/boost电路
  • 别再为PBR贴图转换头疼了!Photoshop/SP手把手教你Metal/Roughness与Spec/Gloss互转(附PS动作文件)
  • 锂电池 MEKF 算法实现动力电池参数与状态多尺度联合估计:文献复现之旅
  • 嵌入式Linux多线程CPU占用精确定位方法
  • 单片机控制220V交流通断:可控硅替代继电器的工程实践
  • Qwen-Image-2512-SDNQ WebUI实战教程:自定义宽高比+种子复现+下载自动化
  • WebStorm插件避坑指南:3步实现微信小程序API智能提示(2023实测版)
  • GraphicsDisplay嵌入式图形显示基类详解
  • 实用工具】简便易用的齿轮生成器,支持多种常见齿轮类型,点击即可重新生成并编辑参数(含creo格式)
  • Face3D.ai ProCI/CD:GitHub Actions自动化构建Docker镜像与健康检查
  • KART-RERANK赋能CSDN技术社区:个性化内容推荐与排序
  • SUPER COLORIZER在AIGC全链路中的角色:从文本生图到智能上色的自动化管线
  • Qwen3-Reranker-0.6B在.NET项目中的集成方案
  • 行政空调总忘关?RPA按时间开关,每月省600度电
  • 信捷XD与3台三菱E700通讯程序开发之旅