淺談tomcat優化(內存,並發,緩存,安全,網絡,系統等)
Tomcat內存優化主要是對 tomcat 啟動參數優化,我們可以在 tomcat 的啟動腳本 catalina.sh 中設置 java_OPTS 參數
JAVA_OPTS參數說明
-server 啟用jdk 的 server 版
-Xms java虛擬機初始化時的最小內存
-Xmx java虛擬機可使用的最大內存
-XX: PermSize 內存永久保留區域
-XX:MaxPermSize 內存最大永久保留區域
3.配置示例:
JAVA_OPTS=’-Xms1024m -Xmx2048m -XX: PermSize=256M -XX:MaxNewSize=256m -XX:MaxPermSize=256m’
4.重啟tomcat生效
二.Tomcat並發優化
調整連接器connector的並發處理能力:
maxThreads :客戶請求最大線程數
minSpareThreads :Tomcat初始化時創建的 socket 線程數
maxSpareThreads: Tomcat連接器的最大空閑 socket 線程數
enableLookups :是否反查域名,取值為: true 或 false 。為了提高處理能力,應設置為 false
redirectPort: 在需要基於安全通道的場合,把客戶請求轉發到基於SSL 的 redirectPort 端口
connectionTimeout: 連接超時
minProcessors: 服務器創建時的最小處理線程數
maxProcessors: 服務器同時最大處理線程數
URIEncoding: URL統一編碼其中和最大連接數相關的參數為maxProcessors 和 acceptCount 。如果要加大並發連接數,應同時加大這兩個參數。
2、壓縮優化及參數
●compression="on" 打開壓縮功能
●compressionMinSize="2048"啟用壓縮的輸出內容大小,默認為2KB
●compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain" 哪些資源類型需要壓縮Tomcat 的壓縮是在客戶端請求服務器對應資源後,從服務器端將資源文件壓縮,再輸出到客戶端,由客戶端的瀏覽器負責解壓縮並瀏覽。相對於普通的瀏覽過程 HTML、CSS、Javascript和Text,它可以節省40% 左右的流量。更為重要的是,它可以對動態生成的,包括CGI、PHP、JSP、ASP、Servlet,SHTML等輸出的網頁也能進行壓縮,壓縮效率也很高。但是, 壓縮會增加 Tomcat 的負擔,因此最好采用Nginx + Tomcat 或者 Apache + Tomcat 方式,將壓縮的任務交由 Nginx/Apache 去做。
三、Tomcat緩存優化
1、tomcat的maxThreads、acceptCount(最大線程數、最大排隊數)
說明:
maxThreads:tomcat起動的最大線程數,即同時處理的任務個數,默認值為200
acceptCount:當tomcat起動的線程數達到最大時,接受排隊的請求個數,默認值為100
這兩個值如何起作用,請看下面三種情況
情況1:接受一個請求,此時tomcat起動的線程數沒有到達maxThreads,tomcat會起動一個線程來處理此請求。
情況2:接受一個請求,此時tomcat起動的線程數已經到達maxThreads,tomcat會把此請求放入等待隊列,等待空閑線程。
情況3:接受一個請求,此時tomcat起動的線程數已經到達maxThreads,等待隊列中的請求個數也達到了acceptCount,此時tomcat會直接拒絕此次請求,返回connection refused
maxThreads如何配置
一般的服務器操作都包括量方面:1計算(主要消耗cpu),2等待(io、數據庫等)
第一種極端情況,如果我們的操作是純粹的計算,那麽系統響應時間的主要限制就是cpu的運算能力,此時maxThreads應該盡量設的小,降低同一時間內爭搶cpu的線程個數,可以提高計算效率,提高系統的整體處理能力。
第二種極端情況,如果我們的操作純粹是IO或者數據庫,那麽響應時間的主要限制就變為等待外部資源,此時maxThreads應該盡量設的大,這樣才能提高同時處理請求的個數,從而提高系統整體的處理能力。此情況下因為tomcat同時處理的請求量會比較大,所以需要關註一下tomcat的虛擬機內存設置和linux的open file限制。
我在測試時遇到一個問題,maxThreads我設置的比較大比如3000,當服務的線程數大到一定程度時,一般是2000出頭,單次請求的響應時間就會急劇的增加,
百思不得其解這是為什麽,四處尋求答案無果,最後我總結的原因可能是cpu在線程切換時消耗的時間隨著線程數量的增加越來越大,
cpu把大多數時間都用來在這2000多個線程直接切換上了,當然cpu就沒有時間來處理我們的程序了。
以前一直簡單的認為多線程=高效率。。其實多線程本身並不能提高cpu效率,線程過多反而會降低cpu效率。
當cpu核心數<線程數時,cpu就需要在多個線程直接來回切換,以保證每個線程都會獲得cpu時間,即通常我們說的並發執行。
所以maxThreads的配置絕對不是越大越好。
現實應用中,我們的操作都會包含以上兩種類型(計算、等待),所以maxThreads的配置並沒有一個最優值,一定要根據具體情況來配置。
最好的做法是:在不斷測試的基礎上,不斷調整、優化,才能得到最合理的配置。
acceptCount的配置,我一般是設置的跟maxThreads一樣大,這個值應該是主要根據應用的訪問峰值與平均值來權衡配置的。
如果設的較小,可以保證接受的請求較快相應,但是超出的請求可能就直接被拒絕
如果設的較大,可能就會出現大量的請求超時的情況,因為我們系統的處理能力是一定的。
maxThreads 配置要結合 JVM -Xmx 參數調整,也就是要考慮內存開銷。
四、tomcat的協議類型優化:
1、關閉AJP端口
AJP是為 Tomcat 與 HTTP 服務器之間通信而定制的協議,能提供較高的通信速度和效率。如果tomcat前端放的是apache的時候,會使用到AJP這個連接器。若tomcat未與apache配合使用,因此不使用此連接器,因此需要註銷掉該連接器。
<!-- <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" /> -->
2、bio模式:
默認的模式,性能非常低下,沒有經過任何優化處理和支持.
3、nio模式:
01、nio(new I/O),是Java SE 1.4及後續版本提供的一種新的I/O操作方式(即java.nio包及其子包)。Java nio是一個基於緩沖區、並能提供非阻塞I/O操作的Java API,因此nio也被看成是non-blocking I/O的縮寫。它擁有比傳統I/O操作(bio)更好的並發運行性能。
02、如何啟動此模式:
修改server.xml裏的Connector節點,修改protocol為org.apache.coyote.http11.Http11NioProtocol
4、apr模式:
apr是從操作系統級別解決異步IO問題,大幅度提高服務器的並發處理性能,也是Tomcat生產環境運行的首選方式
目前Tomcat 8.x默認情況下全部是運行在nio模式下,而apr的本質就是使用jni技術調用操作系統底層的IO接口,所以需要提前安裝所需要的依賴,首先是需要安裝openssl和apr,命令如下:
yum -y install openssl-devel
yum -y install apr-devel
安裝之後,去tomcat官網下載native組件,native可以看成是tomcat和apr交互的中間環節,下載地址是:http://tomcat.apache.org/download-native.cgi 這裏下載最新的版本1.2.10
解壓之後上傳至服務器執行解壓並安裝:
tar -xvzf tomcat-native-1.2.10-src.tar.gz -C /usr/local
cd /usr/local/tomcat-native-1.2.10-src/native/
./configure 編譯安裝
然後進入tomcat安裝目錄,編輯配置文件:conf/server.xml
如圖所示,將默認的protocol="HTTP/1.1"修改為protocol="org.apache.coyote.http11.Http11AprProtocol"
apr引入方法:
配置tomcat安裝目錄下:bin/catalina.sh文件引入apr,推薦這種方式:
如圖所示在原有變量JAVA_OPTS後面追加對應的配置即可,添加一行新的就可以:JAVA_OPTS="$JAVA_OPTS -Djava.library.path=/usr/local/apr/lib"
然後保存並退出
5、系統參數優化:
優化網卡驅動可以有效提升性能,這個對於集群環境工作的時候尤為重要。由於我們采用了linux服務器,所以優化內核參數也是一個非常重要的工作。給一個參考的優化參數:
01、 修改/etc/sysctl.cnf文件,在最後追加如下內容:
net.core.netdev_max_backlog = 32768
net.core.somaxconn = 32768
net.core.wmem_default = 8388608
net.core.rmem_default = 8388608
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.ipv4.ip_local_port_range = 1024 65000 net.ipv4.route.gc_timeout = 100
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_keepalive_time = 1200
net.ipv4.tcp_timestamps = 0
net.ipv4.tcp_synack_retries = 2
net.ipv4.tcp_syn_retries = 2
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_mem = 94500000 915000000 927000000 net.ipv4.tcp_max_orphans = 3276800 net.ipv4.tcp_max_syn_backlog = 65536
02、 保存退出,執行sysctl -p生效
五、tomcat的安全配置:
1、當Tomcat完成安裝後你首先要做的事情如下:
首次安裝完成後立即刪除webapps下面的所有代碼
rm -rf /srv/apache-tomcat/webapps/*
註釋或刪除 tomcat-users.xml 所有用戶權限,看上去如下:
cat conf/tomcat-users.xml
<?xml version='1.0' encoding='utf-8'?>
<tomcat-users>
</tomcat-users>
2、隱藏tomcat版本
01.首先找到這個jar包,$TOMCAT_HOME/lib/catalina.jar
02.解壓catalina.jar之後按照路徑\org\apache\catalina\util\ServerInfo.properties找到文件
03.打開ServerInfo.properties文件修改如下:把server.number、server.built置空
server.info=Apache Tomcat
server.number=
server.built=
04.重新打成jar包,重啟tomcat。
3、隱藏tomcat 的服務類型
conf/server.xml文件中,為connector元素添加server="
",註意不是空字符串,是空格組成的長度為1的字符串,或者輸入其他的服務類型,這時候,在response header中就沒有server的信息啦!
4、應用程序安全
關閉war自動部署 unpackWARs="false" autoDeploy="false"。防止被植入木馬等惡意程序
5、修改服務監聽端口
一般公司的 Tomcat 都是放在內網的,因此我們針對 Tomcat 服務的監聽地址都是內網地址。
修改實例:
<Connector port="8080" address="172.16.100.1" />
淺談tomcat優化(內存,並發,緩存,安全,網絡,系統等)