Tomcat 调优总结

一. jvm参数调优

常见的生产环境tomcat启动脚本里常见如下的参数,我们依次来解释各个参数意义.

export JAVA_OPTS="-server -Xms1400M -Xmx1400M -Xss512k -XX:+AggressiveOpts -XX:+UseBiasedLocking -XX:PermSize=128M -XX:MaxPermSize=256M -XX:+DisableExplicitGC -XX:MaxTenuringThreshold=31 -XX:+UseConcMarkSweepGC -XX:+UseParNewGC  -XX:+CMSParallelRemarkEnabled -XX:+UseCMSCompactAtFullCollection -XX:LargePageSizeInBytes=128m  -XX:+UseFastAccessorMethods -XX:+UseCMSInitiatingOccupancyOnly -Djava.awt.headless=true "

 -server 

如果tomcat是运行在生产环境中的,这个参数必须加上,-server参数可以使tomcat以server模式运行,这个模式下将拥有:更大、更高的并发处理能力,更快更强捷的JVM垃圾回收机 制,可以有更大的负载与吞吐量

-Xms<size>和-Xmx<size>  
      前者表示JVM初始化堆的大小,后者表示JVM堆的最大值。一般认为把Xms与Xmx两个值设成一样是最优的做法,否则会导致jvm有较为频繁的GC,影响系统性能。因此一开始我们就把这两个设成一样,使得Tomcat在启动时就为最大化参数充分利用系统的效率。 如何确定当前OS jvm最大可用内存呢?在命令行下执行

java -Xmx2048 -version

命令,如果提示下图的信息,则证明当前内存数可以用

如果提示下面的错误,则当前数值不可用.

-Xss

设定每个线程的堆栈大小。依据具体应用,看一个线程大约占用多少内存、有多少线程同时运行等。一般不宜设置超过1M,要不然容易出现out ofmemory

–Xmn

设置年轻代大小为512m。整个堆大小=年轻代大小 + 年老代大小 + 持久代大小。持久代一般固定大小为64m,所以增大年轻代后,将会减小年老代大小。此值对系统性能影响较大,Sun   官方推荐配置为整个堆的3/8。

-XX:+AggressiveOpts

启用这个参数,则每当JDK版本升级时,你的JVM都会使用最新加入的优化技术(如果有的话)

-XX:+UseBiasedLocking

启用一个优化了的线程锁。对于应用服务器(ApplicationServer)来说每个http请求就是一个线程,由于请求需要的时长不一,在并发较大的时候会有请求排队、甚至还会出现线程阻塞的现象,这个配置可以改善这个问题。

-XX:PermSize 和 -XX:MaxPermSize

JVM使用-XX:PermSize设置非堆内存初始值,默认是物理内存的1/64;使用XX:MaxPermSize设置最大非堆内存的大小,默认是物理内存的1/4。

XX:MaxPermSize设置过小会导致java.lang.OutOfMemoryError,说说为什么会内存益出:

(1)这一部分内存用于存放Class和Meta的信息,Class在被 Load的时候被放入PermGen space区域,它和存放Instance的Heap区域不同。 
(2)GC(Garbage Collection)不会在主程序运行期对PermGen space进行清理,所以如果你的APP会LOAD很多CLASS 的话,就很可能出现PermGen space错误。
  这种错误常见在web服务器对JSP进行pre compile的时候。

XX:+DisableExplicitGC

在程序代码中不允许有显示的调用”System.gc()”。

-XX:+UseParNewGC

  对年轻代采用多线程并行回收,这样收得快。

-XX:+UseConcMarkSweepGC

  即CMS gc,这一特性只有jdk1.5即后续版本才具有的功能,它使用的是gc估算触发和heap占用触发。
     我们知道频频繁的GC会造面JVM的大起大落从而影响到系统的效率,使用了CMS GC后可以在GC次数增多的情况下使每次GC的响应时间却很短。

-XX:MaxTenuringThreshold

