谈谈JSF业务线程池的大小配置 | 京东物流技术团队

news2024/9/21 4:40:21

1.简介

JSF业务线程池使用JDK的线程池技术,缺省情况下采用Cached模式(核心线程数20,最大线程数200)。此外,还提供了Fixed固定线程大小的模式,两种模式均可设置请求队列大小。

本文旨在通过一个简化场景(“单服务应用”)下的负载测试,为“JSF业务线程池大小配置”提供基准测试结果,并形成一些普遍适用的结论。

本文的目标读者包括需要合理配置JSF线程大小的压测工程师、开发部署运维工程师以及架构师。本文不涉及JSF服务端的其他配置项,也不针对“复合服务应用”的合理配置进行探讨。你可以利用本文提供的结论,作为设计压测用例或评估业务线程池大小的基本方法的参考,以便在实践中合理配置JSF业务线程池大小。需要注意的是,JSF业务线程池大小的合理配置应该基于高保真的负载测试结果。

“单服务应用”指应用仅包含一个提供接口,且接口中仅有一个方法。

“复合服务应用”则指应用包含多个提供接口或一个接口中含有多个方法。

2.测试用例说明

本次基准测试选取了USF3.0权限系统,将其定制化为一个单一的服务提供者,仅对该提供者的一个方法进行了测试,因此可以看作是一个“单服务应用”。测试中将CPU作为基准测试的核心资源,并考虑到JVM垃圾收集器的影响,采用了简单的测试数据以保证服务每次调用的一致性,并确保YGC具有规律性(即固定调用量会导致一次30+ms的YGC),无FGC的影响。

测试用例的设计中,所有依赖的服务资源都无限制,以确保测试过程中服务的可用率达到100%。我们的关键性能指标是TP99,即服务响应时长的99%必须小于10ms。

为了测试不同线程池模式下的性能表现,我们使用了JSF线程池的Cached和Fixed两种模式,并针对每种模式进行了多组测试,以得出在满足TP99<10ms的前提下,系统最大的负载情况。

测试应用: USF3.0权限系统(定制化处理)

测试服务: com.jd.susf.service.api.SusfPermissionService#findUserInfo,根据用户信息从Redis中查询一条数据返回的服务。

硬件配置: 单台4C 8G

测试方法: 在Forcebot系统采用了阶梯发压的方式对JSF业务线程池在Cached和Fixed模式下进行了系统负载测试

拟定SLA要求: 服务响应时长的TP99<10ms

注:我们对USF3.0权限系统进行了定制,调整了服务提供方的配置数据,仅保留了 com.jd.susf.service.api.SusfPermissionService。

3.测试结果及分析

3.1.cached线程池的系统负载

图:JSF默认线程池(cached, threads=200)在不同并发用户数(1-200)下的系统负载图

并发用户数TP99吞吐量TPSCPU利用率(%)
1~23<8ms线性增长线性增长
248ms655399.62
2511ms660799.83
26~79迅速增长缓慢增长99+
8074ms692899.82
81~199缓慢增加缓慢下降99.82
20099ms623099.94

小结:默认的JSF线程池配置存在很大的风险。系统最大可支持24个并发,超过24个并发SLA就无法满足。

3.2 fixed线程池(队列)的系统负载

图:JSF固定线程池(fixed+队列)在不同并发用户数(1-50)下的系统负载图

JSF业务线程数可支持的最大并发用户数TP值(50/90/99/999)吞吐量(TPS)CPU最大利用率(%)
4117/8/10/18153127.67
8258/8/10/18311346.45
16508/8/10/21622887.97
20233/4/10/15640999.92
24223/4/7/15617899.86
25223/4/6/15618298.83

表:JSF固定业务线程池(fixed+队列)在满足TP99<10ms的系统最大负载(最大并发用户数)

小结:

① 在fixed线程模式下,CPU的利用率存在使用上限。

② 队列的使用可以有效增加系统对并发量的支持,同时也会带来吞吐量的提升。然而,由于任务在队列中等待,服务的响应时间会出现“水涨船高”的现象,存在一定风险。

