Tomcat調優總結


Tomcat 優化分為系統優化,Java虛擬機調優,Tomcat本身的優化。
Tomcat 如何起停
./catalina.sh stop
./catalina.sh start
/sbin/service tomcat restart
 /webagme/tomcat/bin/catalina.sh start
1.如何調整tomcat的占用內存
A: 方法如下:
1. linux 下編輯tomcat安裝目錄下的bin目錄下的catalina.sh文件,windows下為catalina.bat
vi  catalina.sh
2. 查找到tomcat內存參數一行:/ JAVA_OPTS,如果找不到則在第一行寫上
3. 將JAVA_OPTS="-Xms  1024m –Xmx  1520m"一行的兩個參數依據服務器實際內存數量分別進行更改:
        - Xms為tomcat啟動初始內存,一般為服務器開機后可用空閑內存減去100M
        - Xmx為tomcat最大占用內存,一般為服務器開機后可用空閑內存減去50M
一般說來,您應該使用物理內存的 80% 作為堆大小。
說明:以上兩個參數關系到tomcat承受的訪問性能,但也要根據服務器實際內存情況設定。
有人建議Xms和Xmx的值取成一樣比較好,說是可以加快內存回收速度。但未經本人驗證過。有興趣可以試試。
 
這兩個值的大小一般根據需要進行配置。初始化堆的大小執行了虛擬機在啟動時向系統申請的內存的大小。一般而言,這個參數不重要。但是有的應用程式在大負載的情況下會急劇地占用更多的內存,此時這個參數就是顯得很重要,假如虛擬機啟動時配置使用的內存比較小而在這種情況下有許多對象進行初始化,虛擬機就必須重復地增加內存來滿足使用。由於這種原因,我們一般把-Xms和-Xmx設為相同大,而堆的最大值受限於系統使用的物理內存。一般使用數據量較大的應用程式會使用持久對象,內存使用有可能迅速地增長。當應用程式需要的內存超出堆的最大值時虛擬機就會提示內存溢出,並且導致應用服務崩潰。因此一般建議堆的最大值配置為可用內存的最大值的80%。 


Tomcat默認能夠使用的內存為128MB,在較大型的應用項目中,這點內存是不夠的,需要調大。 


Windows下,在文檔/bin/catalina.bat,Unix下,在文檔/bin/catalina.sh的前面,增加如下配置: 


JAVA_OPTS='-Xms【初始化內存大小】 -Xmx【能夠使用的最大內存】' 


需要把這個兩個參數值調大。例如: 


JAVA_OPTS='-Xms256m -Xmx512m' 


表示初始化內存為256MB,能夠使用的最大內存為512MB。 


另外需要考慮的是Java提供的垃圾回收機制。虛擬機的堆大小決定了虛擬機花費在收集垃圾上的時間和頻度。收集垃圾能夠接受的速度和應用有關,應該通過分析實際的垃圾收集的時間和頻率來調整。假如堆的大小很大,那么完全垃圾收集就會很慢,但是頻度會降低。假如您把堆的大小和內存的需要一致,完全收集就很快,但是會更加頻繁。調整堆大小的的目的是最小化垃圾收集的時間,以在特定的時間內最大化處理客戶的請求。在基准測試的時候,為確保最好的性能,要把堆的大小設大,確保垃圾收集不在整個基准測試的過程中出現。 


假如系統花費很多的時間收集垃圾,請減小堆大小。一次完全的垃圾收集應該不超過 3-5 秒。假如垃圾收集成為瓶頸,那么需要指定代的大小,檢查垃圾收集的周詳輸出,研究 垃圾收集參數對性能的影響。一般說來,您應該使用物理內存的 80% 作為堆大小。當增加處理器時,記得增加內存,因為分配能夠並行進行,而垃圾收集不是並行的。 
 
