首页 > 代码库 > tomcat调优经历

tomcat调优经历

1. jvm堆栈设置:

    修改TOMCAT_HOME/bin/catalina.bat:

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

    -server:比-client拥有更大、更高的并发处理能力。

    -Xms -Xmx:初始堆内存大小和最大对内存大小,大小可以一样。

    -XX:NewSize -XX:MaxNewSize:默认年轻代空间的大小和最大大小。

    -XX:PermSize -XX:MaxPermSize:默认持久代空间的大小和最大大小。

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

2. jvm运行参数查看:

01jps
02:与unix上的ps类似,用来显示本地的java进程,可以查看本地运行着几个java程序,并显示他们的进程号。 
03 
04jstat
05:一个极强的监视VM内存工具。可以用来监视VM内存内的各种堆和非堆的大小及其内存使用量。 
06 
07jmap
08:打印出某个java进程(使用pid)内存内的,所有‘对象’的情况(如:产生那些对象,及其数量)。 
09 
10jconsole
11:一个java GUI监视工具,可以以图表化的形式显示各种数据。并可通过远程连接监视远程的服务器VM。
1D:\>jmap -histo 4636 > d:log.log #打印堆信息
2 
3D:\>jmap -dump:live,format=b,file=d:\log.log 4636 #生成二进制堆信息,与下一步协同使用
4D:\>jhat log.log #根据提示,访问IP:7000查看heap信息

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

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

3. tomcat参数(以tomcat-7.0.23说明):

01<Service name="Catalina">
02 
03    <!--The connectors can use a shared executor, you can define one or more named thread pools-->
04    <Executor name="tomcatThreadPool" namePrefix="catalina-exec-"
05        maxThreads="500" minSpareThreads="90" maxIdleTime="600000" />
06 
07    <!-- A "Connector" represents an endpoint by which requests are received
08         and responses are returned. Documentation at :
09         Java HTTP Connector: /docs/config/http.html (blocking & non-blocking)
10         Java AJP  Connector: /docs/config/ajp.html
11         APR (HTTP/AJP) Connector: /docs/apr.html
12         Define a non-SSL HTTP/1.1 Connector on port 8080
13    -->
14    <Connector port="8099" protocol="org.apache.coyote.http11.Http11AprProtocol"
15               connectionTimeout="40000" acceptCount="300" maxKeepAliveRequests="1"
16               redirectPort="8443" executor="tomcatThreadPool" />
17    <!-- A "Connector" using the shared thread pool-->
18    <!-- Define a SSL HTTP/1.1 Connector on port 8443
19         This connector uses the JSSE configuration, when using APR, the
20         connector should be using the OpenSSL style configuration
21         described in the APR documentation -->
22    <!--
23    <Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true"
24               maxThreads="150" scheme="https" secure="true"
25               clientAuth="false" sslProtocol="TLS" />
26    -->
27 
28    <!-- Define an AJP 1.3 Connector on port 8009 -->
29    <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" executor="tomcatThreadPool" />
30  </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