设置垃圾最大年龄。如果设置为0的话,则年轻代对象不经过Survivor区,直接进入年老代。对于年老代比较多的应用,可以提高效率。
如果将此值设置为一个较大值,则年轻代对象会在Survivor区进行多次复制,这样可以增加对象再年轻代的存活时间,增加在年轻代即被回收的概率。
这个值的设置是根据本地的jprofiler监控后得到的一个理想的值,不能一概而论原搬照抄。

 -XX:+CMSParallelRemarkEnabled

  在使用UseParNewGC 的情况下, 尽量减少 mark 的时间

-XX:+UseCMSCompactAtFullCollection

  在使用concurrent gc 的情况下, 防止 memoryfragmention, 对live object 进行整理, 使 memory 碎片减少。

-XX:LargePageSizeInBytes

  指定 Java heap的分页页面大小

-XX:+UseFastAccessorMethods

  get,set 方法转成本地代码

-XX:+UseCMSInitiatingOccupancyOnly

  指示只有在 oldgeneration 在使用了初始化的比例后concurrent collector 启动收集

-XX:CMSInitiatingOccupancyFraction=70

CMSInitiatingOccupancyFraction,这个参数设置有很大技巧,基本上满足
(Xmx-Xmn)*(100- CMSInitiatingOccupancyFraction)/100>=Xmn就不会出现promotion failed。
在我的应用中Xmx是6000,Xmn是512,那么Xmx-Xmn是5488兆,也就是年老代有5488 兆,CMSInitiatingOccupancyFraction=90
说明年老代到90%满的时候开始执行对年老代的并发垃圾回收(CMS),这时还 剩10%的空间是5488*10%=548兆,
所以即使Xmn(也就是年轻代共512兆)里所有对象都搬到年老代里,548兆的空间也足够了,所以只要满足上面的公式
,就不会出现垃圾回收时的promotion failed;因此这个参数的设置必须与Xmn关联在一起。

-Djava.awt.headless=true

这个参数一般我们都是放在最后使用的,这全参数的作用是这样的,有时我们会在我们的J2EE工程中使用一些图表工具如:jfreechart,用于在web网页输出GIF/JPG等流,在winodws环境下,一般我们的app server在输出图形时不会碰到什么问题,但是在linux/unix环境下经常会碰到一个exception导致你在winodws开发环境下图片显示的好好可是在linux/unix下却显示不出来,因此加上这个参数以免避这样的情况出现。

-Dsun.net.client.defaultConnectTimeout=60000

连接建立超时设置

-Dsun.net.client.defaultReadTimeout=60000

内容获取超时设置

-Djmagick.systemclassloader

生成缩略图的一个框架的配置=60000

-Dnetworkaddress.cache.ttl=300

jvm dns缓存超时的设置

-Dsun.net.inetaddr.ttl=300

  jvm dns缓存超时的设置

二 .tomcat配置优化

在tomcat的server.xml中有类似:

<Connector port="80" protocol="HTTP/1.1"
    connectionTimeout="60000"
    redirectPort="8443"
    maxThreads="5000"
    acceptCount="500"
    minSpareThreads="100"
    maxSpareThreads="5000"
    enableLookups="false"
    compression="on"
    compressionMinSize="2048"
    compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain"
    disableUploadTimeout="true"
    URIEncoding="UTF-8"/>

的配置, 其中:

port:   服务端口

protocol:  服务协议

connectionTimeout:  超时时间单位是ms,并发要求高的话,将此值减少!

redirectPort:   重定向端口 需要安全通信的场合,将把客户请求转发至SSL的redirectPort端口

acceptCount:  当指定的连接数被用尽时,可放到出列队列中的数量,也即可接受的排队数量.

maxThreads:   Tomcat可创建的最大的线程数(每一个线程对应一个请求), maxThreads决定了tomcat的最大线程阀值,需要设置的大一些

minSpareThreads:   最小备用(空闲)线程数