2.如何調整tomcat的線程參數
A: 方法如下:
5.編輯tomcat安裝目錄下的conf目錄下的server.xml文件
在tomcat配置文件server.xml中的<Connector />配置中,和連接數相關的參數有:
maxThreads="150"     表示最多同時處理150個連接,Tomcat使用線程來處理接收的每個請求。這個值表示Tomcat可創建的最大的線程數。默認值200。   
minSpareThreads="25"     表示即使沒有人使用也開這么多空線程等待  
  maxSpareThreads="75"     表示如果最多可以空75個線程,例如某時刻有80人訪問,之后沒有人訪問了,則tomcat不會保留80個空線程,而是關閉5個空的。  (一旦創建的線程超過這個值,Tomcat就會關閉不再需要的socket線程。默認值50。 

   
  acceptCount="100"   當同時連接的人數達到maxThreads時,還可以接收排隊的連接數量,超過這個連接的則直接返回拒絕連接。(指定當任何能夠使用的處理請求的線程數都被使用時,能夠放到處理隊列中的請求數,超過這個數的請求將不予處理。默認值100。 )
其中和最大連接數相關的參數為maxThreads和acceptCount。如果要加大並發連接數,應同時加大這兩個參數。
web server允許的最大連接數還受制於操作系統的內核參數設置,通常Windows是2000個左右,Linux是1000個左右。tomcat5中的配置示例:
    <Connector port="8080"
               maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
               acceptCount="100"/>
主要是調整maxThreads 和acceptCount的值
對於其他端口的偵聽配置,以此類推。
在tomcat配置文檔server.xml中的配置中,和連接數相關的其他參數有: 

enableLookups: 

是否反查域名,默認值為true。為了提高處理能力,應配置為false 

connnectionTimeout: 

網絡連接超時,默認值60000,單位:毫秒。配置為0表示永不超時,這樣配置有隱患的。通常可配置為30000毫秒。 

maxKeepAliveRequests:
nginx動態的轉給tomcat,nginx是不能keepalive的,而tomcat端默認開啟了keepalive,會等待keepalive的timeout,默認不設置就是使用connectionTimeout。
所以必須設置tomcat的超時時間,並關閉tomcat的keepalive。否則會產生大量tomcat的socket timewait。
maxKeepAliveRequests="1"就可以避免tomcat產生大量的TIME_WAIT連接,從而從一定程度上避免tomcat假死。
試試設置tomcat/conf/server.xml:

maxKeepAliveRequests="1"
connectionTimeout="20000"

 maxKeepAliveRequests="1"表示每個連接只響應一次就關閉,這樣就不會等待timeout了。
 
    <Connector executor="tomcatThreadPool"
               port="8080" protocol="HTTP/1.1" 
               connectionTimeout="30000" maxKeepAliveRequests="1" 
               redirectPort="8443" bufferSize="8192" sockedBuffer="65536" acceptCount="200"/>

bufferSize: 

輸入流緩沖大小,默認值2048 bytes。 

compression: 

壓縮傳輸,取值on/off/force,默認值off。
3、 tomcat中如何禁止和允許列目錄下的文檔 

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



<servlet> 
... 
<init-param> 
<param-name>listings</param-name> 
<param-value>false</param-value> 
</init-param> 
... 
</servlet> 
4、 tomcat中如何禁止和允許主機或IP地址訪問 
<Host name="localhost" ...> 
  ... 
  <Valve className="org.apache.catalina.valves.RemoteHostValve" 
         allow="*.mycompany.com,www.yourcompany.com"/> 
  <Valve className="org.apache.catalina.valves.RemoteAddrValve" 
         deny="192.168.1.*"/> 
  ... 
</Host> 
cat /webgame/tomcat/conf/server.xml 

 


 

<?xml version='1.0' encoding='utf-8'?>
<!--
  Licensed to the Apache Software Foundation (ASF) under one or more
  contributor license agreements.  See the NOTICE file distributed with
  this work for additional information regarding copyright ownership.
  The ASF licenses this file to You under the Apache License, Version 2.0
  (the "License"); you may not use this file except in compliance with
  the License.  You may obtain a copy of the License at

      http://www.apache.org/licenses/LICENSE-2.0

  Unless required by applicable law or agreed to in writing, software
  distributed under the License is distributed on an "AS IS" BASIS,
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  See the License for the specific language governing permissions and
  limitations under the License.
-->
<!-- Note:  A "Server" is not itself a "Container", so you may not
     define subcomponents such as "Valves" at this level.
     Documentation at /docs/config/server.html
 -->
<Server port="8005" shutdown="SHUTDOWN">

  <!--APR library loader. Documentation at /docs/apr.html -->
  <Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" />
  <!--Initialize Jasper prior to webapps are loaded. Documentation at /docs/jasper-howto.html -->
  <Listener className="org.apache.catalina.core.JasperListener" />
  <!-- JMX Support for the Tomcat server. Documentation at /docs/non-existent.html -->
  <Listener className="org.apache.catalina.mbeans.ServerLifecycleListener" />
  <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />

  <!-- Global JNDI resources
       Documentation at /docs/jndi-resources-howto.html
  -->
  <GlobalNamingResources>
    <!-- Editable user database that can also be used by
         UserDatabaseRealm to authenticate users
    -->
    <Resource name="UserDatabase" auth="Container"
              type="org.apache.catalina.UserDatabase"
              deion="User database that can be updated and saved"
              factory="org.apache.catalina.users.MemoryUserDatabaseFactory"
              pathname="conf/tomcat-users.xml" />
  </GlobalNamingResources>

  <!-- A "Service" is a collection of one or more "Connectors" that share
       a single "Container" Note:  A "Service" is not itself a "Container", 
       so you may not define subcomponents such as "Valves" at this level.
       Documentation at /docs/config/service.html
   -->
  <Service name="Catalina">
  
    <!--The connectors can use a shared executor, you can define one or more named thread pools-->
    <Executor name="tomcatThreadPool" namePrefix="catalina-exec-" 
        maxThreads="500" minSpareThreads="50" maxIdleTime="60000"/>
    
    
    <!-- A "Connector" represents an endpoint by which requests are received
         and responses are returned. Documentation at :
         Java HTTP Connector: /docs/config/http.html (blocking & non-blocking)
         Java AJP  Connector: /docs/config/ajp.html
         APR (HTTP/AJP) Connector: /docs/apr.html
         Define a non-SSL HTTP/1.1 Connector on port 8080
    -->
        <!--
    <Connector port="8080" protocol="HTTP/1.1" 
               connectionTimeout="20000" 
               redirectPort="8443" maxThreads="500"/>
        -->
    <!-- A "Connector" using the shared thread pool-->
    <Connector executor="tomcatThreadPool"
               port="8080" protocol="HTTP/1.1" 
               connectionTimeout="20000" 
               redirectPort="8443" maxKeepAliveRequests="1"/>
    <!-- Define a SSL HTTP/1.1 Connector on port 8443
         This connector uses the JSSE configuration, when using APR, the 
         connector should be using the OpenSSL style configuration
         described in the APR documentation -->
    <!--
    <Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true"
               maxThreads="150" scheme="https" secure="true"
               clientAuth="false" sslProtocol="TLS" />
    -->

    <!-- Define an AJP 1.3 Connector on port 8009 -->
    <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />


    <!-- An Engine represents the entry point (within Catalina) that processes
         every request.  The Engine implementation for Tomcat stand alone
         analyzes the HTTP headers included with the request, and passes them
         on to the appropriate Host (virtual host).
         Documentation at /docs/config/engine.html -->

    <!-- You should set jvmRoute to support load-balancing via AJP ie :
    <Engine name="Catalina" defaultHost="localhost" jvmRoute="jvm1">         
    --> 
    <Engine name="Catalina" defaultHost="localhost">

      <!--For clustering, please take a look at documentation at:
          /docs/cluster-howto.html  (simple how to)
          /docs/config/cluster.html (reference documentation) -->
      <!--
      <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/>
      -->       

      <!-- The request dumper valve dumps useful debugging information about
           the request and response data received and sent by Tomcat.
           Documentation at: /docs/config/valve.html -->
      <!--
      <Valve className="org.apache.catalina.valves.RequestDumperValve"/>
      -->

      <!-- This Realm uses the UserDatabase configured in the global JNDI
           resources under the key "UserDatabase".  Any edits
           that are performed against this UserDatabase are immediately
           available for use by the Realm.  -->
      <Realm className="org.apache.catalina.realm.UserDatabaseRealm"
             resourceName="UserDatabase"/>

      <!-- Define the default virtual host
           Note: XML Schema validation will not work with Xerces 2.2.
       -->
      <Host name="localhost"  appBase="webapps"
            unpackWARs="true" autoDeploy="true"
            xmlValidation="false" xmlNamespaceAware="false">

        <!-- SingleSignOn valve, share authentication between web applications
             Documentation at: /docs/config/valve.html -->
        <!--
        <Valve className="org.apache.catalina.authenticator.SingleSignOn" />
        -->

        <!-- Access log processes all example.
             Documentation at: /docs/config/valve.html -->
        <!--
        <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"  
               prefix="localhost_access_log." suffix=".txt" pattern="common" resolveHosts="false"/>
        -->

      </Host>
    </Engine>
  </Service>
</Server>

參考文檔:Tomcat調優配置技巧集錦 

 

原文地址:http://blog.csdn.net/jiangguilong2000/article/details/12523771


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM