Tomcat優化相關問題

1. 你怎樣給 tomcat 去調優?

  1. JVM參數調優:-Xms 表示JVM初始化堆的大小,-Xmx表示JVM堆的最
    大值。這兩個值的大小一般根據需要進行設置。當應用程序需要的內存超出堆的最大值時虛擬機就會提示內存溢出,並且導致應用服務崩潰。因此一般建議堆的最大值設置爲可用內存的最大值的80%。在catalina.bat中,設置JAVA_OPTS=’-Xms256m -Xmx512m’,表示初始化內存爲256MB,可以使用的最大內存爲512MB。
  2. 禁用DNS查詢
    當web應用程序向要記錄客戶端的信息時,它也會記錄客戶端的IP地址或者通過域名服務器查找機器名轉換爲IP地址。DNS查詢需要佔用網絡,並且包括可能從很多很遠的服務器或者不起作用的服務器上去獲取對應的IP的過程,這樣會消耗一定的時間。爲了消除DNS查詢對性能的影響我們可以關閉DNS查詢,方式是修改server.xml文件中的enableLookups參數值:
<Connector className="org.apache.coyote.tomcat4.CoyoteConnector" port="80" 
minProcessors="5" maxProcessors="75" enableLookups="false" redirectPort="8443" 
acceptCount="100" debug="0" connectionTimeout="20000" 
useURIValidationHack="false" disableUploadTimeout="true" />  

Tomcat5

<Connector port="80" maxThreads="150" minSpareThreads="25" 
maxSpareThreads="75" enableLookups="false" redirectPort="8443" 
acceptCount="100" debug="0" connectionTimeout="20000" 
disableUploadTimeout="true"/>  
  1. 調整線程數
    通過應用程序的連接器(Connector)進行性能控制的的參數是創建的處理請求的線程數。Tomcat使用線程池加速響應速度來處理請求。在Java中線程是程序運行時的路徑,是在一個程序中與其它控制線程無關的、能夠獨立運行的代碼段。它們共享相同的地址空間。多線程幫助程序員寫出CPU最大利用率的高效程序,使空閒時間保持最低,從而接受更多的請求。
    Tomcat4中可以通過修改minProcessors和maxProcessors的值來控制線程數。這些值
    在安裝後就已經設定爲默認值並且是足夠使用的,但是隨着站點的擴容而改大這些值。minProcessors服務器啓動時創建的處理請求的線程數應該足夠處理一個小量的負載。也就是說,如果一天內每秒僅發生5次單擊事件,並且每個請求任務處理需要1秒鐘,那麼預先設置線程數爲5就足夠了。但在你的站點訪問量較大時就需要設置更大的線程數,指定爲參數maxProcessors的值。maxProcessors的值也是有上限的,應防止流量不可控制(或者惡意的服務攻擊),從而導致超出了虛擬機使用內存的大小。如果要加大併發連接數,應同時加大這兩個參數。web server允許的最大連接數還受制於操作系統的內核參數設置,通常Windows是2000個左右,Linux是1000個左右。
    在Tomcat5對這些參數進行了調整,請看下面屬性:
    maxThreads Tomcat使用線程來處理接收的每個請求。這個值表示Tomcat可創建的最大的線程數。
    acceptCount 指定當所有可以使用的處理請求的線程數都被使用時,可以放到處理隊列中的請求數,超過這個數的請求將不予處理。
    connnectionTimeout 網絡連接超時,單位:毫秒。設置爲0表示永不超時,這樣設置有隱患的。通常可設置爲30000毫秒。
    minSpareThreads Tomcat初始化時創建的線程數。
    maxSpareThreads 一旦創建的線程超過這個值,Tomcat就會關閉不再需要的socket線程。 最好的方式是多設置幾次並且進行測試,觀察響應時間和內存使用情況。在不同的機器、操作系統或虛擬機組合的情況下可能會不同,而且並不是所有人的web站點的流量都是一樣的,因此沒有一刀切的方案來確定線程數的值。

2. 如何加大tomcat連接數

在tomcat配置文件server.xml中的配置中,和連接數相關的參數有:
minProcessors:最小空閒連接線程數,用於提高系統處理性能,默認值爲10
maxProcessors:最大連接線程數,即:併發處理的最大請求數,默認值爲75
acceptCount:允許的最大連接數,應大於等於maxProcessors,默認值爲100
enableLookups:是否反查域名,取值爲:true或false。爲了提高處理能力,應設置爲false
connectionTimeout:網絡連接超時,單位:毫秒。設置爲0表示永不超時,這樣設置有隱患
的。通常可設置爲30000毫秒。
其中和最大連接數相關的參數爲maxProcessors和acceptCount。如果要加大併發連接數,
應同時加大這兩個參數。
web server允許的最大連接數還受制於操作系統的內核參數設置,通常Windows是2000個
左右,Linux是1000個左右。tomcat5中的配置示例:

