衆所周知,Keep-Alive功能使客戶端到服務器端的鏈接持續有效,當出現對服務器的後繼請求時,Keep-Alive功能避免了創建或者從新創建鏈接。咱們常常所用的tomcat服務器就支持HTTP Keep-Alive。在http1.1中,keepalive默認是開啓的。若是須要自定義配置keepalive參數,咱們能夠在tomcat的server.xml中作以下配置:apache
<Connector port="8080" protocol="HTTP/1.1"
maxThreads="600"
minSpareThreads="100"
acceptCount="700"tomcat
maxConnections="300" //與tomcat創建的最大socket鏈接數
connectionTimeout="20000"服務器
maxKeppAliveRequests="100" //請求個數超過這個數,強制關閉掉socket連接併發
keepAliveTimeOut="60000" //下次請求過來以前,socket連接保持多久
redirectPort="8443"
URIEncoding="utf-8"socket
/>函數
可是tomcat在實際處理請求的過程當中會根據工做線程池中繁忙線程數動態的對keepalive進行開啓或者關閉,tomcat源碼以下:性能
在org.apache.coyote.http11.AbstractHttp11Processor這個類的process方法中能夠看到spa
會經過disableKeepAlive這個函數判斷,咱們再來看看disableKeepAlive這個函數,以下:線程
經過代碼會算出 繁忙線程數/最大線程數的比例,即threadRatio = (threadsBusy * 100) / maxThreads; 接着看getDisableKeepAlivePercentage這個函數code
能夠看出,若是繁忙線程數/最大線程數 >75%,那麼就會主動將keepalive關掉。
實際上這種自動調節措施也是一種防禦措施,當客戶端併發量比較大的時候,若是一致保持長鏈接,其實是很耗服務端資源的,會嚴重影響性能,因此這裏tomcat會動態的根據繁忙線程數來決定是否使用keepalive。