【线程池】面试被问到线程池参数如何配置时该如何回答

news2024/12/1 0:39:17

       前言

        没有基于业务场景,直接抛出这个问题,等同于耍流氓。

        八股文告诉我们CPU密集型就核心数+1,IO密集型就核心数*2,那么真实业务中该怎么去配置呢。

        方法论还是有的

        1.需要分析线程池执行的任务的特性: CPU 密集型还是 IO 密集型
        2.每个任务执行的平均时长大概是多少,这个任务的执行时长可能还跟任务处理逻辑是否涉及到网络传输以及底层系统资源依赖有关系
        如果是 CPU 密集型,主要是执行计算任务,响应时间很快,cpu 一直在运行,这种任务 cpu的利用率很高,那么线程数的配置应该根据 CPU 核心数来决定,CPU 核心数=最大同时执行线程数,加入 CPU 核心数为 4,那么服务器最多能同时执行 4 个线程。过多的线程会导致上下文切换反而使得效率降低。那线程池的最大线程数可以配置为 cpu 核心数+1 如果是 IO 密集型,主要是进行 IO 操作,执行 IO 操作的时间较长,这是 cpu 出于空闲状态,导致 cpu 的利用率不高,这种情况下可以增加线程池的大小。这种情况下可以结合线程的等待时长来做判断,等待时间越高,那么线程数也相对越多。一般可以配置 cpu 核心数的 2 倍。
        一个公式:线程池设定最佳线程数目 = ((线程池设定的线程等待时间+线程 CPU 时间)/
线程 CPU 时间 )* CPU 数目
        这个公式的线程 cpu 时间是预估的程序单个线程在 cpu 上运行的时间(通常使用 loadrunner测试大量运行次数求出平均值)




        日常业务线程池的配置,项目中比比皆是,线程池的参数设置大多基于开发任务人员的经验,基于对项目的熟悉,基于对屎山了如执掌。

        假如啊一个新瓜蛋子刚来项目,接到要给业务人员发通知邮件,小同志很有想法,邮件嘛,异步发,搞个线程池,还不影响业务,咔咔一顿开发,参数就按照网上通用的来,IO密集型,核心线程数就CPU核心数*2吧。

        老油条一看你这可不太行,这邮件本身也不重要,你搞这么多线程数很容易影响核心业务,

随手就从屎山的角落掏出一堆线程池告诉你,现在这个屎山可不稳定,回头项目上线一爆炸,很容易大家都一身屎,天天开发shift也不用按了,先把shit清了再说。

        像这种边缘业务场景,核心线程数及最大线程数设置为1个就行了,队列大小嘛,按照现在业务量来说设置个1000个,满满的够了。

        基于业务场景设置线程池参数,开发人员必须对业务和项目足够深度的了解,很深的那种,至少要到业务一加需求,有底气摇头say no。

        但是,但是,但是,在复杂的业务场景下,我们总能找到一些规律,线程池这个不安分的炸弹也会被我们揪到一些蛛丝马迹。

        我举个例子。

例子一

        我们的职位详情页展示数据来源较多,涉及多方的业务,比如职位信息,企业信息,HR信息,还有风险提示等等

        职位详情页是我们兼职服务的一个核心业务功能点,如果串行处理,在业务高峰期很容易响应过慢。

        这个时候我们需要使用多线程的查询组装页面信息,线程池无疑是一个不二的选择。

        首先这是个IO密集型业务,没有复杂的计算逻辑,对于参数设置,开始我们配置核心线程数50,最大线程数都是100个,阻塞队列1000,拒绝策略执行后降级处理。

        核心线程数及最大线程数尽可能的大,防止详情页挂掉,正常请求耗时很少,线程数足够的话,业务高峰也不会有问题。

例子二

        我们有个内部的业务系统,核心业务是使用Excel模板导入大量数据,然后标准化存储后,推送给第三方使用。

        导入的业务数据需要层层清洗及计算,CPU密集型,这里我们线程池的配置就不能像上个例子那么配置了,选择较少的线程数,然后队列配置的大一些。

结语

        有些我认为标准化的线程池配置,我列举出来,大家来找茬

  1. 自定义线程池
  2. 不适用吴姐队列队列
  3. 选用合适的拒绝策略

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

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

相关文章

【操作】安防监控/视频汇聚/视频云存储EasyCVR平台AI智能分析网关V3接入教程2.0

TSINGSEE的边缘计算硬件智能分析网关V3内置多种AI算法模型,包括人脸、人体、车辆、车牌、行为分析、烟火、入侵、聚集、安全帽、反光衣等等,可应用在安全生产、通用园区、智慧食安、智慧城管、智慧煤矿等场景中。将网关硬件结合TSINGSEE青犀的视频汇聚/安…

数据结构-01 数据结构基本概念,算法时间复杂度,空间复杂度

0 数据结构概述 四门课的关系 1 绪论 数据对象、数据元素、数据项关系 1.1 数据结构的基本概念 1.2 算法和算法评价 小练习 空间复杂度中的递归调用 n只是传入 n也是数组,计算存储数组flag的空间大小

HTTPS协议和SOCKS5协议的区别

HTTPS协议和SOCKS5协议是两种不同的网络协议,它们在传输数据的方式、安全性和使用场景等方面都有所不同。下面将介绍HTTPS协议与SOCKS5协议的区别。 传输数据的方式 HTTPS协议是一种基于HTTP协议的安全协议,它使用SSL/TLS协议对数据进行加密和解密。在传…

Kafka3.0.0版本——消费者(独立消费者消费某一个主题数据案例__订阅主题)

目录 一、独立消费者消费某一个主题数据案例1.1、案例需求1.2、案例代码1.3、测试 一、独立消费者消费某一个主题数据案例 1.1、案例需求 创建一个独立消费者,消费firstTopic主题中数据,所下图所示: 注意:在消费者 API 代码中必…

