对于java线程池ThreadPoolExecutor监控以及参数动态调整的思考

news2024/11/19 3:27:14

https://mp.weixin.qq.com/s/baYuX8aCwQ9PP6k7TDl2Ww

Java线程池实现原理及其在美团业务中的实践 - 美团技术团队

上面两个链接都是一篇文章发布在不同地方,看其中一篇即可。

看到了美团技术团队的这篇文章以及加上自己对线程池的了解和看过的源码,有如下思考

对于线程池参数

对于线程池参数 corePoolSize 和 maximumPoolSize,业界没有一个很好的说法,但是目前一个比较好的做法如下

看当前线程池中要执行的任务是属于I/O密集型还是CPU密集型。

I/O密集型:线程频繁需要和磁盘或者远程网络通信,这种场景中磁盘的耗时和网络通信的耗时较大,意味着线程处于阻塞期间,不会占用CPU资源,所以线程数量设置超过CPU核心数并不会造成问题。

CPU密集型(计算型):对CPU利用率较高的场景,比如循环、递归、逻辑运算等,这种情况下线程数量设置越少,越能减少CPU的上下文频繁切换。

有一种建议如下,其中N表示CPU的核心数量。

  • I/O密集型,线程池大小设置为 2N+1。
  • CPU密集型,线程池大小设置为 N+1。

之所以需要+1,因为这样设置以后,线程在某个时刻发生一个页错误或者因为其他原因暂停时,刚好有一个额外的线程可以确保CPU周期不会中断。

对于CPU密集型,写了几个例子进行测试

测试机器为 intel i7 8 核,用一个幂运算来验证一下

public class ThreadTest {

    public static void main(String[] args) {
        int no = 10_000;
        long start = System.currentTimeMillis();
        for (int i = 0; i < no; i++) {
            Math.pow(2, 32);
        }
        long duration = System.currentTimeMillis() - start;
        System.out.println(duration);
    }
}

1万数据计算结果用时响应结果0

public class ThreadTest {

    public static void main(String[] args) {
        int no = 1_000_000;
        long start = System.currentTimeMillis();
        for (int i = 0; i < no; i++) {
            Math.pow(2, 32);
        }
        long duration = System.currentTimeMillis() - start;
        System.out.println(duration);
    }
}

100万数据计算结果用时响应结果5

public class ThreadTest {

    public static void main(String[] args) {
        int no = 1_000_000_000;
        long start = System.currentTimeMillis();
        for (int i = 0; i < no; i++) {
            Math.pow(2, 32);
        }
        long duration = System.currentTimeMillis() - start;
        System.out.println(duration);
    }
}

1亿数据计算结果用时响应结果5

由此可知,计算型任务用时很少。用时基本卡在 io 相关的操作上。

对于任务提交策略

快速响应用户请求

对于快速响应用户请求这种场景,除了调大 corePoolSize 和 maximumPoolSize,还需要修改默认的线程池策略。让我想到了 tomcat 的线程池策略。具体相关可以看下面本人之前写的文章。

https://blog.csdn.net/zlpzlpzyd/article/details/131992445

java ThreadPoolExecutor 默认策略如下

corePoolSize  -> 队列 -> maximumPoolSize -> 拒绝策略

这样有一个问题,如果需要马上执行的任务进队列阻塞不好,尤其是队列长度没设置的情况下,搞不好会内存溢出(尴尬)

tomcat ThreadPoolExecutor  策略如下

corePoolSize  -> maximumPoolSize -> 队列 -> 拒绝策略

具体可以参照 tomcat 的线程池 org.apache.tomcat.util.threads.ThreadPoolExecutor,这个就是一个很好的案例

快速处理批量任务

这种场景对于资源有消耗,但是对于时间要求没那么高,可以把队列设置大一些,慢慢处理。

线程池监控

目前想到的办法如下

设置一个定时任务,任务执行后每秒扫描 spring ioc 容器中所有注入的 ThreadPoolExecutor 实例,通过名称进行区分(执行过程可能不会有一个,通过名称尽心区分,看日志时也知道哪个线程池出了问题),通过 toString() 中打印的各个变量获取对应的 get 方法,封装为一个java类,将对应的信息插入 elasticsearch,通过 prometheus 进行线程池各个参数实时状态分析。

