tomcat根據繁忙線程數對keepalive進行動態調整


  眾所周知,Keep-Alive功能使客戶端到服務器端的連接持續有效,當出現對服務器的后繼請求時,Keep-Alive功能避免了建立或者重新建立連接。我們經常所用的tomcat服務器就支持HTTP Keep-Alive。在http1.1中,keepalive默認是開啟的。如果需要自定義配置keepalive參數,我們可以在tomcat的server.xml中做如下配置:

<Connector port="8080" protocol="HTTP/1.1"
              maxThreads="600"
              minSpareThreads="100"
              acceptCount="700"

                                        maxConnections="300" //與tomcat建立的最大socket連接數
              connectionTimeout="20000"

                                        maxKeppAliveRequests="100"  //請求個數超過這個數,強制關閉掉socket鏈接

                                        keepAliveTimeOut="60000"  //下次請求過來之前,socket鏈接保持多久
              redirectPort="8443" 
              URIEncoding="utf-8"

  />

但是tomcat在實際處理請求的過程中會根據工作線程池中繁忙線程數動態的對keepalive進行開啟或者關閉,tomcat源碼如下:

在org.apache.coyote.http11.AbstractHttp11Processor這個類的process方法中可以看到

會通過disableKeepAlive這個函數判斷,我們再來看看disableKeepAlive這個函數,如下:

通過代碼會算出 繁忙線程數/最大線程數的比例,即threadRatio = (threadsBusy * 100) / maxThreads; 接着看getDisableKeepAlivePercentage這個函數

可以看出,如果繁忙線程數/最大線程數 >75%,那么就會主動將keepalive關掉。

 

實際上這種自動調節措施也是一種防護措施,當客戶端並發量比較大的時候,如果一致保持長連接,實際上是很耗服務端資源的,會嚴重影響性能,所以這里tomcat會動態的根據繁忙線程數來決定是否使用keepalive。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM