线程池参数该怎么配置才能充分压榨CPU?

在这里插入图片描述

  • 🏃‍♂️ 微信公众号: 朕在debugger
  • © 版权: 本文由【朕在debugger】原创、需要转载请联系博主
  • 📕 如果文章对您有所帮助,欢迎关注、点赞、转发和订阅专栏!

目标

配置好线程池参数,压榨CPU,资本家看了都觉得惭愧!



前言

无论是个人项目或是公司项目,线程池参数配置得好与坏对于项目整体的运行情况都会有很大的影响!

Tips:有一定用户量使用的情况下🐶,如果没人用当我没说

文章目录

  • 目标
    • 配置好线程池参数,压榨CPU,资本家看了都觉得惭愧!
  • 步骤:
  • 一、区分项目是 CPU 密集型任务还是 I/O 密集型任务
    • CPU 密集型任务:
    • I/O 密集型任务:
  • 二、网络话术:CPU 密集型就采用 CPU 核数 + 1, I/O 密集型就是 CPU 核数 * 2
    • 以下三点是必须要考量的!
      • 🌴如果项目任务比较单一,线程池数量较少且业务需要更快的响应时间。
      • 🌳如果项目任务比较多,线程池定义也比较多,那么就要考虑定义多个线程池以及很多线程之间的 CPU 上下文切换问题。
  • 三、举例说明 I/O 密集型任务的线程池配置
    • 1、核心线程数量可以通过如下方法计算得出
    • 2、最大线程数量由核心线程数量扩大 1.5 倍即可
  • 四、假如项目任务数量很大,该配置顶不住咋搞?
    • 假如每秒的任务数量tasksNum范围是500 至 1000,每个任务花费的时间time假设为0.1s,系统允许容忍的最大响应时间ToleranceTime为1s
    • 此时,你的核心线程数量就应该这么计算
    • 那么阻塞队列的容器又该如何计算呢?
  • 五、总结
      • 每个项目关于线程池的参数都是不一样的,都是跟据业务以及系统整体负载定义的,只有多尝试,多比较,才能得出最优解!


步骤:

Tips:默认读者已经知晓线程池各个常用参数的含义,以及使用过线程池,此篇文章旨在如何设置参数的大小,才能更好的发挥CPU的威力。


一、区分项目是 CPU 密集型任务还是 I/O 密集型任务

CPU 密集型任务:

CPU 密集型任务是指那些主要消耗 CPU 计算能力的任务。这类任务通常需要大量的 CPU 计算资源来完成,而对于 I/O 资源的需求相对较少。

典型的 CPU 密集型任务包括数学计算、图像处理、加密解密、数据压缩等需要大量 CPU 计算的任务。

对于 CPU 密集型任务,最优化的资源利用是通过尽可能多地利用 CPU 运算能力来提高处理速度,因此线程池的配置应该注重于充分利用 CPU 核心,避免过度的线程竞争,提高计算效率。

I/O 密集型任务:

I/O 密集型任务是指那些主要消耗输入/输出操作的任务。这类任务通常需要等待 I/O 操作的完成,而 CPU 计算的需求相对较少。

典型的 I/O 密集型任务包括文件读写、网络通信、数据库操作等需要大量 I/O 操作的任务。

对于 I/O 密集型任务,最优化的资源利用是通过合理的异步处理、线程池的合理配置以及有效的 I/O 操作来减少等待时间,充分利用 CPU 时间处理其他任务。

CPU 密集型任务主要受限于 CPU 计算能力,而 I/O 密集型任务主要受限于 I/O 操作的速度。

在实际应用中,针对不同类型的任务选择合适的资源分配策略和线程池配置方案可以最大程度地提高系统的性能和资源利用效率。

二、网络话术:CPU 密集型就采用 CPU 核数 + 1, I/O 密集型就是 CPU 核数 * 2

线程池的参数是跟据业务以及系统整体负载定义的,并没有绝对公式。

以下三点是必须要考量的!

1、从整体的负载上,判断线程池数量多不多?
2、是否有大批量消耗 CPU 的任务?
3、线程池运行是否需要高实时?

🌴如果项目任务比较单一,线程池数量较少且业务需要更快的响应时间。

那么如果 I/O 密集型任务,核心线程数设置 CPU 核心数 * 5,最大线程数设置核心线程数 * 1.5。
经过测试,这种能更好压榨服务器 CPU。

🌳如果项目任务比较多,线程池定义也比较多,那么就要考虑定义多个线程池以及很多线程之间的 CPU 上下文切换问题。