ThreadPoolExecutor 的 toString()

线程池参数动态调整

类似于美团的做法,通过页面配置的方式调整对应的线程池,需要清楚执行的任务对时间的容忍度考虑对应的线程池策略选择对应的线程池

页面配置参数提交后后台通过观察者模式触发监听器来修改 spring ioc 容器中对应名称的ThreadPoolExecutor 的 corePoolSize 和 maximumPoolSize 参数。

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

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

相关文章

app对接广告变现平台:影响app广告单价的4大因素

在移动应用开发者和媒体公司竞相寻求提高广告变现效率的今天&#xff0c;理解影响APP广告单价的关键因素至关重要。广告单价是广告收入的核心组成部分&#xff0c;它受多种因素的影响&#xff0c;直接关系到媒体的盈利能力。主要因素大概有以下几点&#xff1a;#APP广告变现# …

vue3+vite+uniapp 封装一个省市区组件

一、预览图 二、使用前的一些注意事项 只支持在 uniapp vue3 项目中使用支持微信小程序和h5 (app端没有测试过)ui库用的 uview-plus省市区数据用的是 vant-ui 提供的一个赖库 vant/area-data 三、组件代码 <template><u-popup :show"show" type"botto…

深圳市重点实验室如何办理-华夏泰科

深圳市重点实验室是为了提升科技创新的能力和水平&#xff0c;推动科技成果的转化和应用而设立的一项重要机构。同时深圳市重点实验室是开展高水平基础研究和应用基础研究、聚焦和培养优秀科技人才、开展学术交流的重要基地。认定该资质对于提升品牌影响力和科技创新能力有着重…

Elasticsearch实战(十八)--ES搜索Doc Values/Fielddata 正排索引 深入解析

1.正排索引与倒排索引 先说结论&#xff0c;再讲原理 !!!尽量不要再生产环境使用fielddatatrue&#xff0c;即使要用也要控制好占用内存比例的大小&#xff0c;否则容易出现OOM !!!尽量不要再生产环境使用fielddatatrue&#xff0c;即使要用也要控制好占用内存比例的大小&#…

剑指offer——JZ32 从上往下打印二叉树 解题思路与具体代码【C++】

一、题目描述与要求 从上往下打印二叉树_牛客题霸_牛客网 (nowcoder.com) 题目描述 不分行从上往下打印出二叉树的每个节点&#xff0c;同层节点从左至右打印。例如输入{8,6,10,#,#,2,1}&#xff0c;如以下图中的示例二叉树&#xff0c;则依次打印8,6,10,2,1(空节点不打印&a…

docker运维之自定义网络配置

自定义网络配置讲解与实操 docker中的容器有独立的隔离空间&#xff0c;那么&#xff0c;它们能不能通过网络相互访问呢&#xff1f; 答案是可以的&#xff01;作者在之前Redis篇中使用docker配置了主从、cluster集群&#xff0c;当时的做法是利用每个容器的ip地址和端口创建相…

一对一直播实时美颜SDK算法背后的技术原理与实现

美颜技术已经成为了现代社交媒体和视频通信的不可或缺的一部分。用户希望看起来最好&#xff0c;而实时美颜技术通过在实时视频中平滑皮肤、修复瑕疵以及增强特征来满足这一需求。这种技术的核心是实时美颜SDK&#xff0c;它蕴含着精密的算法和工程实现&#xff0c;本文将深入探…

成功解决@Async注解不生效的问题,异步任务处理问题

首先&#xff0c;有这样一个异步监听方法 然后配置好了异步线程池 package com.fdw.study.config;import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Conf…

维修派单系统好用吗?如何实现数字化后勤管理?

在当今社会&#xff0c;各种设备和设施的正常运转对于单位和组织来说至关重要。然而&#xff0c;由于各种因素的影响&#xff0c;设备和设施在日常运行过程中难免会出现故障。这时&#xff0c;高效的维修服务就显得尤为重要。而“的修”维修派单系统&#xff0c;就是一种专为维…

Java卷上天,可以转行干什么?

