tomcat默認參數是爲開發環境制定,而非適合生產環境,尤其是內存和線程的配置,默認都很低,容易成爲性能瓶頸
爲此爲大家分享下tomcat幾種常見的性能優化
一、內存優化
-
Tomcat內存優化主要是對 tomcat 啓動參數優化,我們可以在 tomcat 的啓動腳本 catalina.sh 中設置 java_OPTS 參數
-
JAVA_OPTS參數說明
-server 啓用jdk 的 server 版
-Xms java虛擬機初始化時的最小內存
-Xmx java虛擬機可使用的最大內存
-XX: PermSize 內存永久保留區域
-XX:MaxPermSize 內存最大永久保留區域 -
修改示例如下
linux修改TOMCAT_HOME/bin/catalina.sh,在前面加入
JAVA_OPTS="-XX:PermSize=64M -XX:MaxPermSize=128m -Xms512m -Xmx1024m -Duser.timezone=Asia/Shanghai"
windows修改TOMCAT_HOME/bin/catalina.bat,在前面加入
set JAVA_OPTS=-XX:PermSize=64M -XX:MaxPermSize=128m -Xms512m -Xmx1024m
最大堆內存是1024m,對於現在的硬件還是偏低,實施時,還是按照機器具體硬件配置優化。
二、高併發下線程優化
打開/conf/server.xml
1、調整連接器connector的併發處理能力:
maxThreads :客戶請求最大線程數
minSpareThreads :Tomcat初始化時創建的 socket 線程數
maxSpareThreads: Tomcat連接器的最大空閒 socket 線程數
enableLookups :是否反查域名,取值爲: true 或 false 。爲了提高處理能力,應設置爲 false
redirectPort: 在需要基於安全通道的場合,把客戶請求轉發到基於SSL 的 redirectPort 端口
acceptAccount: 監聽端口隊列最大數,滿了之後客戶請求會被拒絕(不能小於maxSpareThreads )
connectionTimeout: 連接超時
minProcessors: 服務器創建時的最小處理線程數
maxProcessors: 服務器同時最大處理線程數
URIEncoding: URL統一編碼
其中和最大連接數相關的參數爲maxProcessors 和 acceptCount 。如果要加大併發連接數,應同時加大這兩個參數。
2、壓縮優化及參數
●compression="on" 打開壓縮功能
●compressionMinSize="2048"啓用壓縮的輸出內容大小,默認爲2KB
●noCompressionUserAgents="gozilla,traviata" 對於以下的瀏覽器,不啓用壓縮
●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 去做。
三、緩存優化
1、tomcat的maxThreads、acceptCount(最大線程數、最大排隊數)
說明:
maxThreads:tomcat起動的最大線程數,即同時處理的任務個數,默認值爲200
acceptCount:當tomcat起動的線程數達到最大時,接受排隊的請求個數,默認值爲100
acceptCount的配置,我一般是設置的跟maxThreads一樣大,這個值應該是主要根據應用的訪問峯值與平均值來權衡配置的。
如果設的較小,可以保證接受的請求較快相應,但是超出的請求可能就直接被拒絕
如果設的較大,可能就會出現大量的請求超時的情況,因爲我們系統的處理能力是一定的。
maxThreads 配置要結合 JVM -Xmx 參數調整,也就是要考慮內存開銷
四、禁用DNS查詢
當web應用程序向要記錄客戶端的信息時,它也會記錄客戶端的IP地址或者通過域名服務器查找機器名 轉換爲IP地址。
DNS查詢需要佔用網絡,並且包括可能從很多很遠的服務器或者不起作用的服務器上去獲取對應的IP的過程,這樣會消耗一定的時間。
修改server.xml文件中的Connector元素,修改屬性enableLookups參數值: enableLookups="false"
如果爲true,則可以通過調用request.getRemoteHost()進行DNS查詢來得到遠程客戶端的實際主機名,若爲false則不進行DNS查詢,而是返回其ip地址