<Connector port="8080" 
           maxThreads="150" minSpareThreads="25" maxSpareThreads="75" 
           enableLookups="false" redirectPort="8443" acceptCount="100" 
           debug="0" connectionTimeout="20000"  
           disableUploadTimeout="true" /> 

對於其他端口的偵聽配置,以此類推。

3. tomcat中如何禁止列目錄下的文件

在{tomcat_home}/conf/web.xml中,把listings參數設置成false即可,如下:

<init-param>   
<param-name>listings</param-name>   
<param-value>false</param-value>   
</init-param>   
<init-param> 
<param-name>listings</param-name> 
<param-value>false</param-value> 
</init-param>  

4.怎樣加大tomcat的內存。

首先檢查程序有沒有限入死循環
這個問題主要還是由這個問題 java.lang.OutOfMemoryError: Java heap space 引起的。第一次出現這樣 的的問題以後,引發了其他的問題。在網上一查可能是 JAVA 的堆棧設置太小的原因。 跟據網上的答案大致有這兩種解決方法:
1、設置環境變量
解決方法:手動設置 Heap size 修改 TOMCAT_HOME/bin/catalina.sh set JAVA_OPTS= -Xms32m -Xmx512m 可以根據自己機器的內存進行更改。
2、java -Xms32m -Xmx800m className 就是在執行 JAVA 類文件時加上這個參數,其中 className 是需要執行的確類名。(包括包名) 這個解決問題了。而且執行的速度比沒有設置的時候快很多。
如果在測試的時候可能會用 Eclispe 這時候就需要在 Eclipse ->run -arguments 中的 VM arguments 中輸 入-Xms32m -Xmx800m 這個參數就可以了。
後來在 Eclilpse 中修改了啓動參數,在 VM arguments 加入了-Xms32m -Xmx800m,問題解決。
一、java.lang.OutOfMemoryError: PermGen space
PermGen space 的全稱是 Permanent Generation space,是指內存的永久保存區域, 這塊內存主要是被 JVM 存放 Class 和 Meta 信息的,Class 在被 Loader 時就會被放到 PermGen space 中, 它和存放類實例(Instance)的 Heap 區域不同,GC(Garbage Collection)不會在主程序運行期對 PermGen space 進行清理,所以如果你的應用中有很多 CLASS 的話,就很可能出現 PermGen space 錯 誤, 這種錯誤常見在 web 服務器對 JSP 進行 pre compile 的時候。如果你的 WEB APP下都用了大量的第三 方 jar, 其大小 超過了 jvm 默認的大小(4M)那麼就會產生此錯誤信息了。
解決方法: 手動設置 MaxPermSize 大小
修改 TOMCAT_HOME/bin/catalina.sh 在“echo “Using CATALINA_BASE: $CATALINA_BASE””上面加入以下行: JAVA_OPTS="-server -XX:PermSize=64M -XX:MaxPermSize=128m 建議:將相同的第三方 jar 文件移置到 tomcat/shared/lib 目錄下,這樣可以達到減少 jar 文檔重複佔用內 存的目的。
二、java.lang.OutOfMemoryError: Java heap space
Heap size 設置
JVM 堆的設置是指 java 程序運行過程中 JVM 可以調配使用的內存空間的設置.JVM 在啓動的時候會自動 設置 Heap size 的值,
其初始空間(即-Xms)是物理內存的 1/64,最大空間(-Xmx)是物理內存的 1/4。可以利用 JVM 提供的-Xmn -Xms -Xmx 等選項可 進行設置。Heap size 的大小是 Young Generation 和 Tenured Generaion 之和。
提示:在 JVM 中如果 98%的時間是用於 GC 且可用的 Heap size 不足 2%的時候將拋出此異常信息。 提示:Heap Size 最大不要超過可用物理內存的 80%,一般的要將-Xms 和-Xmx 選項設置爲相同,而Xmn 爲 1/4 的-Xmx 值。
解決方法:手動設置 Heap size
修改 TOMCAT_HOME/bin/catalina.sh
在“echo “Using CATALINA_BASE: $CATALINA_BASE””上面加入以下行: JAVA_OPTS="-server -Xms800m -Xmx800m -XX:MaxNewSize=256m"
三、實例,以下給出 1G 內存環境下 java jvm 的參數設置參考:
JAVA_OPTS="-server -Xms800m -Xmx800m -XX:PermSize=64M -XX:MaxNewSize=256m XX:MaxPermSize=128m -Djava.awt.headless=true "
很大的 web 工程,用 tomcat 默認分配的內存空間無法啓動,如果不是在 myeclipse 中啓動 tomcat 可以 對 tomcat 這樣設置:
TOMCAT_HOME/bin/catalina.bat 中添加這樣一句話:
**

set JAVA_OPTS=-server -Xms2048m -Xmx4096m -XX:PermSize=512M
XX:MaxPermSize=1024M -Duser.timezone=GMT+08

