tomcat8性能优化

工作中项目的原因,项目云上贵州服务器有时候支撑不起太高的并发量,而且又没那么快更换更优的服务器,所以只能从tomcat上去做一些优化了。

tomcat优化我是从两个地方入手,一个就是server.xml,还有一个就是catalina.sh。


server.xml

找到tomcat->conf下的server.xml

  1. 先来看一个tomcat的线程池,默认的:
<!--
    <Executor name="tomcatThreadPool" namePrefix="catalina-exec-"
        maxThreads="150" minSpareThreads="4"/>
    -->

这里默认是注释掉的,我们修改为:

<Executor
      name="tomcatThreadPool" 
      namePrefix="catalina-exec-"
      maxThreads="900"
      minSpareThreads="100"
      maxSpareThreads="500"
      prestartminSpareThreads="true"
      maxQueueSize="300"
      />
  • maxThreads:最大并发数,默认为200,一般设置在600-900
  • minSpareThreads:最小备用线程数,tomcat初始化时创建的线程,默认为25
  • maxSpareThreads:最大备用线程数
  • prestartminSpareThreads:在Tomcat初始化的时候就初始化 minSpareThreads 的参数值,如果不等于 true,minSpareThreads的值就没啥效果了
  • maxQueueSize:最大的等待队列数,超过则拒绝请求
  1. 修改链接参数:
    默认的是:
<Connector port="8080" protocol="HTTP/1.1"
    connectionTimeout="20000"
    redirectPort="8443" />

默认的是http协议的,我们这里先将tomcat设置成了https协议:

<Connector port="9090" 
      protocol="org.apache.coyote.http11.Http11Nio2Protocol"
      maxThreads="10000"
      SSLEnabled="true"
      scheme="https"
      secure="true"
      keystoreFile="cert/wtm-ssl.pfx"
      keystorePass="111"
      keystoreType="PKCS12"
      useBodyEncodingForURI="true"
      clientAuth="false"
      sslProtocol="TLS"
      connectionTimeout="20000"
      redirectPort="8443"

需不需要改成https协议按业务来分,在此基础上接着:

      executor="tomcatThreadPool"
      maxConnections="900"
      enableLookups="false"
      acceptCount="700"
      maxPostSize="10485760"
      disableUploadTimeout="true"
      compression="on"
      compressionMinSize="2048"
      maxProcessors="1000"
      minProcessors="5"         
      compressableMimeType="text/html,text/xml,text/plain,text/css,text/javascript,application/javascript"
      URIEncoding="UTF-8"
/>

首先要执行之前配置的tomcat线程池

  • maxConnections:最大连接数
  • enableLookups:禁用DNS查询,为了提高性能,设置为false
  • acceptCount:当线程数达到maxThreads后后续请求会被放入一个等待队列,这个acceptCount就是这个队列的大小,默认为100
  • maxPostSize:以FORM URL参数方式提交post请求,限制提交最大的大小,默认2097152字节(2M)
  • disableUploadTimeout:类似于Apache中的keeyalive一样,是否需要tomcat容器单独设置上传时间限制,这里是不用,还是使用标准的,不去给上传的附件单独做超时设置
  • compression:设置是否开启GZip压缩HTTP 压缩
  • compressionMinSize:启用压缩的输出内容大小,这里面默认为2KB
  • maxProcessors:线程共享地址空间
  • minProcessors:线程共享地址空间
  • compressableMimeType:需要压缩的类型

catalina.sh

在tomcat/bin/catalina.sh文件中,将下列添加到文件第一行:
如果服务器只运行一个tomcat

  • 内存4G:
CATALINA_OPTS="-Dfile.encoding=UTF-8 -server -Xms2048m -Xmx2048m -Xmn1024m 
-XX:PermSize=256m -XX:MaxPermSize=512m -XX:SurvivorRatio=10 
-XX:MaxTenuringThreshold=15 -XX:NewRatio=2 -XX:+DisableExplicitGC"
  • 内存8G:
CATALINA_OPTS="-Dfile.encoding=UTF-8 -server -Xms4096m -Xmx4096m -Xmn2048m 
-XX:PermSize=256m -XX:MaxPermSize=512m -XX:SurvivorRatio=10 
-XX:MaxTenuringThreshold=15 -XX:NewRatio=2 -XX:+DisableExplicitGC"
  • 内存16G:
