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运行参数查看:
02 | :与unix上的 ps 类似,用来显示本地的java进程,可以查看本地运行着几个java程序,并显示他们的进程号。 |
05 | :一个极强的监视VM内存工具。可以用来监视VM内存内的各种堆和非堆的大小及其内存使用量。 |
08 | :打印出某个java进程(使用pid)内存内的,所有‘对象’的情况(如:产生那些对象,及其数量)。 |
11 | :一个java GUI监视工具,可以以图表化的形式显示各种数据。并可通过远程连接监视远程的服务器VM。 |
1 | D:\>jmap -histo 4636 > d:log.log |
3 | D:\>jmap -dump:live, format =b, file =d:\log.log 4636 |
http://jiajun.iteye.com/blog/443196
http://risheng.iteye.com/blog/1453098
3. tomcat参数(以tomcat-7.0.23说明):
01 | < Service name = "Catalina" > |
04 | < Executor name = "tomcatThreadPool" namePrefix = "catalina-exec-" |
05 | maxThreads = "500" minSpareThreads = "90" maxIdleTime = "600000" /> |
14 | < Connector port = "8099" protocol = "org.apache.coyote.http11.Http11AprProtocol" |
15 | connectionTimeout = "40000" acceptCount = "300" maxKeepAliveRequests = "1" |
16 | redirectPort = "8443" executor = "tomcatThreadPool" /> |
29 | < Connector port = "8009" protocol = "AJP/1.3" redirectPort = "8443" executor = "tomcatThreadPool" /> |
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