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

相关文章
相关标签/搜索