时序预测 | MATLAB实现CNN-LSTM卷积长短期记忆神经网络时间序列预测(风电功率预测)

时序预测 | MATLAB实现CNN-LSTM卷积长短期记忆神经网络时间序列预测(风电功率预测) 目录 时序预测 | MATLAB实现CNN-LSTM卷积长短期记忆神经网络时间序列预测(风电功率预测)预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1…

Matlab 如何把频谱图的纵坐标设置为分贝刻度

Matlab 如何把频谱图的纵坐标设置为分贝刻度 Matlab代码如下: % 如何把频谱图的纵坐标设置为分贝刻度 % % pr2_2_6 clc; clear; close all;load pr2_2_6_sndata1.mat % 读入数据 X fft(y); % FFT n2 1:L/21; % 计算正频率…

天翼云不做备案接入,如何绑定域名,不用80端口,443端口。

443,80端口不开启。 第一步: 宝塔更改web端口 搞个复杂的端口。 第二步: 在天翼云策略组上面开启修改过的web端口。 第三步:接入cdn,端口改成修改过的端口。

EVA: Visual Representation Fantasies from BAAI

本文做个简单总结,博主不是做自监督领域的,如果错误,欢迎指正。 链接 Code: Official:baaivision/EVA MMpretrain:open-mmlab/mmpretrain/tree/main/configs/eva02 Paper: EVA01:…

LAMP搭建WordPress

L linux A apache hhtpd M mysql/maridb P PHP1、 安装php yum -y install php php-fpm php-server php-mysql1.1、 启动php-fpm并自启 systemctl enable php-fpm --now[rootecs-1cee ~]# systemctl status php-fpm ● php-fpm.service - The PHP FastCGI Process ManagerLoa…

Ae 效果:CC Cross Blur

模糊和锐化/CC Cross Blur Blur & Sharpen/CC Cross Blur CC Cross Blur(CC 交叉模糊)可以通过单独控制水平和垂直方向的模糊程度来创建独特的交叉模糊效果,可以产生类似光线交错的视觉外观。 ◆ ◆ ◆ 效果属性说明 Radius X 半径 X 用…

CSS笔记(黑马程序员pink老师前端)盒子阴影,文字阴影

盒子阴影 属性值为box-shadow,盒子阴影不占空间,不影响盒子之间的距离. 值说明h-shadow必需,水平阴影位置,允许为负值v-shadow必需,水平阴影位置,允许为负值blur可选,模糊距离,数值越大影子越模糊spread可选,影子的尺寸color可选,影子的颜色inset可选, 将外阴影改为内阴影(省…

Python调试学习资料

Python调试学习资料 python -m pdb example.py网络资源 Python代码调试的几种方法总结Python 程序如何高效地调试?Python Debugging With Pdbpdb — The Python DebuggerThe Python Debugger (pdb)Python Debugger with Examples

Redis常用命令和Java操作Redis教程

Redis介绍 关系型数据库(RDBMS)非关系型数据库(NoSql)MysqlRedisOracleMongo dbDB2MemCachedSQLServer Redis是一个基于内存的key-value结构的数据库。 特点: 基于内存存储,读写性能高适合存储热点数据(…

Java8特性-Lambda表达式

📕概述 在Java 8中引入了Lambda表达式作为一项重要的语言特性,可以堪称是一种语法糖。Lambda表达式使得以函数式编程的方式解决问题变得更加简洁和便捷。 Lambda表达式的语法如下: (parameters) -> expression (参数) -> {代码}其中&…

Apache HTTPD 漏洞复现

文章目录 Apache HTTPD 漏洞复现1. Apache HTTPD 多后缀解析漏洞1.1 漏洞描述1.2 漏洞复现1.3 漏洞利用1.4 获取GetShell 2. Apache HTTPD 换行解析漏洞-CVE-2017-157152.1 漏洞描述2.2 漏洞复现2.3 漏洞利用 3. Apache HTTP Server_2.4.49 路径遍历和文件泄露漏洞-CVE-2021-41…

字体图标 IcoMoon

字体图标 展示的是图标,本质是字体。 轻量级︰一个图标字体要比一系列的图像要小。一旦字体加载了,图标就会马上渲染出来,减少了服务器请求 灵活性:本质其实是文字,可以很随意的改变颜色、产生阴影、透明效果、旋转等 兼容性:几乎…

MySQL视图用户管理

文章目录 视图视图的规则用户用户信息创建用户删除用户修改密码 用户权限给用户授权回收权限 视图 视图是一个虚拟表,其内容由查询定义。同真实的表一样,视图包含一系列带有名称的列和行数据。视图的数据变化会影响到基表,基表的数据变化也会…

@controller和@RestController的区别

//controller和RestController的区别:RestController的返回值就是结果被输出在浏览器 //controller的返回值会到resources的templates下找 返回值".html" 页面 1.controller 简单的来说,当我们的返回值需要跳转大另一个页面时候,我们就会使…

Jmeter系列-环境部署、详细介绍、安装目录介绍(1)

环境部署 官网下载Jmeter http://jmeter.apache.org/下载最新版本的 JMeter,解压文件到任意目录 安装JDK,配置Java环境 网上教程很多,这里就不详细介绍了 注意:应该避免JDK安装路径,Jmeter路径有中文和空格 配置…

多波束测线问题

多波束测线问题 问题的背景是海洋测深技术,特别是涉及单波束测深和多波束测深系统。这些系统利用声波传播原理来测量水体深度。 单波束测深系统通过向海底发射声波信号并记录其返回时间来测量水深。该系统的特点是每次只有一个波束打到海底,因此数据分布…