Tomcat:优化

  • 2018-03-06
  • 76
  • 1
  • 2

1、内存优化


# 将以下内容放入bin/setenv.sh,若没有该文件则创建它,并给它授权750
## -server:启用jdk的server版本
## JVM初始分配的内存由-Xms指定,默认是物理内存的1/64;JVM最大分配的内存由-Xmx指定,默认是物理内存的1/4
## 默认空余堆内存小于40%时,JVM就会增大堆直到-Xmx的最大限制;空余堆内存大于70%时,JVM会减少堆直到-Xms的最小限制。因此服务器一般设置-Xms、-Xmx相等避免在每次GC 后调整堆的大小。
## JVM使用-XX:PermSize设置非堆内存初始值,默认是物理内存的1/64;由XX:MaxPermSize设置最大非堆内存的大小,默认是物理内存的1/4。
export JAVA_OPTS="-server -Xms1024m -Xmx1024m -XX:PermSize=128M -XX:MaxPermSize=256m"

 

2、连接数优化


# 优化连接数,主要是在conf/server.xml配置文件中进行修改。找到Connectorport="8080" protocol="HTTP/1.1",增加maxThreads和acceptCount属性(使acceptCount大于等于maxThreads)
## maxThreads:tomcat可用于请求处理的最大线程数,默认是200
## minSpareThreads:tomcat初始线程数,即最小空闲线程数
## maxSpareThreads:tomcat最大空闲线程数,超过的会被关闭
## acceptCount:当所有可以使用的处理请求的线程数都被使用时,可以放到处理队列中的请求数,超过这个数的请求将不予处理,默认100
<Connectorport="8080" protocol="HTTP/1.1"connectionTimeout="20000" redirectPort="8443"acceptCount="500" maxThreads="400" />

# 使用线程池。在server.xml中增加executor节点,然后配置connector的executor属性。
## namePrefix:线程池中线程的命名前缀
## maxThreads:线程池的最大线程数
## minSpareThreads:线程池的最小空闲线程数
## maxIdleTime:超过最小空闲线程数时,多的线程会等待这个时间长度,然后关闭
## threadPriority:线程优先级
<Executorname="tomcatThreadPool" namePrefix="req-exec-"maxThreads="1000" minSpareThreads="50"maxIdleTime="60000"/>
<Connectorport="8080" protocol="HTTP/1.1"executor="tomcatThreadPool"/>

# 需要注意的是,当tomcat并发用户量大的时候,单个jvm进程确实可能打开过多的文件句柄,这时会报java.net.SocketException:Too many open files错误。可使用下面步骤检查:
## 查看tomcat的进程ID,记录ID号,假设进程ID为1100
ps -ef |grep [t]omcat 

## 查看当前进程id为10001的 文件操作数
lsof -p 1100|wc -l 

## 查看每个用户允许打开的最大文件数
ulimit -n

 

3、监控


3.1 jstat

格式如下:

jstat -<option> <vmid> 显示频率 [<count>]

常用的命令:
jstat -class pid:显示加载class的数量,及所占空间等信息。
jstat -compiler pid:显示VM实时编译的数量等信息。
jstat -gc pid:可以显示gc的信息,查看gc的次数,及时间。其中最后五项,分别是young gc的次数,young gc的时间,full gc的次数,full gc的时间,gc的总时间。
jstat -gccapacity:可以显示,VM内存中三代(young,old,perm)对象的使用和占用大小,如:PGCMN显示的是最小perm的内存使 用量,PGCMX显示的是perm的内存最大使用量,PGC是当前新生成的perm内存占用量,PC是但前perm内存占用量。其他的可以根据这个类推, OC是old内纯的占用量。
jstat -gcnew pid:new对象的信息。
jstat -gcnewcapacity pid:new对象的信息及其占用量。
jstat -gcold pid:old对象的信息。
jstat -gcoldcapacity pid:old对象的信息及其占用量。
jstat -gcpermcapacity pid: perm对象的信息及其占用量。
jstat -util pid:统计gc信息统计。
jstat -printcompilation pid:当前VM执行的信息。

例子:

# 先使用jps命令查看vmid
jps

# 假设vmid为1100,间隔1秒,执行5次
jstat -gc 1100 1s 5

# 参数详解:
S0:Heap上的 Survivor space 0 段空间大小KB
S1:Heap上的 Survivor space 1 段空间大小KB
S0U:Heap上的 Survivor space 0 段已使用空间大小KB
S1U:Heap上的 Survivor space 1 段已使用空间大小KB
EC:显示现在Eden空间大小KB
EU:显示现在Eden已用空间大小KB
OC:显示现在old空间大小KB
OU:显示现在old已用空间大小KB
PC:显示现在持久带空间大小KB
PU:显示现在持久带已用空间大小KB
YGC:从程序启动到采样时发生Young GC的次数
YGCT:Young GC所用的时间(单位秒)
FGC:从程序启动到采样时发生Full GC的次数
FGCT:Full GC所用的时间(单位秒)
GCT:用于垃圾回收的总时间(单位秒)

 

3.2 VisualVM + Vistual GC

VisualVM下载地址:http://visualvm.github.io/
VisualVM是一款可视化的 Java VM 应用分析工具,如果机器在连通外网的情况下,可以添加VisualGC插件,显示更丰富的信息。

# tomcat环境变量需要增加以下参数:
-Djava.rmi.server.hostname=tomcat的IP
-Dcom.sun.management.jmxremote.port=监控端口
-Dcom.sun.management.jmxremote.ssl=false 
-Dcom.sun.management.jmxremote.authenticate=false

 

评论