因为,当你的线程数远远大于 CPU 且都在运行时,线程是拿不到 CPU 调度的。
这个时候,我们就该从全局角度上考虑将线程数调整小一些。

三、举例说明 I/O 密集型任务的线程池配置

1、核心线程数量可以通过如下方法计算得出

private Integer calculateCoreNum() {
        int cpuCoreNum = Runtime.getRuntime().availableProcessors();
        return new BigDecimal(cpuCoreNum).multiply(new BigDecimal("5")).intValue();
}

2、最大线程数量由核心线程数量扩大 1.5 倍即可

int maximumPoolSize = corePoolSize + (corePoolSize >> 1);

其他参数暂不做演示

四、假如项目任务数量很大,该配置顶不住咋搞?

还问呢?上报!升配置啊!没有什么问题是升级配置解决不了的!

假如每秒的任务数量tasksNum范围是500 至 1000,每个任务花费的时间time假设为0.1s,系统允许容忍的最大响应时间ToleranceTime为1s

此时,你的核心线程数量就应该这么计算

coreNum = tasksNum / (1/time) = (500 至 1000) / 10 = 50 至 100

又根据二八定律,如果80%的每秒任务数量小于800,那 coreNum 设置为 80 即可!

那么阻塞队列的容器又该如何计算呢?

BlockingQueueCapacity = coreNum / time * ToleranceTime = 80 / 0.1 * 1 = 800

▲图 / 懂了,马上开肝

五、总结

每个项目关于线程池的参数都是不一样的,都是跟据业务以及系统整体负载定义的,只有多尝试,多比较,才能得出最优解!



finally

如果大家觉得本文写得不错,别忘了给个赞哦!同时,如果您有任何疑问或建议,欢迎在评论区留言,让我们一起交流、探讨!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

云备份day03

📟作者主页:慢热的陕西人 🌴专栏链接:C云备份项目 📣欢迎各位大佬👍点赞🔥关注🚓收藏,🍉留言 主要内容介绍了第三方库httplib的一些内容,以及实现…

易宝OA getStockInRequestPrintDetail SQL注入漏洞复现

0x01 产品简介 易宝OA系统是一种专门为企业和机构的日常办公工作提供服务的综合性软件平台,具有信息管理、 流程管理 、知识管理(档案和业务管理)、协同办公等多种功能。 0x02 漏洞概述 易宝OA getStockInRequestPrintDetail 接口处存在SQL注入漏洞,未经身份认证的攻击者…

Promise和async/await

Promise是异步编程的一种解决方案,用来解决多层回调嵌套的问题。它的构造函数是同步执行的,then 方法是异步执行的,所以创建后里面的函数会立即执行,构造函数中的resolve和reject只有第一次执行有效,也就是说Promise状…

随手集☞MySQL部分知识盘点(loading。。。)