maxSpareThreads:   最大备用(空闲)线程数,如果空闲线程超过这个值,Tomcat就会关闭不活动线程;

enableLookups:  关闭DNS查询

URIEncoding:   设置tomcat默认的转码格式 查看$TOMCAT_HOME/webapps/tomcat-docs/config/http.html这个说明文档,有如下说明:

  URIEncoding:This specifies the character encoding used to decode the URI bytes, after %xx decoding the URL. If not specified, ISO-8859-1 will be used.

  也就是说,如果没有设置URIEncoding, Tomcat默认是按ISO-8859-1进行URL解码,ISO-8859-1并未包括中文字符,这样的话中文字符肯定就不能被正确解析了。

useURIValidationHack:  如果把useURIValidationHack设成"false",可以减少它对一些url的不必要的检查从而减省开销。

disableUploadTimeout: 类似于Apache中的keeyalive一样

compression、compressionMinSize、 compressableMimeType:omcat配置gzip压缩(HTTP压缩)功能

1)compression="on" 打开压缩功能

2)compressionMinSize="2048" 启用压缩的输出内容大小,这里面默认为2KB

3)noCompressionUserAgents="gozilla, traviata" 对于以下的浏览器,不启用压缩

4)compressableMimeType="text/html,text/xml" 压缩类型

在实现中,我们发现使用该配置,连接数上去之后很难下降,导致CPU一直维持在一个比较高的水平. 后来我们换了一种连接方式,采用线程池的方式,首先定义一个Executor:

<Executor name="tomcatThreadPool"
        namePrefix="tomcatThreadPool-"
        maxThreads="1000"
        maxIdleTime="300000"
        minSpareThreads="200"/>

参数的意义和上述相同 ,在Connector中使用定义的这个连接池:

<Connector executor="tomcatThreadPool"
           port="20003" protocol="HTTP/1.1"
           acceptCount="800"
           minProcessors="300"
           maxProcessors = "1000"
           redirectPort="8443"/>

此处 minProcessors  参数对应前一种配置方式中的minSpareThreads, maxProcessors则与maxThreads意义差不多. 

使用连接池以后: 发现连接数上升之后如果一段时间内请求数下降了,连接数会很快下降,CPU的消耗也会随之下降,处理能力得到了增强.

补充:

如何查看当前tomcat的连接数呢?

假设服务器上开启了 2个tomcat实例,分别监听8040和8050端口

netstat -na | grep ESTAB | grep 8040 | wc -l
netstat -na | grep ESTAB | grep 8050 | wc -l

二者之和,就是所有tomcat的连接数

出自:http://www.cnblogs.com/onmyway20xx/p/3626449.html

时间: 2024-10-21 15:51:12

Tomcat 调优总结的相关文章

【转】Tomcat调优指南

转载地址:http://blog.csdn.net/woohooli/article/details/3954792 1          概述 本文档主要介绍了Tomcat的性能调优的原理和方法.可作为公司技术人员为客户Tomcat系统调优的技术指南,也可以提供给客户的技术人员作为他们性能调优的指导手册. 2          调优分类 由于Tomcat的运行依赖于JVM,从虚拟机的角度我们把Tomcat的调整分为外部环境调优和自身调优两类来描述. 2.1      外部环境调优 调整Tomc

Tomcat调优

Tomcat调优 问题定位 对于Tomcat的处理耗时较长的问题主要有当时的并发量.session数.内存及内存的回收等几个方面造成的.出现问题之后就要进行分析了. 1.关于Tomcat的session数目 这个可以直接从Tomcat的web管理界面去查看即可 或者借助于第三方工具Lambda Probe来查看,它相对于Tomcat自带的管理稍微多了点功能,但也不多 2.监视Tomcat的内存使用情况 使用JDK自带的jconsole可以比较明了的看到内存的使用情况,线程的状态,当前加载的类的总

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:NewSiz

Tomcat调优配置技巧集锦

