Tomcat参数和性能优化

1、配置文件在/usr/local/tomcat/conf/server.xml

核心标签为: Server、Service、Connector、Engine、Host和Context,其他为内嵌组件。

2、server.xml配置文件标签详解如下:

<Server>              #定义Tomcat服务器,为顶级标签;  
<Service>             #定义Tomcat服务,可包含一个Engine,多个Connecter;
<Connector>          #定义Tomcat连接器,定义Tomcat对外通信端口;
<Engine>             #表示Tomcat Service引擎,包含多个Host主机;
<Host>               #定义虚拟主机配置段,可包含多个Context发布目录;
<Context>            #定义Tomcat内容,可以定义目录、发布内容;
<Valve>              #定义Tomcat服务日志路径、参数、内容格式;
<Realm>             #定义Tomcat用户的认证和授权配置;
<GlobalNamingResources> #定义Tomcat用户的认证和授权全局标签,包含Realm配置。 

3、Tomcat配置文件Server.xml生产环境参数设置:

<?xml version='1.0' encoding='utf-8'?>
<Server port="8005" shutdown="SHUTDOWN">
  <Listener className="org.apache.catalina.startup.VersionLoggerListener" />
  <Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="off" />
  <Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" />
  <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />
  <Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener" />
  <Service name="Catalina">
    <Connector port="8080" protocol="org.apache.coyote.http11.Http11AprProtocol"
           connectionTimeout="20000"  
           redirectPort="8443"  
           maxThreads="4096"
           minSpareThreads="100"  
           acceptCount="10000" 
           disableUploadTimeout="true" 
           enableLookups="false"   
           URIEncoding="UTF-8" />
    <Engine name="Catalina" defaultHost="localhost">
      <Host name="localhost"  appBase="webapps"
            unpackWARs="true" autoDeploy="true">
        <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
               prefix="localhost_access_log" suffix=".txt"
               pattern="%h %l %u %t "%r" %s %b" />
      </Host>
    </Engine>
  </Service>
</Server> 

4、Tomcat服务器性能优化

1)、Tomcat和JDK版本的选择

  • JDK1.6 Tomcat6.x
  • JDK1.6 Tomcat7.x
  • JDK1.8 Tomcat8.x

可以使用压测工具进行测试各个组合版本的性能情况

2)、Tomcat服务器连接器的选择

Tomcat Connector(Tomcat连接器)有bio、nio、apr三种运行模式,在生产环境推荐使用nio和apr方式,从请求处理方式和操作系统级别来解决异步的IO问题,大幅度的提高性能。

3)、关闭Tomcat server.xml文件中不必要的标签和参数;

Tomcat标签有很多,通常来讲,有部分标签对于业务访问没有需求,可以删除,从而可以加快配置文件查询或者管理便捷。可以删除的标签:

  • <GlobalNamingResources>
  • <Realm>
  • <Context>

4)、调整Tomcat WEB对连接数相关参数;

  • minSpareThreads:最小空闲线程数
  • maxSpareThreads:最大空闲线程数
  • maxThreads:最大线程数,大并发请求时
  • acceptCount:请求队列排队个数
  • ConnectionTimeout:网络连接超时

5)、 调整Tomcat JVM虚拟机内存设置;

  • Xmx2048M,设置Java虚拟机的堆的最大可用内存大小
  • Xms2048M,设置Java虚拟机的堆的初始值内存大小
  • Xmn512M,设置年轻代内存大小,一般设置为Xmx的1/4
 CATALINA_OPTS="-Djava.library.path=/usr/local/apr/lib -Xms6000M -Xmx6000M -Xss512k -XX:NewSize=2250M -XX:MaxNewS
ize=2250M -XX:PermSize=128M -XX:MaxPermSize=256M  -XX:+AggressiveOpts -XX:+UseBiasedLocking -XX:+DisableExplicit
GC -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:MaxTenuringThreshold=15 -XX:+CMSParallelRemarkEnabled -XX:+UseC
MSCompactAtFullCollection -XX:LargePageSizeInBytes=128m -XX:+UseFastAccessorMethods -XX:+UseCMSInitiatingOccupa
ncyOnly -Duser.timezone=Asia/Shanghai -Djava.awt.headless=true" 

6)、 关闭Tomcat DNS反查功能;

将参数设置为false,enableLookups=”false”,表示关闭DNS域名反查,提高处理能力。

5、JAVA JVM虚拟机详解

JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。Java虚拟机包括一套字节码指令集、一组寄存器、一个栈、一个垃圾回收堆和一个存储方法域。

JVM屏蔽了与具体操作系统平台相关的信息,使Java程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。JVM在执行字节码时,实际上最终还是把字节码解释成具体平台上的机器指令执行。

如图所示JDK、JRE、JVM关系图:

如下为JVM虚拟机主要由堆、栈、本地方法栈、方法区组成,物理架构如图:

1)、堆

所有通过new创建的对象的内存都在堆中分配,堆的大小可以通过-Xmx和-Xms来控制。堆被划分为新生代和旧生代,新生代又被进一步划分为Eden和Survivor区,最后Survivor由From Space和To Space组成,结构图如下所示:

  • 新生代,新建的对象都是用新生代分配内存,Eden空间不足的时候,会把存活的对象转移到Survivor中,新生代大小可以由-Xmn来控制,也可以用-XX:SurvivorRatio来控制Eden和Survivor的比例
  • 旧生代,用于存放新生代中经过多次垃圾回收仍然存活的对象
  • 持久带,(Permanent Space)实现方法区,主要存放所有已加载的类信息,方法信息,常量池等等。可通过-XX:PermSize和-XX:MaxPermSize来指定持久带初始化值和最大值。Permanent Space并不等同于方法区,只不过是Hotspot JVM用Permanent Space来实现方法区而已,有些虚拟机没有Permanent Space而用其他机制来实现方法区。

-Xmx:最大堆内存,如:-Xmx512m;

-Xms:初始时堆内存,如:-Xms256m;

-XX:MaxNewSize:最大年轻区内存;

-XX:NewSize:初始时年轻区内存.通常为 Xmx 的 1/3 或 1/4。新生代 = Eden + 2 个 Survivor 空间。实际可用空间为 = Eden + 1 个 Survivor,即 90%;

-XX:MaxPermSize:最大持久带内存;

-XX:PermSize:初始时持久带内存;

-XX:+PrintGCDetails。打印 GC 信息;

 -XX:NewRatio 新生代与老年代的比例,如 –XX:NewRatio=2,则新生代占整个堆空间的1/3,老年代占2/3;

 -XX:SurvivorRatio 新生代中 Eden 与 Survivor 的比值。默认值为 8。即 Eden 占新生代空间的 8/10,另外两个 Survivor 各占 1/10。

2)、栈

每个线程执行每个方法的时候都会在栈中申请一个栈帧,每个栈帧包括局部变量区和操作数栈,用于存放此次方法调用过程中的临时变量、参数和中间结果。

   -xss:设置每个线程的堆栈大小. JDK1.5+ 每个线程堆栈大小为 1M,一般来说如果栈不是很深的话, 1M 是绝对够用了的。

3)、本地方法栈

用于支持native方法的执行,存储了每个native方法调用的状态

4)、方法区

存放了要加载的类信息、静态变量、final类型的常量、属性和方法信息。JVM用持久代(Permanet Generation)来存放方法区,可通过-XX:PermSize和-XX:MaxPermSize来指定最小值和最大值。

发表评论

后才能评论