Tomcat設置最佳線程數總結

最佳線程數:

性能壓測的狀況下,起初隨着用戶數的增長,QPS會上升,當到了必定的閥值以後,用戶數量增長QPS並不會增長,或者增長不明顯,同時請求的響應時間卻大幅增長。這個閥值咱們認爲是最佳線程數。java

 

爲何要找最佳線程數:web

1.過多的線程只會形成,更多的內存開銷,更多的CPU開銷,可是對提高QPS確毫無幫助後端

2.找到最佳線程數後經過簡單的設置,可讓web系統更加穩定,獲得最高,最穩定的QPS輸出tomcat

 

最佳線程數的獲取:服務器

一、經過用戶慢慢遞增來進行性能壓測,觀察QPS,響應時間併發

二、根據公式計算:服務器端最佳線程數量=((線程等待時間+線程cpu時間)/線程cpu時間) * cpu數量jvm

三、單用戶壓測,查看CPU的消耗,而後直接乘以百分比,再進行壓測,通常這個值的附近應該就是最佳線程數量。性能

 

影響最佳線程數的主要因素:優化

一、IOspa

二、CPU

根據公式:服務器端最佳線程數量=((線程等待時間+線程cpu時間)/線程cpu時間) * cpu數量

通常來講是IO和CPU。IO開銷較多的應用其CPU線程等待時間會比較長,因此線程數量能夠開的多一些,相反則線程數量要少一些,其實有兩種極端,純IO的應用,好比proxy,則線程數量能夠開到很是大(實在太大了則須要考慮線程切換的開銷),這種應用基本上後端(好比這個proxy是代理搜索的)的QPS能有多少,proxy就有多少。

另外一種是耗CPU的計算,這種狀況通常來說只能開到CPU個數的線程數量。可是並非說這種應用的QPS就不高,每每這種應用的QPS能夠很高。

 

QPS和線程數的關係

一、在最佳線程數量以前,QPS和線程是互相遞增的關係,線程數量到了最佳線程以後,QPS持平,不在上升,甚至略有降低,同時相應時間持續上升。

二、同一個系統而言,支持的線程數越多(最佳線程數越多而不是配置的線程數越多),QPS越高

 

QPS和響應時間的關係

一、對於通常的web系統,響應時間通常有CPU執行時間+IO等待時間組成

二、CPU的執行時間減小,對QPS有實質的提高,IO時間的減小,對QPS提高不明顯。若是要想明顯提高QPS,優化系統的時候要着重優化CPU消耗大戶。

 

最佳線程數和jvm堆內存得關係:

以上都是依據性能瓶頸在CPU的狀況,對於java應用還有一個因素是FULL GC,咱們要保證在最佳線程數量下,不會發生頻繁FULL GC

根據公式::(小GC時間間隔/rt)*(併發線程數量 * thm) <=young 計算獲得的併發線程數量若是<最佳線程數量 則可能致使FULL GC較頻繁,實際狀況看來這種狀況在web系統上很是少。不過能夠模擬出來。

因此咱們在設置jboss線程的時候,能夠利用內存公式計算出來的線程數量來設置,經過壓測和計算獲得最佳線程數,而後設置線程數。

 

設置線程數量:

壓測最佳線程數<真實設置的線程數量<內存極限線程數

好比,經過壓測獲得某系統的最佳線程數量是10,而後經過內存計算的線程數量是20,則,設置jboss的線程數量爲15是可行的,若是直接設置了10,因爲系統自己會受到一些依賴系統的變化而產生一些變化,好比系統依賴一些IO的響應時間會忽然延長,因爲線程數量仍是10,其實這個時候最佳線程數量已經變成了13了,因爲咱們設置死了10,其結果就是致使qps降低,可是若是超過20,則又會引發FULL gc很是頻繁,反過來影響QPS的降低。

 

jboss的線程數設置:

對於jboss而言,設置線程數量要看使用了那種線程鏈接,如http、ajp等

http和ajp的設置是徹底同樣的,很是簡單:

以ajp爲例,找到server.xml或者tomcat-server.xml:

默認線程數量是200個

 <Connector port="8009" address="${jboss.bind.address}" connectionTimeout="15000" protocol="AJP/1.3" maxThreads="200" minSpareThreads="40" maxSpareThreads="75" maxPostSize="512000" acceptCount="300" bufferSize="16384" emptySessionPath="false" enableLookups="false" redirectPort="8443" useBodyEncodingForURI="true"/>

這裏將默認的線程數量改爲了20,固然相應的其餘最小空閒線程數和最大空閒線程數也作一下調整:

<Connector port="8009" address="${jboss.bind.address}" connectionTimeout="15000" protocol="AJP/1.3" maxThreads="20" minSpareThreads="20" maxSpareThreads="20" maxPostSize="512000" acceptCount="300" bufferSize="16384" emptySessionPath="false" enableLookups="false" redirectPort="8443" useBodyEncodingForURI="true"/>

相關文章
相關標籤/搜索