0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

JSF業(yè)務(wù)線程池的大小配置用例說(shuō)明

OSC開(kāi)源社區(qū) ? 來(lái)源:OSCHINA 社區(qū) ? 2023-09-19 11:15 ? 次閱讀

1. 簡(jiǎn)介

JSF 業(yè)務(wù)線程池使用 JDK 的線程池技術(shù),缺省情況下采用 Cached 模式(核心線程數(shù) 20,最大線程數(shù) 200)。此外,還提供了 Fixed 固定線程大小的模式,兩種模式均可設(shè)置請(qǐng)求隊(duì)列大小。

本文旨在通過(guò)一個(gè)簡(jiǎn)化場(chǎng)景(“單服務(wù)應(yīng)用”)下的負(fù)載測(cè)試,為 “JSF 業(yè)務(wù)線程池大小配置” 提供基準(zhǔn)測(cè)試結(jié)果,并形成一些普遍適用的結(jié)論。

本文的目標(biāo)讀者包括需要合理配置 JSF 線程大小的壓測(cè)工程師、開(kāi)發(fā)部署運(yùn)維工程師以及架構(gòu)師。

本文不涉及 JSF 服務(wù)端的其他配置項(xiàng),也不針對(duì) “復(fù)合服務(wù)應(yīng)用” 的合理配置進(jìn)行探討。你可以利用本文提供的結(jié)論,作為設(shè)計(jì)壓測(cè)用例或評(píng)估業(yè)務(wù)線程池大小的基本方法的參考,以便在實(shí)踐中合理配置 JSF 業(yè)務(wù)線程池大小。需要注意的是,JSF 業(yè)務(wù)線程池大小的合理配置應(yīng)該基于高保真的負(fù)載測(cè)試結(jié)果。

“單服務(wù)應(yīng)用” 指應(yīng)用僅包含一個(gè)提供接口,且接口中僅有一個(gè)方法。 “復(fù)合服務(wù)應(yīng)用” 則指應(yīng)用包含多個(gè)提供接口或一個(gè)接口中含有多個(gè)方法。

2. 測(cè)試用例說(shuō)明

本次基準(zhǔn)測(cè)試選取了 USF3.0 權(quán)限系統(tǒng),將其定制化為一個(gè)單一的服務(wù)提供者,僅對(duì)該提供者的一個(gè)方法進(jìn)行了測(cè)試,因此可以看作是一個(gè) “單服務(wù)應(yīng)用”。

測(cè)試中將 CPU 作為基準(zhǔn)測(cè)試的核心資源,并考慮到 JVM 垃圾收集器的影響,采用了簡(jiǎn)單的測(cè)試數(shù)據(jù)以保證服務(wù)每次調(diào)用的一致性,并確保 YGC 具有規(guī)律性(即固定調(diào)用量會(huì)導(dǎo)致一次 30+ms 的 YGC),無(wú) FGC 的影響。

測(cè)試用例的設(shè)計(jì)中,所有依賴(lài)的服務(wù)資源都無(wú)限制,以確保測(cè)試過(guò)程中服務(wù)的可用率達(dá)到 100%。我們的關(guān)鍵性能指標(biāo)是 TP99,即服務(wù)響應(yīng)時(shí)長(zhǎng)的 99% 必須小于 10ms。

為了測(cè)試不同線程池模式下的性能表現(xiàn),我們使用了 JSF 線程池的 Cached 和 Fixed 兩種模式,并針對(duì)每種模式進(jìn)行了多組測(cè)試,以得出在滿(mǎn)足 TP99<10ms 的前提下,系統(tǒng)最大的負(fù)載情況。

測(cè)試應(yīng)用:USF3.0 權(quán)限系統(tǒng) (定制化處理) 測(cè)試服務(wù):com.jd.susf.service.api.SusfPermissionService#findUserInfo,根據(jù)用戶(hù)信息從 Redis 中查詢(xún)一條數(shù)據(jù)返回的服務(wù)。

