Tomcat 的两类调优方式

一、Tomcat 调优大致分为两大类:

1️⃣Tomcat 的自身调优:

  1. 采用动静分离节约 Tomcat 的性能
  2. 禁用 AJP 连接器
  3. 调整 Tomcat 的线程池
  4. 调整 Tomcat 的连接器
  5. 修改 Tomcat 的运行模式

2️⃣JVM 的调优:调优 JVM 内存

二、Tomcat 自身调优

1️⃣采用动静分离

静态资源如果也让 Tomcat 处理的话,Tomcat 的性能会被损耗很多。所以一般都是采用:Nginx+Tomcat 实现动静分离。Nginx 实现静态资源的访问,让 Tomcat 只负责 jsp 文件的解析工作。

2️⃣禁用 AJP 连接器

AJP 的全称 Apache JServer Protocol。使用 Nginx+Tomcat 的架构,用不着 AJP,所以禁用。

  1. Linux 下修改 TOMCAT_HOME/bin/catalina.sh,在其中加入如下代码,可以放在 CLASSPATH = 下面:
JAVA_OPTS="-server -XX:PermSize=512M -XX:MaxPermSize=1024m -Xms2048m -Xmx2048m"
  1. windows 下修改 TOMCAT_HOME/bin/catalina.bat,在其中加入如下代码,可以放在 set CLASSPATH = 下面:
set JAVA_OPTS=-server -XX:PermSize=512M -XX:MaxPermSize=1024m -Xms2048m -Xmx2048m

参数说明:

  • -server:启用 JDK 的 server 版本;
  • -Xms:Java 虚拟机初始化时堆的最小内存,一般与 Xmx 配置为相同值,这样的好处是 GC 不必再为扩展内存空间而消耗性能;
  • -Xmx:Java 虚拟机可使用堆的最大内存;
  • -XX:PermSize:Java 虚拟机永久代大小;
  • -XX:MaxPermSize:Java 虚拟机永久代大小最大值;

3️⃣调优 Tomcat 线程池

打开 tomcat 的 server.xml,配置 Executor,相关参数说明如下:

​​<Executor 
     name="tomcatThreadPool" 
     namePrefix="catalina-exec-" 
     maxThreads="150" 
     minSpareThreads="4" 
     maxIdLeTime="60000"/>

参数解释:

  • name:给执行器(线程池)起一个名字
  • namePrefix:指定线程池中的每一个线程的 name 前缀
  • maxThreads:线程池中最大的线程数量
    假设:请求的数量超过了“750”,这不是意味着将 maxThreads 属性值设置为“750”,它的最好解决方案是使用“Tomcat集群”。也就是说,如果有“1000”请求,两个 Tomcat 实例设置“maxThreads= 500”,而不是在单 Tomcat 实例的情况下设置 maxThreads=1000。
  • minSpareThreads:线程池中允许空闲的线程数量(多余的线程都杀死)
  • maxIdLeTime:一个线程空闲多久算是一个空闲线程

4️⃣调优 Tomcat 的连接器 Connector

打开 Tomcat 的 server.xml,(比较完整)配置 Connector,参数说明如下:

<Connector 
     executor = "tomcatThreadPool"
     port="8081" 
     protocol="HTTP/1.1" 
     connectionTimeout="20000"
     enableLookups="false"
     URIEncoding="UTF-8" 
     redirectPort="8443"
     maxThreads="600" 
     minSpareThreads="100" 
     acceptCount="700"
     maxSpareThreads="500" 
     server="None" />

参数解释:

  • executor:指定这个连接器所使用的执行器(线程池)。对应“Executor ”配置中的name值。
  • enableLookups="false":关闭 DNS 解析,减少性能损耗。
  • maxThreads="X" 表示最多同时处理 X 个连接。相当于最大线程数。
  • minSpareThreads="X" 初始化 X 个连接。最小空闲线程数,这里是一直会运行的线程。
  • acceptCount="X" 当同时连接的人数达到 maxThreads 时,还可以排队,队列大小为 X。超过 X 就不处理。
  • maxSpareThreads="X" 表示如果最多可以有 X 个线程,一旦超过 X 个,则会关闭不再需要的线程。
  • minProcessors:服务器启动时创建的最少线程数;
  • maxProcessors:最大可以创建的线程数;

注意:
与压缩有关系的配置:如果已经对代码进行了动静分离,静态页面和图片等数据就不需要 Tomcat 处理了,那么也就不需要在 Tomcat 中配置压缩了。

5️⃣通过修改 Tomcat 的运行模式

