調優Web伺服器線程池
還有很多需要調優的地方最終影響Web伺服器的效能,其中一個最重要的因素是調優HTTP線程池設定,以匹配web請求的負載。這其實是很難做到的,但可通過調優獲得最佳效能。
web伺服器的線程數量是通過executor的屬性來設定的:
<subsystem xmlns="urn:jboss:domain:web:1.0"> <connector enable-lookups="false" enabled="true" executor="http-executor" max-connections="200" max-post-size="2048" max-save-post-size="4096" name="http" protocol="HTTP/1.1" proxy-name="proxy" proxy-port="8081" redirect-port="8443" scheme="http" secure="false" socket-binding="http" /> . . . </subsystem> |
然後,線上程子系統中,可以定義將要使用的池的線程數,連同其他線程屬性(參見第2章,配置應用程式伺服器,以擷取有關線程子系統詳細介紹):
<subsystem xmlns="urn:jboss:domain:threads:1.0"> <bounded-queue-thread-pool name="http-executor" blocking="true"> <core-threads count="10" per-cpu="20" /> <queue-length count="10" per-cpu="20" /> <max-threads count="10" per-cpu="20" /> <keepalive-time time="10" unit="seconds" /> </bounded-queue-thread-pool> </subsystem> |
最重要的連接器的屬性是core-threads和max-threads,這些值設定的太低,可能沒有足夠的線程來處理所有的請求,在這種情況下,請求不被處理必須等待一段時間,直到另一個請求線程被釋放。過低的值也意味著JBoss的Web伺服器將無法充分利用伺服器硬體的優勢。
另一方面,要小心設定這些線程數,線程數設定過高會導致:
? 消耗大量的記憶體;
? 系統會消耗更多的時間做環境切換。
你應該首先調查是否存在個別的請求耗用過長的時間,線程是否返回到池中?如果存在這種情況,可能原因是,資料庫連接沒有釋放,線程排隊等待擷取一個資料庫連接,從而使其他請求無法得到處理。
在這種情況下,簡單地增加更多的線程會消耗更多CPU,GC更加頻繁,從而使事情變得更糟。在應用程式中你可以通過採取簡單的線程轉儲(thread dump),找出web伺服器線程究竟在哪裡阻塞,例如在這張圖片中,從JConsole的線程選項卡中,通過觀察它的堆疊追蹤,你可以看到看起來和下面類似的空閑線程(idle thread):
另一方面,下面的HTTP線程忙於做輸入/輸出操作,可能的原因是,例如Web伺服器正在從外部資源擷取資料。
從上面的快照可以指導你如何監視Web伺服器上啟動並執行線程,只需在最下面的文字框填寫executor的名稱(http-executor),就會顯示所有Web伺服器線程的列表。