硬件配置:?jiǎn)闻_(tái) 4C 8G 測(cè)試方法:在 Forcebot 系統(tǒng)采用了階梯發(fā)壓的方式對(duì) JSF 業(yè)務(wù)線程池在 Cached 和 Fixed 模式下進(jìn)行了系統(tǒng)負(fù)載測(cè)試 擬定 SLA 要求:服務(wù)響應(yīng)時(shí)長(zhǎng)的 TP99<10ms

注:我們對(duì) USF3.0 權(quán)限系統(tǒng)進(jìn)行了定制,調(diào)整了服務(wù)提供方的配置數(shù)據(jù),僅保留了 com.jd.susf.service.api.SusfPermissionService。

3. 測(cè)試結(jié)果及分析

3.1.cached 線程池的系統(tǒng)負(fù)載

圖:JSF 默認(rèn)線程池 (cached, threads=200) 在不同并發(fā)用戶(hù)數(shù) (1-200) 下的系統(tǒng)負(fù)載圖

并發(fā)用戶(hù)數(shù) TP99 吞吐量 TPS CPU 利用率 (%)
1~23 <8ms 線性增長(zhǎng) 線性增長(zhǎng)
24 8ms 6553 99.62
25 11ms 6607 99.83
26~79 迅速增長(zhǎng) 緩慢增長(zhǎng) 99+
80 74ms 6928 99.82
81~199 緩慢增加 緩慢下降 99.82
200 99ms 6230 99.94

小結(jié):默認(rèn)的 JSF 線程池配置存在很大的風(fēng)險(xiǎn)。系統(tǒng)最大可支持 24 個(gè)并發(fā),超過(guò) 24 個(gè)并發(fā) SLA 就無(wú)法滿(mǎn)足。

3.2 fixed 線程池 (隊(duì)列) 的系統(tǒng)負(fù)載

圖:JSF 固定線程池 (fixed + 隊(duì)列) 在不同并發(fā)用戶(hù)數(shù) (1-50) 下的系統(tǒng)負(fù)載圖

JSF 業(yè)務(wù)線程數(shù) 可支持的最大并發(fā)用戶(hù)數(shù) TP 值 (50/90/99/999) 吞吐量 (TPS) CPU 最大利用率(%)
4 11 7/8/10/18 1531 27.67
8 25 8/8/10/18 3113 46.45
16 50 8/8/10/21 6228 87.97
20 23 3/4/10/15 6409 99.92
24 22 3/4/7/15 6178 99.86
25 22 3/4/6/15 6182 98.83

表:JSF 固定業(yè)務(wù)線程池 (fixed + 隊(duì)列) 在滿(mǎn)足 TP99<10ms 的系統(tǒng)最大負(fù)載(最大并發(fā)用戶(hù)數(shù))

小結(jié): ① 在 fixed 線程模式下,CPU 的利用率存在使用上限。

② 隊(duì)列的使用可以有效增加系統(tǒng)對(duì)并發(fā)量的支持,同時(shí)也會(huì)帶來(lái)吞吐量的提升。然而,由于任務(wù)在隊(duì)列中等待,服務(wù)的響應(yīng)時(shí)間會(huì)出現(xiàn) “水漲船高” 的現(xiàn)象,存在一定風(fēng)險(xiǎn)。

3.3 fixed 線程池的系統(tǒng)負(fù)載

圖:JSF 固定線程池 (fixed) 模式下,系統(tǒng)最大并發(fā)用戶(hù)數(shù)時(shí)的系統(tǒng)負(fù)載

JSF 業(yè)務(wù)線程數(shù) 并發(fā)用戶(hù)數(shù) TP99 吞吐量 (TPS) CPU 最大利用率(%)
4 4 5 1063 20.26
8 8 5 2216 36.62
16 16 6 4262 68.56
20 20 5 5550 86.22
24 24 8 6711 99.62
25 25 16 6644 98.77
26 26 19 6744 99.93