同步阻塞IO (JAVA BIO)
Tomcat8 以下版本,默认使用的就是 BIO 模式。服务器实现模式为一个连接一个线程(one connection one thread),对于每一个请求都要创建一个线程来进行处理,不适合高并发。当然可以通过线程池机制改善。

同步非阻塞IO (JAVA NIO)
又分为异步阻塞 IO。与 BIO 最大的区别 one request one thread。可以复用同一个线程处理多个 connection(多路复用)。Tomcat8 以上版本,默认使用的就是NIO模式「非阻塞式 IO」。

异步非阻塞IO (Java NIO2又叫AIO)
与NIO的区别主要是操作系统的底层区别。可以做个比喻:比作快递,NIO就是网购后要自己到官网查下快递是否已经到了(可能是多次),然后自己去取快递;AIO就是快递员送货上门了(不用关注快递进度)。

适用:

BIO 方式适用于连接数目比较小且固定的架构。这种方式对服务器资源要求比较高,并发局限于应用中,JDK1.4 以前的唯一选择,但程序直观简单易理解。

NIO 方式适用于连接数目多且连接比较短(轻操作)的架构。比如聊天服务器,并发局限于应用中,编程比较复杂,JDK1.4 开始支持。

AIO 方式使用于连接数目多且连接比较长(重操作)的架构。比如相册服务器,充分调用 OS 参与并发操作,编程比较复杂,JDK7 开始支持。

在server.xml中:

<Connector 
    executor = "tomcatThreadPool"
    port="8081" 
    protocol="HTTP/1.1"  
    connectionTimeout="20000" 
    URIEncoding="UTF-8"
    enableLookups="false" />

实现对Tomcat的IO切换。

APR(Apache Portable Runtime)

APR 是一个高可移植库。它是 Apache HTTP Server 2.x 的核心,能更好地和其它本地 web 技术集成,总体上让 Java 更有效率作为一个高性能 web 服务器平台而不是简单作为后台容器。是 Tomcat 生产环境运行的首选方式,如果操作系统未安装 APR 或者 APR 路径未指到 Tomcat 默认可识别的路径,则 APR 模式无法启动,自动切换启动 NIO 模式。所以必须要安装 Apache Tomcat Native Library,直接启动就支持 APR,APR 是从操作系统级别解决异步 IO 问题,排除代码问题 Tomcat 优化到这个层次,可以大幅度的提高性能。APR 的本质就是使用 JNI 技术调用操作系统底层的 IO 接口,所以需要提前安装所需要的依赖。

在产品环境中,特别是直接使用 Tomcat 做 WEB 服务器的时候,应该使用 Tomcat Native 来提高其性能。如果不配 APR,基本上 300 个线程很快就会用满,以后的请求就只好等待。但是配上 APR 之后,并发的线程数量明显下降,从原来的 300 可能会马上下降到只有几十,新的请求会毫无阻塞的进来。
在局域网环境测,就算是 400 个并发,也是一瞬间就处理/传输完毕,但是在真实的 Internet 环境下,页面处理时间只占 0.1% 都不到,绝大部分时间都用来页面传输。如果不用 APR,一个线程同一时间只能处理一个用户,势必会造成阻塞。所以生产环境下用 APR 是非常必要的。

三、JVM 调优

Tomcat 是运行在 JVM 上的,所以对 JVM 的调优也是非常有必要的。启动时告诉 JVM 要一块大内存,调优内存是最直接的方式。调整堆大小的目的是最小化垃圾收集的时间,以在特定的时间内最大化处理客户的请求。找到 catalina.sh:

添加:

JAVA_OPTS='-Xms256m -Xmx512m'

完整参数设置:

JAVA_OPTS="-Djava.awt.headless=true 
-Dfile.encoding=UTF-8-server 
-Xms1024m 
-Xmx1024m 
-XX:NewSize=512m 
-XX:MaxNewSize=512m 
-XXermSize=512m 
-XX:MaxPermSize=512m 
-XX:+DisableExplicitGC"
  • -Xms<size> Java 虚拟机初始化时堆的最小内存,一般与 Xmx 配置为相同值,这样的好处是 GC 不必再为扩展内存空间而消耗性能;
  • -Xmx<size> Java 虚拟机可使用堆的最大内存。实际参数大小根据服务器配置或者项目具体设置。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,406评论 6 503
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,732评论 3 393
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,711评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,380评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,432评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,301评论 1 301
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,145评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,008评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,443评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,649评论 3 334
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,795评论 1 347
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,501评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,119评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,731评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,865评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,899评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,724评论 2 354

推荐阅读更多精彩内容