3.3 fixed线程池的系统负载

图:JSF固定线程池(fixed)模式下,系统最大并发用户数时的系统负载

JSF业务线程数并发用户数TP99吞吐量(TPS)CPU最大利用率(%)
445106320.26
885221636.62
16166426268.56
20205555086.22
24248671199.62
252516664498.77
262619674499.93

小结:综合固定线程池(fixed)的性能表现,需要设置一个合理的线程数大小来平衡CPU资源的充分利用和满足SLA的需求,线程数过小会导致CPU资源浪费,线程数过大则无法满足SLA

4.结论

根据测试结果和数据分析,我们得出以下结论:

  • JSF线程池的默认配置在并发量高的场景下存在风险: 所有线上生产环境中的JSF服务所在的服务器,很少有能够在200个线程的情况下还能够满足SLA的。最大200个线程的线程池配置,将服务器置于“并发量高的场景下被压垮”的风险中。线程池大小的合理配置应该来自高保真的负载测试。
  • 足量的线程数才能保证资源(CPU)的利用率: 业务型的服务通常都存在一定的IO操作(网络,磁盘等),线程执行过程中会发生等待,CPU利用率不高,需要增加并发的线程数量,让更多的线程参与CPU的分配,才能提高CPU的利用率。服务中IO操作越多,等待时长越长,需要的并发线程就越多。对于有IO操作的业务型服务,负载测试的线程数可以从2N(N是服务器的CPU核数)开始。
  • 过多的线程数只会降低系统的SLA: 当线程数已能100%利用CPU后,增加线程数,线程就无法获取足够的CPU分配,这样服务的响应时间就会增大。在一定范围内,TP99还可能满足SLA的要求,系统的吞吐量也会有少量的增加。再持续增加线程数,TP99就无法满足系统的要求,系统的吞吐量也会开始下降。
  • 固定的线程数可以保护系统需要承担的负载能力:固定线程数可以保证系统对CPU的利用率限定在一定的负载范围内,保护系统稳定运行,保证响应时间TP99,但也限定了系统的并发能力。合理设置队列大小可以增加系统的并发度,也不会影响系统TP99,但会整体拉高服务的响应时间,出现不稳定性的变化,存在风险。
  • 让CPU100%的高负载运行: 通常服务对外的SLA承诺通常高于服务真实的性能,这是因为我们考虑了基础设施及依赖服务的不稳定性。因此,即使CPU已经达到了100%,我们仍然可以增加一定数量的线程数,而不会影响对外的响应时间TP99的承诺。这样可以提高系统的并发能力。虽然系统可以在高负载下运行,但我们需要进一步进行稳定性测试,以提高系统的可靠性。

综上所述,线程池大小的合理配置需要结合业务需求和系统资源情况进行评估和测试,并预留合理的buffer空间,以保证系统稳定运行和满足用户的SLA。

5.附录

附录一:统计指标及术语说明

并发用户数:同时发起请求的用户数。

TP值(50/90/99/999) :客户端的TP值,单位ms,数据来源于Forcebot。

吞吐量TPS:数据来源于Forcebot。

CPU利用率(%) :数据来源于PFinder。

JSF业务线程数:JSF业务线程池的线程数,如:<jsf:server id=“jsf” protocol=“jsf” threadpool=“fixed” threads=“16” />

fixed/cached:JSF业务线程池的线程池类型,如:<jsf:server id=“jsf” protocol=“jsf” threadpool=“fixed” threads=“200”/>

作者:京东物流 刘江波

来源:京东云开发者社区 自猿其说Tech 转载请注明来源

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

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

相关文章

如何利用python来提取SQL语句中的表名称

1.介绍 在某些场景下&#xff0c;我们可能需要从一个复杂的SQL语句中提取对应的表名称&#xff0c;在这样的场景下&#xff0c;我们如果在python中处理的话&#xff0c;就需要用到SQLparse这个库。 SQLparse 是一个用于解析 SQL 查询语句的 Python 库。它可以将复杂的 SQL 查询…

解决js计算小数不准的问题