小結(jié):綜合固定線程池 (fixed) 的性能表現(xiàn),需要設(shè)置一個(gè)合理的線程數(shù)大小來(lái)平衡 CPU 資源的充分利用和滿(mǎn)足 SLA 的需求,線程數(shù)過(guò)小會(huì)導(dǎo)致 CPU 資源浪費(fèi),線程數(shù)過(guò)大則無(wú)法滿(mǎn)足 SLA

4. 結(jié)論

根據(jù)測(cè)試結(jié)果和數(shù)據(jù)分析,我們得出以下結(jié)論:

JSF 線程池的默認(rèn)配置在并發(fā)量高的場(chǎng)景下存在風(fēng)險(xiǎn):所有線上生產(chǎn)環(huán)境中的 JSF 服務(wù)所在的服務(wù)器,很少有能夠在 200 個(gè)線程的情況下還能夠滿(mǎn)足 SLA 的。最大 200 個(gè)線程的線程池配置,將服務(wù)器置于 “并發(fā)量高的場(chǎng)景下被壓垮” 的風(fēng)險(xiǎn)中。線程池大小的合理配置應(yīng)該來(lái)自高保真的負(fù)載測(cè)試。

足量的線程數(shù)才能保證資源 (CPU) 的利用率:業(yè)務(wù)型的服務(wù)通常都存在一定的 IO 操作(網(wǎng)絡(luò),磁盤(pán)等),線程執(zhí)行過(guò)程中會(huì)發(fā)生等待,CPU 利用率不高,需要增加并發(fā)的線程數(shù)量,讓更多的線程參與 CPU 的分配,才能提高 CPU 的利用率。服務(wù)中 IO 操作越多,等待時(shí)長(zhǎng)越長(zhǎng),需要的并發(fā)線程就越多。對(duì)于有 IO 操作的業(yè)務(wù)型服務(wù),負(fù)載測(cè)試的線程數(shù)可以從 2N(N 是服務(wù)器的 CPU 核數(shù))開(kāi)始。

過(guò)多的線程數(shù)只會(huì)降低系統(tǒng)的 SLA:當(dāng)線程數(shù)已能 100% 利用 CPU 后,增加線程數(shù),線程就無(wú)法獲取足夠的 CPU 分配,這樣服務(wù)的響應(yīng)時(shí)間就會(huì)增大。

在一定范圍內(nèi),TP99 還可能滿(mǎn)足 SLA 的要求,系統(tǒng)的吞吐量也會(huì)有少量的增加。再持續(xù)增加線程數(shù),TP99 就無(wú)法滿(mǎn)足系統(tǒng)的要求,系統(tǒng)的吞吐量也會(huì)開(kāi)始下降。

固定的線程數(shù)可以保護(hù)系統(tǒng)需要承擔(dān)的負(fù)載能力:固定線程數(shù)可以保證系統(tǒng)對(duì) CPU 的利用率限定在一定的負(fù)載范圍內(nèi),保護(hù)系統(tǒng)穩(wěn)定運(yùn)行,保證響應(yīng)時(shí)間 TP99,但也限定了系統(tǒng)的并發(fā)能力。

合理設(shè)置隊(duì)列大小可以增加系統(tǒng)的并發(fā)度,也不會(huì)影響系統(tǒng) TP99,但會(huì)整體拉高服務(wù)的響應(yīng)時(shí)間,出現(xiàn)不穩(wěn)定性的變化,存在風(fēng)險(xiǎn)。

讓 CPU100% 的高負(fù)載運(yùn)行:通常服務(wù)對(duì)外的 SLA 承諾通常高于服務(wù)真實(shí)的性能,這是因?yàn)槲覀兛紤]了基礎(chǔ)設(shè)施及依賴(lài)服務(wù)的不穩(wěn)定性。

因此,即使 CPU 已經(jīng)達(dá)到了 100%,我們?nèi)匀豢梢栽黾右欢〝?shù)量的線程數(shù),而不會(huì)影響對(duì)外的響應(yīng)時(shí)間 TP99 的承諾。這樣可以提高系統(tǒng)的并發(fā)能力。雖然系統(tǒng)可以在高負(fù)載下運(yùn)行,但我們需要進(jìn)一步進(jìn)行穩(wěn)定性測(cè)試,以提高系統(tǒng)的可靠性。