字段类型 数值类型 INT: 整数类型,可以是正数或负数。根据显示宽度和是否有符号,其范围会有所不同。TINYINT: 非常小的整数。SMALLINT: 小的整数。MEDIUMINT: 中等大小的整数。BIGINT: 大整数。FLOAT: 单精度浮点数。DOUBLE: 双精度浮点数。DECIMAL(M,N…

Oracle的物理结构解析

这些图是我自己画的,我也会在我的公众号【会用数据库】解析。理解起来非常简单,而且非常好记。不用死记硬背,有兴趣可以来公众号看呀。

GitOps - 为 OpenShift GitOps 配置邮件通知

《OpenShift 4.x HOL教程汇总》 说明:本文已经 在OpenShift 4.15 OpenShift GitOps 1.11.2 环境中验证 文章目录 ArgoCD 的 Notification 功能简介启动 OpenShift GitOps 的 Notification 功能配置邮件通知验证参考 说明:先根据《OpenShift 4 之 GitOp…

Peter算法小课堂—树状数组

大家好,我是人见人爱,花见花开,车见车爆胎的树状数组Peter Pan,hhh 讲正文前,先来一个长文警告⚠很重要的知识点:L SB(SB?) LSB 怎么算呢? 哦……懂了&…

环形链表2--绝妙的运算

一、要求 给定一个链表的头节点 head ,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。 如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统…

静态路由协议实验综合实验

需求: 1、除R5的换回地址已固定外,整个其他所有的网段基于192.168.1.0/24进行合理的IP地址划分。 2、R1-R4每台路由器存在两个环回接口,用于模拟连接PC的网段;地址也在192.168.1.0/24这个网络范围内。 3、R1-R4上不能直接编写到…

机器学习KNN最邻近分类算法

文章目录 1、KNN算法简介2、KNN算法实现2.1、调用scikit-learn库中KNN算法 3、使用scikit-learn库生成数据集3.1、自定义函数划分数据集3.2、使用scikit-learn库划分数据集 4、使用scikit-learn库对鸢尾花数据集进行分类5、什么是超参数5.1、实现寻找超参数5.2、使用scikit-lea…

【vite】

目录 vite介绍vite的基础应用vite创建项目vite创建vue3项目vite创建vue2项目vite创建react项目 vite中使用css的各种功能vite中使用ts vite介绍 一、特点: 开发时效率极高开箱即用,功能完备摄取丰富,兼容rollup超高速热重载预设应用和类库打…

vulhub中 Struts2-015 远程代码执行漏洞复现

影响版本: 2.0.0 - 2.3.14.2 ## 原理与测试 漏洞产生于配置了 Action 通配符 *&#xff0c;并将其作为动态值时&#xff0c;解析时会将其内容执行 OGNL 表达式&#xff0c;例如&#xff1a; xml <package name"S2-015" extends"struts-default"> …

上位机图像处理和嵌入式模块部署(qmacvisual之n点标定)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 工业场景中&#xff0c;很多时候图像是用来做测量的。虽然我们很希望载台是平的&#xff0c;摄像头是正对着拍摄物体的&#xff0c;但是运行时间长…

可视化图表:象形柱图,比柱图漂亮、有趣100倍。

一、什么是象形柱图 象形柱图&#xff08;Pictorial Bar Chart&#xff09;是一种可视化图表&#xff0c;它使用图形或图片代替传统的矩形柱子来表示数据。每个图形或图片的大小和形状都与对应的数据值相关联&#xff0c;从而形成一种视觉上的象征性表示。 象形柱图通常用于展…

【每日刷题】Day3

【每日刷题】Day3 &#x1f955;个人主页&#xff1a;开敲&#x1f349; &#x1f525;所属专栏&#xff1a;每日刷题&#x1f34d; 目录 1. 69. x 的平方根 - 力扣&#xff08;LeetCode&#xff09; 2. 70. 爬楼梯 - 力扣&#xff08;LeetCode&#xff09; 3. 118. 杨辉三…

STL容器(3)

1,stack容器 1.1 基本概念 概念&#xff1a;stack是一种先进后出的数据结构&#xff0c;它只有一个出口 因此&#xff1a; 栈中只有顶端的元素才可以被使用&#xff0c;因此占不允许有遍历行为 栈中进入数据称为--入栈&#xff08;push) 栈中弹出数据称为--出栈&#xff08…

【Linux】虚拟机连不上外网 (1),2024百度网络安全岗面试真题收录解析

vi /etc/sysconfig/network-scripts/ifcfg-ens33 BOOTPROTOstatic ONBOOTyes IPADDR? NETMASK? GATEWAY? dns18.8.8.8 dns1144.144.144.144 这两个必填 自我介绍一下&#xff0c;小编13年上海交大毕业&#xff0c;曾经在小公司待过&#xff0c;也去过华为、OPPO等大厂…

深入理解Armv9 DSU-110中的L3 cache

快速链接: 【精选】ARMv8/ARMv9架构入门到精通-[目录] &#x1f448;&#x1f448;&#x1f448; 关键词&#xff1a; DynamIQ cluster、DSU-110、DSU-120、DSU、cache、mmu、缓存、高速缓存、内存管理、MPAM 思考&#xff1a; 1、L1、L2、L3 cache的替换策略是怎样的&#xff…

Android中的aidl接口及案例说明

目录 一、什么是AIDL 二、AIDL语法规格 三、AIDL实例 客户端: 服务端: 一、什么是AIDL AIDL,即 Android Interface Definition Language,用于android不同进程间通信接口。同一个应用里面还是建议用正常接口实现功能即可。 官方说明:Android 接口定义语言 (AIDL) | …

如何使用屏幕变式控制SAP系统操作界面字段的必输、显示或隐藏

在SAP/ERP项目实施中经常会遇到要求把SAP系统操作的界面中某些字段设置为必输&#xff0c;显示或隐藏&#xff0c;遇到这种需求时&#xff0c;有些业务操作界面可以通过后台进行屏幕的字段状态设置解决&#xff0c;而有些业务的操作界面是没有屏幕字段的后台设置的&#xff0c;…