tomcat7調優經歷

1. jvm堆棧設置:html

    修改TOMCAT_HOME/bin/catalina.bat:java

    set JAVA_OPTS=%JAVA_OPTS% -server -Xms1024m -Xmx1024m -XX:NewSize=400m -XX:MaxNewSize=400m -XX:PermSize=512m -XX:MaxPermSize=512mshell

    -server:比-client擁有更大、更高的併發處理能力。apache

    -Xms -Xmx:初始堆內存大小和最大對內存大小,大小能夠同樣。緩存

    -XX:NewSize -XX:MaxNewSize:默認年輕代空間的大小和最大大小。tomcat

    -XX:PermSize -XX:MaxPermSize:默認持久代空間的大小和最大大小。服務器

    部分引用http://www.cnblogs.com/interdrp/archive/2010/11/24/1887106.html併發

2. jvm運行參數查看:jvm

jps
:與unix上的ps相似,用來顯示本地的java進程,能夠查看本地運行着幾個java程序,並顯示他們的進程號。 

jstat
:一個極強的監視VM內存工具。能夠用來監視VM內存內的各類堆和非堆的大小及其內存使用量。 

jmap
:打印出某個java進程(使用pid)內存內的,全部‘對象’的狀況(如:產生那些對象,及其數量)。 

jconsole
:一個java GUI監視工具,能夠以圖表化的形式顯示各類數據。並可經過遠程鏈接監視遠程的服務器VM。
D:\>jmap -histo 4636 > d:log.log #打印堆信息

D:\>jmap -dump:live,format=b,file=d:\log.log 4636 #生成二進制堆信息,與下一步協同使用
D:\>jhat log.log #根據提示,訪問IP:7000查看heap信息

    http://jiajun.iteye.com/blog/443196socket

    http://risheng.iteye.com/blog/1453098

3. tomcat參數(以tomcat-7.0.23說明):

<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="90" maxIdleTime="600000" />

    <!-- 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="8099" protocol="org.apache.coyote.http11.Http11AprProtocol"
               connectionTimeout="40000" acceptCount="300" maxKeepAliveRequests="1"
               redirectPort="8443" executor="tomcatThreadPool" />
    <!-- A "Connector" using the shared thread pool-->
    <!-- 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" executor="tomcatThreadPool" />
  </Service>

    http://tomcat.apache.org/tomcat-7.0-doc/config/http.html

Executor節點:配置線程池,供鏈接器(Connector)引用

    a. maxThreads-線程池可建立的最大線程數,默認200

    b. minSpareThreads-最小備用線程數,tomcat啓動時初始化的線程數,默認25

    c. maxIdleTime-若是線程數大於minSpareThreads時,空閒線程持續空閒時間超過該時間時會被銷燬,默認60000(1分鐘)

Connector節點:

    a. protocol-本人不甚清楚,故不做解釋,不過有如下可選項:

        org.apache.coyote.http11.Http11Protocol - blocking Java connector

        org.apache.coyote.http11.Http11NioProtocol - non blocking Java connector

        org.apache.coyote.http11.Http11AprProtocol - the APR/native connector

        默認值是HTTP/1.1,根據環境變量自動選擇blocking Java connector或the APR/native connector。tomcat啓動後能夠根據Starting ProtocolHandler信息判斷使用的是哪一種協議。

        基本上,bio性能最低下,nio次之,最好是apr。不過有網友說使用Apr協議時,要安裝apr和native環境,不過我並無作這些,也是用的apr。

    http://passover.blog.51cto.com/2431658/732629

    http://www.oschina.net/question/54100_16195

    b. acceptCount-當全部可用請求處理線程用盡時,隊列能夠緩存的請求數。若是隊列已滿,新上來的請求會被refuse掉。默認值100

    c. acceptorThreadCount-用於接收請求的線程數。在多CPU機器上能夠提升該數值,但真心不必超過2。同時,對於非keep-alive的鏈接,你也想要提升該數值。默認1。這是官方的解釋,我我的不太理解。

    d. connectionTimeout-在accept來自client的connect後,等待請求uri行出現的最大時間。設置爲-1,表示無限等待。若是disableUploadTimeout=true,也會做爲等待請求體的超時限制。disableUploadTimeout值默認true。

    e. maxKeepAliveRequests-對於同一個鏈接,容許的最多http請求次數,超過限制值server主動關閉鏈接。1表示禁用keep-alive,-1表示容許無數次HTTP請求,默認取100。keep-alive特性可看下邊的介紹。

4. keep-alive:

    http://backend.blog.163.com/blog/static/2022941262014029105618173/

    http://blog.csdn.net/ctthuangcheng/article/details/8596818

    http1.1(http1.0不是標準,依服務器而定)是支持長鏈接的,長鏈接可以保證服務器和客戶端的socket可以高效利用,減小握手等額外的開銷。在HTTP請求頭中Connection: keep-alive表示支持並啓用長鏈接,Connection: close表示使用短鏈接。

    長鏈接容許鏈接創建後,client發起屢次HTTP請求,這個過程當中既能夠在達到server的maxKeepAliveRequests以前由client主動關閉,也能夠在達到maxKeepAliveRequests限制後,server主動關閉,server主動關閉時,其返回的HTTP/1.1 200 OK信息中會包含Connection: close。

    短鏈接:在每次server返回HTTP/1.1 200 OK時,都會包含Connection: close。

    主動關閉鏈接的一方,會出現大量的TIME_WAIT狀態的鏈接。

5. TIME_WAIT狀態:

    TCP的3個常見狀態:ESTABLISHED 表示正在通訊,TIME_WAIT 表示主動關閉,CLOSE_WAIT 表示被動關閉。

    鏈接會在主動關閉它的機器裏以TIME_WAIT狀態存在2個MSL時間,(MSL在RFC 1122上建議是2分鐘,而源自berkeley的TCP實現傳統上使用30秒winddows操做系統是2分鐘)。

    若是雙方協定啓用keep-alive,在客戶端創建大量短鏈接並主動關閉後,會在2MSL時間內存在大量的處於TIME_WAIT狀態的鏈接。若是達到上限,就沒法創建新的請求了。不過這種狀況比較少遇到。

    若是禁用keep-alive,也一樣會在服務端保存大量處於TIME_WAIT狀態的鏈接

    http://blog.csdn.net/shootyou/article/details/6622226#

    http://elf8848.iteye.com/blog/1739571

相關文章
相關標籤/搜索