1.使用计算函数 function accAdd(arg1, arg2) {var r1, r2, m;try { r1 arg1.toString().split(".")[1].length } catch (e) { r1 0 };try { r2 arg2.toString().split(".")[1].length } catch (e) { r2 0 };m Math.pow(10, Math.max(r1, r2));retur…

2023年9月北京/广州/深圳DAMA-CDGP数据治理专家认证报名

DAMA认证为数据管理专业人士提供职业目标晋升规划&#xff0c;彰显了职业发展里程碑及发展阶梯定义&#xff0c;帮助数据管理从业人士获得企业数字化转型战略下的必备职业能力&#xff0c;促进开展工作实践应用及实际问题解决&#xff0c;形成企业所需的新数字经济下的核心职业…

el-form表单中不同数据类型对应的时间格式化和校验规则

1. 在表单中, 当选择不同的数据类型时, 需要在下面选择时间时和数据类型对应上, 通过监听数据类型的变化, 给时间做格式化, 2. 但是当不按顺序选择数据类型后, 再选时间可能会报错, 所以需要在dom更新后, 再清空表单. 3. 校验规则, 结束时间需要大于开始时间, 但是不能选当前的…

报错ssh: Could not resolve hostname

…按照网上好多教程试了一下&#xff1a; 新建密钥&#xff0c;添加到gitee&#xff0c;重新测试。修改host&#xff0c;加入gitee的ip地址到里面去。修改.gifconfig配置文件&#xff0c;配置成ssh的仓库链接。 这上面的方法都不行&#xff0c;后面发现一篇文章&#xff1a;SS…

Spring 6.X IoC 容器

目录 一、Spring IoC 容器和 Bean 简介1.1、容器概述1.3、使用 一、Spring IoC 容器和 Bean 简介 下面主要介绍 Spring 框架对控制反转 (IoC) 原理的实现 首先要说明的是&#xff1a;IoC 也称为依赖注入&#xff0c;这是一个过程。 其次依赖项的定义&#xff1a;对象仅通过构造…

RSS订阅无需代码连接Outlook的方法

RSS订阅用户使用场景&#xff1a; 一家专门做书籍测评的企业&#xff0c;其日常工作中需要收集豆瓣上最受欢迎的书籍进行测评。为了确保测评的准确性和客观性&#xff0c;团队成员需要定期在Outlook上创建会议讨论新书&#xff0c;从不同角度对书籍进行深入剖析。然而&#xff…

Ansys Zemax | 如何将光线追迹结果导出为IES格式

照明系统设计者通常需要向客户提供IES格式的数据。照明工程学会 (Illuminating Engineering Society&#xff0c;IES) 文件格式便于传输辉度数据&#xff0c;该格式得到了制造商和设计师的广泛认可。本文描述了如何生成IES文件并验证结果。&#xff08;联系我们获取文章附件&am…

24张架构图讲透数据治理核心内容

加ghz“大数据食铁兽”&#xff0c;了解更多大数据资讯&#xff01; 一、数据治理的框架和核心内容 不同的利益相关者群体对数据治理的关注点不一样&#xff0c;因此各自的视图也不一样。其中管理者视图可以概括为“五域模型”&#xff0c;分别是“管控域”、“过程域”、“治…

虹科干货 | 码住!虹科工业树莓派应用小tips!

文章来源&#xff1a;虹科工业物联网 点此阅读原文&#xff0c;获取更多干货资料 虹科工业树莓派应用小tips 在应用虹科工业树莓派进行项目开发的过程中&#xff0c;我们会应用到各种功能&#xff0c;部分功能看似不起眼&#xff0c;但是在实际应用开发过程中却非常重要。接…

[C题]2023 年全国大学生数学建模比赛思路、代码更新中.....

&#x1f4a5;1 概述 在生鲜商超中&#xff0c;一般蔬菜类商品的保鲜期都比较短&#xff0c;且品相随销售时间的增加而变差&#xff0c;大部分品种如当日未售出&#xff0c;隔日就无法再售。因此&#xff0c;商超通常会根据各商品的历史销售和需求情况每天进行补货。由于商超销…

输送机安装的注意事项

输送机也称输送线&#xff0c;是指在自动化生产过程中起到运输和过渡作用的线体&#xff0c;一般常用的输送机有&#xff1a;滚筒线、皮带线、链条线、链板线等。但无论是哪种输送机&#xff0c;都会涉及到安装的问题&#xff0c;今天我们就从专业的角度来和您分享一下输送机安…

软件供应链安全在金融机构中的最佳实践 | 金融系统安全实战专题交流会圆满成功

9月6日&#xff0c;由广东省粤港澳合作促进会金融专业委员会和粤港澳大湾区金融创新研究院联合举办&#xff0c;开源网安协办的“2023年金融系统安全运营与实战专题交流会”圆满落幕。本次会议紧紧围绕加强安全运营中心建设、应对风险、加强数据安全治理&#xff0c;保障数据安…

字节一面:css选择器有哪些?优先级?哪些属性可以继承?

前言 最近博主在字节面试中遇到这样一个面试题&#xff0c;这个问题也是前端面试的高频问题&#xff0c;作为一名前端开发工程师&#xff0c;css是我们的必备技能&#xff0c;熟悉css选择器以及继承是我们写好css的关键&#xff0c;博主在这给大家细细道来。 &#x1f680; 作者…

PHP实现微信小程序状态检测(违规、暂停服务、维护中、正在修复)

实现原理 进入那些状态不正常的小程序会被重定向至一个Url&#xff0c;使用抓包软件抓取这个Url&#xff0c;剔除不必要参数&#xff0c;使用cURl函数请求网页获得HTML内容&#xff0c;根据内容解析出当前APPID的小程序的状态。 代码 <?php// 编码header(Content-type:ap…

Flink--2、Flink部署(Yarn集群搭建下的会话模式部署、单作业模式部署、应用模式部署)

星光下的赶路人star的个人主页 你必须赢过&#xff0c;才可以说不在乎输赢 文章目录 1、Flink部署1.1 集群角色1.2 Flink集群搭建1.2.1 集群启动1.2.2 向集群提交作业 1.3 部署模式1.3.1 会话模式&#xff08;Session Mode&#xff09;1.3.2 单作业模式&#xff08;Per-Job Mod…

业绩大变脸!上半年净亏1.1亿元,经纬恒润怎么了?

2023年上半年&#xff0c;中国汽车市场需求逐步恢复&#xff0c;智能电动汽车市场则呈现出了“高歌猛进”的现象&#xff0c;但经纬恒润却面临了业绩大变脸。 经纬恒润&#xff08;688326.SH&#xff09;成立于2003年&#xff0c;基于Mobileye方案顺利进入了ADAS前装量产市场&…

软件设计师(十二)多媒体基础

一、多媒体技术的基本概念 1、音频相关概念 PC处理的音频信号主要是人耳能听得到的音频信号 (audio) &#xff0c;它的频率范围是20Hz ~ 20kHz。 可听声包括&#xff1a;话音 (也称语言)&#xff1a;人的说话声&#xff0c;频率范围通常为300 ~ 3400Hz。 音乐&#xff1a;由乐…

电脑文件误删除如何恢复?这4个常用方法记好了!

“我怎么又误删了重要的文件啊&#xff01;这种情况已经不是第一次出现了&#xff0c;真的很让人烦恼&#xff01;大家在误删了重要的文件之后都是怎么恢复的呀&#xff1f;有什么好用的方法推荐吗&#xff1f;” 在日常使用电脑的过程中&#xff0c;误删文件的事大家可能都会遇…

鸿蒙系列-如何使用DevEco分析app的性能

如何使用DevEco分析app的性能 性能优化、启动优化、内存优化、FPS监测、性能分析&#x1f9d0; 在鸿蒙OpenHarmony开发过程中&#xff0c;开发者开发的代码&#xff08;Stage 模型&#xff09;通常以调用 ArkUI 框架的代码为主&#xff0c;主要优化的代码部分也在其中&#x…