小刚是某名企里的一位有5年经验的高级Java开发工程师&#xff0c;每天沉重的的工作让他疲惫不堪&#xff0c;让他萌生出想换工作的心理&#xff0c;但是转行其他工作他又不清楚该找什么样的工作 因为JAVA 这几年的更新实在是太太太……快了&#xff0c;JAVA 8 都还没用多久&am…

怎么压缩pdf文件?分享缩小pdf文件的简单方法

在我们的日常生活和工作中&#xff0c;往往需要处理大量的PDF文件&#xff0c;而很多时候这些文件的大小会成为传输和存储的难题。为了解决这个问题&#xff0c;下面我们将介绍三种方法来压缩PDF文件&#xff0c;一起来看看吧~ 一、嗨格式压缩大师 首先&#xff0c;最简单也是…

Spring: @ComponentScan注解,不设置basePackages时,为什么会扫描该注解所在的包?

ComponentScanAnnotationParser类的parse方法&#xff1a; 可以看到如果没配置basePackages&#xff0c;会调用ClassUtils的静态方法getPackageName将声明ComponentScan的类所在的包添加到basePackages中去

山西电力市场日前价格预测【2023-10-08】

日前价格预测 预测说明&#xff1a; 如上图所示&#xff0c;预测明日&#xff08;2023-10-08&#xff09;山西电力市场全天平均日前电价为258.40元/MWh。其中&#xff0c;最高日前电价为496.19元/MWh&#xff0c;预计出现在18:45。最低日前电价为0.00元/MWh&#xff0c;预计出…

TouchDesigner专题_LeapMotion安装(win10系统)

如果你已经走到了其他教程的最后一步&#xff0c;出现报错 Connection failed.Ensure the device is connected and the correct version (4.1) of Leap Motion driver is installed 直接跳到最后一节就能解决 一、LeapMotion硬件 硬件部分很简单&#xff0c;就和手机数据线…

文件服务器审核

数据是所有组织的命脉&#xff0c;保护存储此重要资产的存储库对于防止不必要的暴露、盗窃和丢失至关重要&#xff0c;管理员和数据所有者应增强其文件服务器安全性、满足合规性要求等。 文件服务器审核工具 使用 DataSecurity Plus 无缝监控、警报和报告跨 Windows 文件服务…

深圳市重点实验室申报标准-华夏泰科

深圳市重点实验室&#xff0c;作为中国科技创新的引领者&#xff0c;扮演着关键的角色&#xff0c;旨在推动前沿科学研究和技术创新。申请重点实验室&#xff0c;可为企业带来莫大的荣誉并可为企业及机构提供宝贵的资源和支持&#xff0c;更可获得丰厚的现金支持。那么如何申请…

京东数据分析平台:2023年8月京东奶粉行业品牌销售排行榜

鲸参谋监测的京东平台8月份奶粉市场销售数据已出炉&#xff01; 鲸参谋数据显示&#xff0c;8月份京东平台上奶粉的销售量将近700万件&#xff0c;环比增长约15%&#xff0c;同比则下滑约19%&#xff1b;销售额将近23亿元&#xff0c;环比增长约4%&#xff0c;同比则下滑约3%。…

HiveServer2 Service Crashes(hiveServer2 服务崩溃)

Troubleshooting Hive | 5.9.x | Cloudera Documentation 原因&#xff1a;别人用的都好好的&#xff0c;我的集群为什么会崩溃&#xff1f; 1.hive分区表太多(这里没有说具体数量。) 2.并发连接太多&#xff0c;我记的以前默认是200个连接 3.复杂的hive查询访问表的的分区…

【Vue面试题一】、说说你对 Vue 的理解

文章底部有个人公众号&#xff1a;热爱技术的小郑。主要分享开发知识、学习资料、毕业设计指导等。有兴趣的可以关注一下。为何分享&#xff1f; 踩过的坑没必要让别人在再踩&#xff0c;自己复盘也能加深记忆。利己利人、所谓双赢。 面试官&#xff1a;有使用过vue吗&#xff…

Apple developer证书、标识符和描述文件

Apple developer证书、标识符和描述文件 一、准备1&#xff0c;开发者账号2&#xff0c;CSR文件3&#xff0c;DeviceID 二、过程1&#xff0c;证书&#xff08;Certificates&#xff09;2、标识符&#xff08;Identifiers&#xff09;3、描述文件&#xff08;Profiles&#xff…