tomcat 線程池優化
簡介
線程池作為提高程序處理數據能力的一種方案,應用非常廣泛。大量的服務器都或多或少的使用到了線程池技術,不管是用Java還是C++實現,線程池都有如下的特點:
線程池一般有三個重要參數:
最大線程數。在程序運行的任何時候,線程數總數都不會超過這個數。如果請求數量超過最大數時,則會等待其他線程結束後再處理。
最大共享線程數,即最大空閑線程數。如果當前的空閑線程數超過該值,則多余的線程會被殺掉。
最小共享線程數,即最小空閑線程數。如果當前的空閑數小於該值,則一次性創建這個數量的空閑線程,所以它本身也是一個創建線程的步長。 線程池有兩個概念:
Worker線程。工作線程主要是運行執行代碼,有兩種狀態:空閑狀態和運行狀態。在空閑狀態時,類似“休眠”,等待任務;處理運行狀態時,表示正在運行任務(Runnable)。
輔助線程。主要負責監控線程池的狀態:空閑線程是否超過最大空閑線程數或者小於最小空閑線程數等。如果不滿足要求,就調整之。
來 看一下線程池究竟是怎麽一回事?其實線程池的原理很簡單,類似於操作系統中的緩沖區的概念,它的流程如下:先啟動若幹數量的線程,並讓這些線程都處於睡眠 狀態,當客戶端有一個新請求時,就會喚醒線程池中的某一個睡眠線程,讓它來處理客戶端的這個請求,當處理完這個請求後,線程又處於睡眠狀態。可能你也許會 問:為什麽要搞得這麽麻煩,如果每當客戶端有新的請求時,我就創建一個新的線程不就完了?這也許是個不錯的方法,因為它能使得你編寫代碼相對容易一些,但 你卻忽略了一個重要的問題??性能!就拿我所在的單位來說,我的單位是一個省級數據大集中的銀行網絡中心,高峰期每秒的客戶端請求並發數超過100,如果 為每個客戶端請求創建一個新線程的話,那耗費的CPU時間和內存將是驚人的,如果采用一個擁有200個線程的線程池,那將會節約大量的的系統資源,使得更 多的CPU時間和內存用來處理實際的商業應用,而不是頻繁的線程創建與銷毀。
配置
使用線程池,用較少的線程處理較多的訪問,可以提高tomcat處理請求的能力。使用方式:
首先。打開/conf/server.xml,增加
<Executorname="tomcatThreadPool" namePrefix="catalina-exec-"
maxThreads="500"
minSpareThreads="20"
maxIdleTime="60000"
prestartminSpareThreads="true"
maxQueueSize="100"/>
name: 線程名稱
namePrefix: 線程前綴
maxThreads : 最大並發連接數,不配置時默認200,一般建議設置500~ 800 ,要根據自己的硬件設施條件和實際業務需求而定。
minSpareThreads:Tomcat啟動初始化的線程數,默認值25
prestartminSpareThreads:在tomcat初始化的時候就初始化minSpareThreads的值, 不設置true時minSpareThreads
maxQueueSize: 最大的等待隊列數,超過則拒絕請求
minSpareThreads:線程最大空閑時間60秒。
然後,修改 節點,增加executor屬性,如:
<Connectorport="8080"protocol="org.apache.coyote.http11.Http11Nio2Protocol"
connectionTimeout="20000"
redirectPort="8443"
executor="tomcatThreadPool"
enableLookups="false"
acceptCount="100"
maxPostSize="10485760"
compression="on"
disableUploadTimeout="true"
compressionMinSize="2048"
noCompressionUserAgents="gozilla, traviata"
acceptorThreadCount="2"
compressableMimeType="text/html,text/xml,text/plain,text/css,text/java,application/java"
URIEncoding="utf-8"/>
port:連接端口。
protocol:連接器使用的傳輸方式。 Tomcat 8 設置 nio2 更好:org.apache.coyote.http11.Http11Nio2Protocol
protocol, Tomcat 6、7 設置 nio 更好:org.apache.coyote.http11.Http11NioProtocol
註:
每個web客戶端請求對於服務器端來說就一個單獨的線程,客戶端的請求數量增多將會導致線程數就上去了,CPU就忙著 跟線程切換。
而NIO則是使用單線程(單個CPU)或者只使用少量的多線程(多CPU)來接受Socket,而由線程池來處理堵塞在pipe 或者隊 列裏的請求.這樣的話,只要OS可以接受TCP的連接,web服務器就可以處理該請求。大大提高了web服務器的可伸縮性。
executor: 連接器使用的線程池名稱
enableLookups:禁用DNS 查詢
acceptCount:指定當所有可以使用的處理請求的線程數都被使用時,可以放到處理隊列中的請求數,超過這個數的請求將不予處理,默認設置 100 。
maxPostSize:限制 以FORM URL 參數方式的POST請求的內容大小,單位字節,默認是 2097152(2兆),10485760 為 10M。如果要禁用限制,則可以設置為 -1。
acceptorThreadCount: 用於接收連接的線程的數量,默認值是1。一般這個指需要改動的時候是因為該服務器是一個多核CPU,如果是多核 CPU 一般配置為 2。
compression:傳輸時是壓縮。
compressionMinSize:壓縮的大小
noCompressionUserAgents:不啟用壓縮的瀏覽器
提示:
壓縮會增加Tomcat負擔,最好采用Nginx + Tomcat 或者 Apache + Tomcat 方式,壓縮交由Nginx/Apache 去做。
Tomcat 的壓縮是在客戶端請求服務器對應資源後,從服務器端將資源文件壓縮,再輸出到客戶端,由客戶端的瀏覽器負責解壓縮並瀏覽。相對於普通的 瀏覽過程 HTML、CSS、Java和Text,它可以節省40% 左右的流量。更為重要的是,它可以對動態生成的,包括CGI、PHP、JSP、ASP、Servlet,SHTML等輸出的網頁也能進行壓縮,壓縮效率也很高。
本文出自 “夢想照進現實” 博客,請務必保留此出處http://lookingdream.blog.51cto.com/5177800/1975246
tomcat 線程池優化