CATALINA_OPTS="-Dfile.encoding=UTF-8 -server -Xms8192m -Xmx8192m -Xmn4096m 
-XX:PermSize=256m -XX:MaxPermSize=512m -XX:SurvivorRatio=10 
-XX:MaxTenuringThreshold=15 -XX:NewRatio=2 -XX:+DisableExplicitGC"
  • 内存32G:
CATALINA_OPTS="-Dfile.encoding=UTF-8 -server -Xms16384m -Xmx16384m -Xmn8192m 
-XX:PermSize=256m -XX:MaxPermSize=512m -XX:SurvivorRatio=10 
-XX:MaxTenuringThreshold=15 -XX:NewRatio=2 -XX:+DisableExplicitGC"

参数说明:

  • -Dfile.encoding:默认文件编码
  • -server:表示这是应用于服务器的配置,JVM 内部会有特殊处理的
  • -Xmx1024m:设置JVM最大可用内存为1024MB
  • -Xms1024m:设置JVM最小内存为1024m。此值可以设置与-Xmx相同,以避免每次垃圾回收完成后JVM重新分配内存。
  • -Xmn1024m:设置JVM新生代大小(JDK1.4之后版本)。一般-Xmn的大小是-Xms的1/2左右,不要设置的过大或过小,过大导致老年代变小,频繁Full GC,过小导致minor GC频繁。如果不设置-Xmn,可以采用-XX:NewRatio=2来设置,也是一样的效果
  • -XX:NewSize:设置新生代大小
  • -XX:MaxNewSize:设置最大的新生代大小
  • -XX:PermSize:设置永久代大小
  • -XX:MaxPermSize:设置最大永久代大小
  • -XX:NewRatio=4:设置年轻代(Eden和两个Survivor)与终身代的比值(去除永久代)
  • -XX:MaxTenuringThreshold=10:设置垃圾最大年龄,默认为:15。如果设置为 0 的话,则年轻代对象不经过 Survivor 区,直接进入年老代。对于年老代比较多的应用,可以提高效率。
  • -XX:+DisableExplicitGC:这个将会忽略手动调用 GC 的代码使得 System.gc() 的调用就会变成一个空调用,完全不会触发任何 GC

JVM的垃圾回收机制:

jvm的内存分为2类,一个是perm型,一个是generation型。perm区域存放的是class这些静态信息,一般默认为64m,如果项目很大,有可能已启动就会报错:out of memory permsize。重新设置一下permsize就可以解决。

而generation区域,应用代码基本在这个区域活动,new的类都会在这个区域,而且jvm的绝大部分工作也在这里。大致理解一下:

这个区域区域包含新生代老生代区域,所有new出来的会放置在新区域,而多次回收失败的一些一直被使用的实例则会被转移到老生代,所以新生代区域的活动很频繁。新生代内存不足会触发一次这个区域的GC---然后再到老生代GC---最后FULL GC。FULL GC代价很高,应尽量避免,尽量在newsize参数的这个区gc,一般配置 newsize分配到总内存1/4左右,---最终,如果full gc 还是内存不足,那就会引发out of memory 常见的那种。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 161,873评论 4 370
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 68,483评论 1 306
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 111,525评论 0 254
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,595评论 0 218
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 53,018评论 3 295
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,958评论 1 224
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 32,118评论 2 317
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,873评论 0 208
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,643评论 1 250
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,813评论 2 253
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,293评论 1 265
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,615评论 3 262
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,306评论 3 242
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,170评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,968评论 0 201
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 36,107评论 2 285
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,894评论 2 278

推荐阅读更多精彩内容

  • 在tomcat/catalina.sh中加入下面的配置,内存要根据机器实际情况配置,如果配置内存太大了有可能机器很...
    sherlock_6981阅读 13,325评论 0 6
  • 从三月份找实习到现在,面了一些公司,挂了不少,但最终还是拿到小米、百度、阿里、京东、新浪、CVTE、乐视家的研发岗...
    时芥蓝阅读 42,021评论 11 349
  • 参数设置 在Java虚拟机的参数中,有3种表示方法用“ps -ef |grep "java"命令,可以得到当前Ja...
    九问阅读 9,034评论 2 52
  • 【六项精进打卡】 2018.7.13 姓名:陈岗 企业名称:上海孚因流体动力设备股份有限公司 打卡第82天 【知~...
    我心依旧_79e2阅读 186评论 0 0
  • 其实,有些时候,在有些事情上,做一个轻度强迫症患者是件好事。在工作时,早上列出一天的计划,完成一项划掉一项,...
    睡着了的猫阅读 248评论 0 0