綜上所述,線程池大小的合理配置需要結(jié)合業(yè)務(wù)需求和系統(tǒng)資源情況進(jìn)行評(píng)估和測(cè)試,并預(yù)留合理的 buffer 空間,以保證系統(tǒng)穩(wěn)定運(yùn)行和滿(mǎn)足用戶(hù)的 SLA。

5. 附錄

附錄一:統(tǒng)計(jì)指標(biāo)及術(shù)語(yǔ)說(shuō)明

并發(fā)用戶(hù)數(shù):同時(shí)發(fā)起請(qǐng)求的用戶(hù)數(shù)。

TP 值 (50/90/99/999):客戶(hù)端的 TP 值,單位 ms,數(shù)據(jù)來(lái)源于 Forcebot。

吞吐量 TPS:數(shù)據(jù)來(lái)源于 Forcebot。

CPU 利用率 (%):數(shù)據(jù)來(lái)源于 PFinder。

JSF 業(yè)務(wù)線程數(shù):JSF 業(yè)務(wù)線程池的線程數(shù),如:

fixed/cached:JSF 業(yè)務(wù)線程池的線程池類(lèi)型,如:





審核編輯:劉清

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • SLA
    SLA
    +關(guān)注

    關(guān)注

    1

    文章

    54

    瀏覽量

    18273
  • USF
    USF
    +關(guān)注

    關(guān)注

    0

    文章

    2

    瀏覽量

    8054
  • TPS
    TPS
    +關(guān)注

    關(guān)注

    0

    文章

    83

    瀏覽量

    36223
  • JSF
    JSF
    +關(guān)注

    關(guān)注

    0

    文章

    11

    瀏覽量

    7754
  • JVM
    JVM
    +關(guān)注

    關(guān)注

    0

    文章

    158

    瀏覽量

    12228

原文標(biāo)題:談?wù)凧SF業(yè)務(wù)線程池的大小配置

