但是在web場景下,業務並不是cpu密集型任務,而是io密集型的任務,乙個執行緒是不合適,如果乙個執行緒在等待資料時,把cpu的計算能力交給其他執行緒,這樣也能充分的利用cpu資源。但是執行緒數量也要有個限度,一般執行緒數有乙個公式:
最佳啟動執行緒數 = [任務執行時間 / (任務執行時間 - io等待時間)] * cpu核心數
超過這個數量,cpu要進行多餘的執行緒切換從而浪費計算能力,低於這個數量,cpu要進行io等待從而造成計算能力不飽和。總之就是要盡可能的榨取cpu的計算能力。
如果你的cpu處於飽和狀態,並且沒有多餘的執行緒切換浪費,那麼此時就是你服務的完美狀態,如果再加大併發量,勢必會造成效能上的下降。
執行緒多少對最高併發沒有直接影響,任務計算時間才是影響最高併發數
的根本原因。
當任務的執行時間減小,那麼伺服器每秒處理的請求就會增加,也就是說支援的併發變大。比如你在服務端只是簡單的return ok;
,稍微正常一點伺服器上的tomcat都能達到5000甚至10000的併發。只不過在大多數的web應用中,任務執行時間並不會太短,而且還涉及到資料庫操作,所以大部分情況下tomcat的最高併發就只有幾百。
補充:上面的回答的不好,補充一下。
題主應該這麼問,tomcat只能支援幾百個併發的原因是什麼?其實跟執行緒關係不大,暫且以1秒內伺服器處理的請求數
來衡量併發數,那麼最大併發就是1秒內伺服器最多能處理的請求數
,很顯然,平均單個請求處理時間越短,則最大併發越高。平均請求處理時間直接影響了最大併發的高度。而大部分情況下tomcat處理請求的平均時間不會太短,有時還設計資料庫操作,所以大部分情況下tomcat的最高併發就只有幾百。
然後執行緒模型會影響tomcat處理請求的平均時間,要麼是執行緒太少造成cpu等待而增加了平均處理時間,要麼是執行緒太多而造成cpu要花費一定的週期來進行執行緒切換而延長了平均處理時間。所以合理的設定執行緒數能一定程度提高最大併發。
那麼怎麼提高最大併發呢?
思路當然是減少平均請求處理時間,比如說優化演算法,動靜分離,快取,非同步等等手段。
贊 3
Tomcat只能run不能debug
啟動tomcat報錯 transport dt socket failed to initialize,rc 509 今天除錯乙個工程,一直有問題,試著把jdk1.5換成1.4,結果提示連不上vm並且transport dt socket failed to initialize,rc 509.這個...
Tomcat支援中文
走上工作崗位已經有一年多了,對於乙個從事web開發的程式設計師來講,今天發生了一件讓我很鄙視自己的事。居然連tomcat的中文問題都沒注意,乙個勁的鬱悶為啥亂碼。而鄙視自己的不僅僅是這個原因,而是因為這是在乙個多月裡第二次發現這個問題而不能及時的解決,上次給的教訓不夠深刻呀,太耽誤開發時間了。再次鄙...
Tomcat 開啟 cgi 支援
環境搭建 2.修改tomcat配置 l 修改tomcat根目下 conf web.xml配置檔案,開啟對cgiservlet 和對應 map的注釋。cgiorg.apache.catalina.servlets.cgiservlet debug 0cgipathprefix web inf cgi5...