眾所周知,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。