文章出處:【微信號(hào):OSC開(kāi)源社區(qū),微信公眾號(hào):OSC開(kāi)源社區(qū)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    Java中的線程包括哪些

    線程是用來(lái)統(tǒng)一管理線程的,在 Java 中創(chuàng)建和銷(xiāo)毀線程都是一件消耗資源的事情,線程可以重復(fù)
    的頭像 發(fā)表于 10-11 15:33 ?817次閱讀
    Java中的<b class='flag-5'>線程</b><b class='flag-5'>池</b>包括哪些

    動(dòng)態(tài)線程思想學(xué)習(xí)及實(shí)踐

    ://www.javadoop.com/post/java-thread-pool? 引言 在后臺(tái)項(xiàng)目開(kāi)發(fā)過(guò)程中,我們常常借助線程來(lái)實(shí)現(xiàn)多線程任務(wù),以此提升系統(tǒng)的吞吐率和響應(yīng)性;而線程
    的頭像 發(fā)表于 06-13 15:43 ?1189次閱讀
    動(dòng)態(tài)<b class='flag-5'>線程</b><b class='flag-5'>池</b>思想學(xué)習(xí)及實(shí)踐

    線程是如何實(shí)現(xiàn)的

    線程的概念是什么?線程是如何實(shí)現(xiàn)的?
    發(fā)表于 02-28 06:20

    JSF應(yīng)用程序的結(jié)構(gòu)

    JSF應(yīng)用程序的結(jié)構(gòu):JSF 將表示和應(yīng)用程序行為明確分開(kāi),JSF是一種事件驅(qū)動(dòng)型的組件模型,請(qǐng)求處理生命周期包括6個(gè)階段,JSF頁(yè)面指向Bean屬性,
    發(fā)表于 12-08 11:06 ?23次下載

    基于線程技術(shù)集群接入點(diǎn)的應(yīng)用研究

    本文在深入研究高級(jí)線程技術(shù)的基礎(chǔ)上,分析、研究了固定線程數(shù)目的線程線程數(shù)目動(dòng)態(tài)變化的
    發(fā)表于 01-22 14:21 ?5次下載

    如何正確使用SpringBoot中的線程

    來(lái)自丨CSDN https://blog.csdn.net/m0_37701381/article/details/81072774 使用步驟 先創(chuàng)建一個(gè)線程配置,讓Spring Boot加載
    的頭像 發(fā)表于 09-02 17:14 ?2098次閱讀

    基于Nacos的簡(jiǎn)單動(dòng)態(tài)化線程實(shí)現(xiàn)

    本文以Nacos作為服務(wù)配置中心,以修改線程核心線程數(shù)、最大線程數(shù)為,實(shí)現(xiàn)一個(gè)簡(jiǎn)單的動(dòng)態(tài)化
    發(fā)表于 01-06 14:14 ?863次閱讀

    線程線程

    線程通常用于服務(wù)器應(yīng)用程序。 每個(gè)傳入請(qǐng)求都將分配給線程池中的一個(gè)線程,因此可以異步處理請(qǐng)求,而不會(huì)占用主線程,也不會(huì)延遲后續(xù)請(qǐng)求的處理
    的頭像 發(fā)表于 02-28 09:53 ?795次閱讀
    多<b class='flag-5'>線程</b>之<b class='flag-5'>線程</b><b class='flag-5'>池</b>

    Java線程核心原理

    看過(guò)Java線程源碼的小伙伴都知道,在Java線程池中最核心的類(lèi)就是ThreadPoolExecutor,
    的頭像 發(fā)表于 04-21 10:24 ?857次閱讀

    線程線程怎么釋放

    線程分組看,pool名開(kāi)頭線程占616條,而且waiting狀態(tài)也是616條,這個(gè)點(diǎn)就非??梢闪?,我斷定就是這個(gè)pool開(kāi)頭線程導(dǎo)致的問(wèn)題。我們先排查為何這個(gè)
    發(fā)表于 07-31 10:49 ?2295次閱讀
    <b class='flag-5'>線程</b><b class='flag-5'>池</b>的<b class='flag-5'>線程</b>怎么釋放

    Spring 的線程應(yīng)用

    。 使用@Async聲明多線程 SpringBoot 提供了注解 @Async 來(lái)使用線程, 具體使用方法如下: 在啟動(dòng)類(lèi)(配置類(lèi))添加 @EnableAsync 來(lái)開(kāi)啟
    的頭像 發(fā)表于 10-13 10:47 ?623次閱讀
    Spring 的<b class='flag-5'>線程</b><b class='flag-5'>池</b>應(yīng)用

    線程基本概念與原理

    一、線程基本概念與原理 1.1 線程概念及優(yōu)勢(shì) C++線程簡(jiǎn)介
    的頭像 發(fā)表于 11-10 10:24 ?537次閱讀

    線程的基本概念

    線程的基本概念 不管線程是什么東西!但是我們必須知道線程被搞出來(lái)的目的就是:提高程序執(zhí)行效
    的頭像 發(fā)表于 11-10 16:37 ?527次閱讀
    <b class='flag-5'>線程</b><b class='flag-5'>池</b>的基本概念

    線程的創(chuàng)建方式有幾種

    線程是一種用于管理和調(diào)度線程的技術(shù),能夠有效地提高系統(tǒng)的性能和資源利用率。它通過(guò)預(yù)先創(chuàng)建一組線程并維護(hù)一個(gè)工作隊(duì)列,將任務(wù)提交給線程
    的頭像 發(fā)表于 12-04 16:52 ?869次閱讀

    什么是動(dòng)態(tài)線程?動(dòng)態(tài)線程的簡(jiǎn)單實(shí)現(xiàn)思路

    因此,動(dòng)態(tài)可監(jiān)控線程一種針對(duì)以上痛點(diǎn)開(kāi)發(fā)的線程管理工具。主要可實(shí)現(xiàn)功能有:提供對(duì) Spring 應(yīng)用內(nèi)線程
    的頭像 發(fā)表于 02-28 10:42 ?645次閱讀