**
或者 set JAVA_OPTS= -Xmx1024M -Xms512M -XX:MaxPermSize=256m
如果要在 myeclipse 中啓動,上述的修改就不起作用了,可如下設置:
Myeclipse->preferences->myeclipse->servers->tomcat->tomcat×.×->JDK 面板中的
Optional Java VM arguments 中添加:-Xmx1024M -Xms512M -XX:MaxPermSize=256m
以上是轉貼,但本人遇見的問題是:在 myeclipse 中啓動 Tomcat 時,提示"ava.lang.OutOfMemoryError: Java heap space",
解決辦法就是:
Myeclipse->preferences->myeclipse->servers->tomcat->tomcat×.×->JDK 面板中的
Optional Java VM arguments 中添加:-Xmx1024M -Xms512M -XX:MaxPermSize=256m

5.Tomcat有幾種部署方式

tomcat中四種部署項目的方法
第一種方法:
在tomcat中的conf目錄中,在server.xml中的,節點中添加:


至於Context 節點屬性,可詳細見相關文檔。
第二種方法:
將web項目文件件拷貝到webapps 目錄中。
第三種方法:
很靈活,在conf目錄中,新建 Catalina(注意大小寫)\localhost目錄,在該目錄中新建一
個xml文件,名字可以隨意取,只要和當前文件中的文件名不重複就行了,該xml文件的內容
爲:

<Context path="/hello" docBase="D:eclipse3.2.2forwebtoolsworkspacehelloWebRoot" 
debug="0" privileged="true">  
</Context> 

第3個方法有個優點,可以定義別名。服務器端運行的項目名稱爲path,外部訪問的URL則
使用XML的文件名。這個方法很方便的隱藏了項目的名稱,對一些項目名稱被固定不能更
換,但外部訪問時又想換個路徑,非常有效。
第2、3還有優點,可以定義一些個性配置,如數據源的配置等。
第四種辦法,:
可以用tomcat在線後臺管理器,一般tomcat都打開了,直接上傳war就可以

6.Tomcat 的優化經驗。

Tomcat 作爲 Web 服務器,它的處理性能直接關係到用戶體驗,下面是幾種常見的
優化措施:

  • 去掉對 web.xml 的監視,把 jsp 提前編輯成 Servlet。有富餘物理內存的 情況,加大 tomcat 使用的 jvm的內存。
  • 服務器資源
    服務器所能提供 CPU、內存、硬盤的性能對處理能力有決定性影響。
    o 對於高併發情況下會有大量的運算,那麼 CPU 的速度會直接影響到處 理速度。
    o 內存在大量數據處理的情況下,將會有較大的內存容量需求,可以用 - Xmx -Xms -XX:MaxPermSize 等參數對內存不同功能塊進行劃分。我們之前就遇到過內存分配不足,導致虛擬機一直處於 full GC,從而導致處理能力嚴重下降。
    o 硬盤主要問題就是讀寫性能,當大量文件進行讀寫時,磁盤極容易成爲性能瓶頸。最好的辦法還是利用下面提到的緩存。
  • 利用緩存和壓縮
    對於靜態頁面最好是能夠緩存起來,這樣就不必每次從磁盤上讀。這裏我們採用了 Nginx 作爲緩存服務器,將圖片、css、js 文件都進行了緩存,有效的減少了後端 tomcat 的訪問。另外,爲了能加快網絡傳輸速度,開啓 gzip 壓縮也是必不可少的。但考慮到 tomcat 已經需要處理很多東西了,所以把這個壓縮的工作就交給前端的 Nginx 來完成。除了文本可以用
    gzip 壓縮,其實很多圖片也可以用圖像處理工具預先進行壓縮,找到一個平衡點可以讓畫質損失很小而文件可以減小很多。曾經我就見過一個圖片從 300 多 kb 壓縮到幾十 kb,自己幾乎看不出來區別。
  • 採用集羣
    單個服務器性能總是有限的,最好的辦法自然是實現橫向擴展,那麼組建
    tomcat 集羣是有效提升性能的手段。我們還是採用了 Nginx 來作爲請求分
    流的服務器,後端多個 tomcat 共享 session 來協同工作。可以參考之前寫
    的《利用 nginx+tomcat+memcached 組建 web 服務器負載均衡》。
  • 優化 tomcat 參數

這裏以 tomcat7 的參數配置爲例,需要修改 conf/server.xml 文件,主要是優化連
接配置,關閉客戶端 dns 查詢。

<Connector port="8080"       
protocol="org.apache.coyote.http11.Http11NioProtocol"      
connectionTimeout="20000"      
redirectPort="8443"       
maxThreads="500"   
    minSpareThreads="20"      
    acceptCount="100"     
    disableUploadTimeout="true"     
    enableLookups="false"       
    URIEncoding="UTF-8" />  
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章