Redian新闻
>
谈谈JSF业务线程池的大小配置

谈谈JSF业务线程池的大小配置

公众号新闻

来源 | OSCHINA 社区

作者 | 京东云开发者-京东物流 刘江波

原文链接:https://my.oschina.net/u/4090830/blog/10108824

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"/>


往期推荐



JS三大运行时对比:Deno、Bun和Node.js
deepin-IDE官宣背后:早已研发多年,惊喜还在后头
谷歌Android系统逆天操作 —— 监控 “为爱鼓掌” 频率?




这里有最新开源资讯、软件更新、技术干货等内容

点这里 ↓↓↓ 记得 关注✔ 标星⭐ 哦


微信扫码关注该文公众号作者

戳这里提交新闻线索和高质量文章给我们。
相关阅读
Chanticleer花园,溪水潺潺券业大事件!廉洁从业细则发布,各业务线负面清单出炉!不得以商业贿赂等方式招揽业务,有四大看点隆基绿能业绩说明会:未来5-6年,BC电池将会是晶硅电池的绝对主流基于 JIT 技术的开源全场景高性能 JSON 库投行业务质量评价,迎来新修订!全业务链覆盖,债券承销、北交所等业务获纳入程序员神器VS Code再提速,将内置JS减小20%!中国将启用新版外国人永久居留身份证:私人事务线上办TCW:收购Engine No. 1 ETF业务JS三大运行时对比:Deno、Bun和Node.js杰克逊维尔警长请求居民与JSO共享家庭摄像头财宝逛酒庄如何在 Next.js 全栈应用程序中无缝实现身份验证“根本不需要TypeScript,JS+JSDoc够了”,大佬说我想多了我敷完肉眼可见的大小脸,15%高浓度瑞士芋螺提拉肽不是盖的(明10点开团)不负人生·生命之赛(The Race of A Lifetime)历史小说《黄裳元吉》第一百一十八章 黑云《花尾渡》(小说) 第十六章 豪情尽洒南京路加拿大小企业部长宣布2500万加元新投资,帮助多元化企业家发展业务程序员神器 VS Code 再提速,将内置 JS 减小 20% !关于 Node.js 调试,你需要了解的一切深入浅出线程池NeurIPS 2023 | 结合脉冲神经网络和Transformer的纯加法TransformerWeston高端豪华别墅,定制住宅独一无二,带喷泉、凉亭和泳池的庭院非常惊艳我敷完肉眼可见的大小脸,15%高浓度瑞士芋螺提拉肽不是盖的|开团Spring Boot + Gzip 压缩超大 JSON 对象,传输大小减少一半!债券配置创10年新高!险资权益配置受期待 | 另类投资气象第421期8 个线程池最佳实践和坑!使用不当直接生产事故!!无序的岩盐可能使电动汽车电池的能量密度增加三倍“秒杀”杨洋,魏大勋凭借小配角上位成顶流科技周报:东方甄选抖音自营店铺被封三天;淘天集团成立KA服务部;抖音内审团队将分到各业务线[视听] 聆听台机才有的温润与宽松!自带电池的便携解码耳放草医YIAO上手警报炸锅,FastJson 又立功了。。王旭宁旗下SharkNinja,分拆自JS环球生活,在美国纽交所成功上市ACS Energy Lett.: 合成新型SAM用于提高宽带隙钙钛矿和全钙钛矿叠层太阳能电池的效率VS Code内置JS减小20%;Python团队官宣下线GIL;Chrome替代品1.0发布;Twitter改名X | 周热点
logo
联系我们隐私协议©2024 redian.news
Redian新闻
Redian.news刊载任何文章,不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。文章信息的合法性及真实性由其作者负责,与Redian.news及其运营公司无关。欢迎投稿,如发现稿件侵权,或作者不愿在本网发表文章,请版权拥有者通知本网处理。