转自:http://blog.chinaunix.net/uid-200142-id-1762091.html Tomcat调优配置技巧集锦   一.Tomcat设置Gzip,减少网络流量 二.TOMCAT性能参数调优 环境:Windows2003.jdk1.6以上.tomcat6.0以上 设置tomcat的java虚拟机参数catalina.sh/bat 设置tomcat服务器参数server.xml设置socket.线程.压缩传输参数 设置tomcat数据库连接池参数context.xml设

tomcat调优的几个方面(转)

tomcat调优的几个方面 和早期版本相比最新的Tomcat提供更好的性能和稳定性.所以一直使用最新的Tomcat版本.现在本文使用下面几步来提高Tomcat服务器的性能. 增加JVM堆内存大小 修复JRE内存泄漏 线程池设置 压缩 数据库性能调优 Tomcat本地库 其它选项 第1步 – 提高JVM栈内存Increase JVM heap memory 你使用过tomcat的话,简单的说就是"内存溢出". 通常情况下,这种问题出现在实际的生产环境中.产生这种问题的原因是tomcat使

Tomcat调优总结(Tomcat自身优化、Linux内核优化、JVM优化)

Tomcat自身的调优是针对conf/server.xml中的几个参数的调优设置.首先是对这几个参数的含义要有深刻而清楚的理解.以tomcat8.5为例,讲解参数. 同时也得认识到一点,tomcat调优也受制于linux内核.linux内核对tcp连接也有几个参数可以调优. 因此我们可以将tomcat调优分为linux内核优化.java虚拟机调优和tomcat自身的优化. 一.Tomcat自身优化 1. maxThreads :tomcat创建的最大线程数,也就是同时处理的请求最大并发数.默认值

Tomcat调优详解

前言 在这里告诫一下那些感觉自己啥都会的朋友们,其实你会的可能只是皮毛,不要感觉这个东西以前已经做过了,就不想去做了 其实你还远没有达到精通的地步,遇到以前做过的东西,也要用心的再去做一遍,你可能会从中学习到以前没学到的知识点 一.Tomcat调优主要内容如下: 1.增加最大连接数 配置过Tomcat的同学,应该都知道这个配置,好多地方也建议你,把这个配置调到最大(1000),如果服务器本身的性能允许的话 2.调整工作模式 tomcat下工作模式有三种,bio   nio   apr bio (

Tomcat调优总结

转自:http://blog.csdn.net/jiangguilong2000/article/details/12523771 Tomcat 优化分为系统优化,Java虚拟机调优,Tomcat本身的优化. Tomcat 如何起停 ./catalina.sh stop ./catalina.sh start/sbin/service tomcat restart /webagme/tomcat/bin/catalina.sh start 1.如何调整tomcat的占用内存 A: 方法如下: 1

TOMCAT调优一(转)

从“第三天”的性能测试一节中,我们得知了决定性能测试的几个重要指标,它们是: ü   吞吐量 ü   Responsetime ü   Cpuload ü   MemoryUsage 我们也在第三天的学习中对Apache做过了一定的优化,使其最优化上述4大核心指标的读数,那么我们的Apache调优了,我们的Tomcat也作些相应的调整,当完成今的课程后,到时你的“小猫”到时真的会“飞”起来的,所以请用心看完,这篇文章一方面用来向那位曾写过“Tomcat如何承受1000个用户”的作都的敬,一方面又

linux+jre+apache+mysql+tomcat调优

一.不再为Apache进程淤积.耗尽内存而困扰 0. /etc/my.cnf,在mysqld那一段加上如下一行: log-slow-queries=queries-slow.log 重启MySQL 酌情过上一段时间,执行mysqldumpslow命令,或直接查看datadir/queries-slow.log,从中找出执行超时的SQL语句.其中datadir是MySQL所有数据库的存放路径. 根据上一步找出的SQL语句的内容,找到相应的数据表和脚本文件,查看超时原因所在.可能的原因有:数据量确实