Tomcat 性能优化

Tomcat 性能优化
⼀一、Tomcat 简单介绍:
Sun 公司创建了了第⼀一个 Servlet 容器器,即 Java Web Server,但 JWS 只是
为了了演示 Servlet 的相应功能,所以其性能很不不稳定。与此同时,apache
基⾦金金会组织 (ASF) 创建了了 JServ 项⽬目,⼀一个能够与 apache 整合起来的
servlet 容器器。1999 年年,Sun 公司把 JWS 捐给了了 ASF,于是两个项⽬目合
⼆二为⼀一,即今天 Tomcat 的前身。第⼀一个 tomcat 版本是 Tomcat 3.x 系
列列,⽽而发布于 2001 年年 Tomcat4.0 则是在此前基础上进⾏行行了了重新设计和实
现,其代码项⽬目被命名为 Catalina。
Tomcat 服务器器是⼀一个免费的开放源代码的 Web 应⽤用服务器器,属于轻量量级
应⽤用服务器器,在中⼩小型系统和并发访问⽤用户不不是很多的场合下被普遍使
⽤用,是开发和调试 JSP 程序的⾸首选。
版本介绍:现在版本更更新到 Apache Tomcat 8.x,但是 Apache Tomcat
7.x 是⽬目前开发的焦点。Apache Tomcat 7.x 它在汲取了了 Tomcat 6.0.x 优点
的基础上,实现了了对于 Servlet 3.0、JSP 2.2 和 EL 2.2 等特性的⽀支持。
除此以外的改进列列表如下:
Web 应⽤用内存溢出侦测和预防
增强了了管理理程序和服务器器管理理程序的安全性
⼀一般 CSRF 保护
⽀支持 web 应⽤用中的外部内容的直接引⽤用
重构 (connectors, lifecycle) 及很多核⼼心代码的全⾯面梳理理
⼆二、tomcat 运⾏行行模式介绍
Tomcat Connector(Tomcat 连接器器) 有 bio、nio、apr 三种运⾏行行模式,那么
这三种运⾏行行模式有什什么区别呢,我们⼜又如何修改 Tomcat Connector 的运
⾏行行模式来提⾼高 Tomcat 的运⾏行行性能呢?
bio 模式
bio(blocking I/O),顾名思义,即阻塞式 I/O 操作,表示 Tomcat 使⽤用的是
传统的 Java I/O 操作 (即 java.io 包及其⼦子包)。Tomcat 在默认情况下,就
是以 bio 模式运⾏行行的。遗憾的是,就⼀一般⽽而⾔言,bio 模式是三种运⾏行行模式
中性能最低的⼀一种。我们可以通过 Tomcat Manager 来查看服务器器的当前
状态。
R.  [root@web conf]# cd /data/node1/conf/tomcat-users.xml
S.  [root@web conf]# vim tomcat-users.xml # 添加进去两⾏行行代码,也就
是新创建⼀一个账号和密码。


R. 添加之后,然后保存退出此⽂文件。想让配置⽂文件⽣生效,需要重启下
tomcat。
S.  [root@web conf]# /data/node1/bin/shutdown.sh [root@web conf]#
/data/node1/bin/startup.sh
点击 Server Status 查看下状态:
nio 模式
nio(new I/O),是 Java SE 1.4 及后续版本提供的⼀一种新的 I/O 操作⽅方式 (即
java.nio 包及其⼦子包)。Java nio 是⼀一个基于缓冲区、并能提供⾮非阻塞 I/O
操作的 Java API,因此 nio 也被看成是 non-blocking I/O 的缩写。它拥有
⽐比传统 I/O 操作 (bio) 更更好的并发运⾏行行性能。要让 Tomcat 以 nio 模式来运
⾏行行也⽐比较简单,我们只需要在 Tomcat 安装⽬目录 / conf/server.xml ⽂文件中
将如下配置:
connectionTimeout="20000"
redirectPort="8443" />
其中的 protocol 属性值改为 org.apache.coyote.http11.Http11NioProtocol
即可:
protocol="org.apache.coyote.http11.Http11NioProtocol"
connectionTimeout="20000"
redirectPort="8443" />
此时,我们就可以在 Tomcat Manager 中看到当前服务器器状态⻚页⾯面的
HTTP 协议的 Connector 运⾏行行模式已经从 http-bio-8080 变成了了 http-nio-
8080。
apr 模式
apr(Apache Portable Runtime/Apache 可移植运⾏行行时),是 Apache HTTP
服务器器的⽀支持库。你可以简单地理理解为,Tomcat 将以 JNI 的形式调⽤用
Apache HTTP 服务器器的核⼼心动态链接库来处理理⽂文件读取或⽹网络传输操
作,从⽽而⼤大⼤大地提⾼高 Tomcat 对静态⽂文件的处理理性能。 Tomcat apr 也是
在 Tomcat 上运⾏行行⾼高并发应⽤用的⾸首选模式。如果我们的 Tomcat 不不是在
apr 模式下运⾏行行,在启动 Tomcat 的时候,我们可以在⽇日志信息中看到类
似如下信息:
org.apache.catalina.core.AprLifecycleListener init
信息: The APR based Apache Tomcat Native library which allows optimal
performance in production environments was not found on the
java.library.path: xxx/xxx(这⾥里里是路路径信息)
Tomcat apr 运⾏行行模式的配置是三种运⾏行行模式之中相对⽐比较麻烦的⼀一种。
据官⽅方⽂文档所述,Tomcat apr 需要以下三个组件的⽀支持:
APR library[APR 库] JNI wrappers for APR used by Tomcat
(libtcnative)[简单地说,如果是在 Windows 操作系统上,就是⼀一个名
为 tcnative-1.dll 的动态链接库⽂文件]
OpenSSL libraries[OpenSSL 库] 此外,与配置 nio 运⾏行行模式⼀一样,也
需要将对应的 Connector 节点的 protocol 属性值改
为 org.apache.coyote.http11.Http11AprProtocol 。 不不过,上述繁琐
的操作都是 Tomcat 7.0.30 之前的版本才需要这样配置,从 Tomcat
7.0.30 版本开始,Tomcat 已经⾃自带了了 tcnative-1.dll 等⽂文件,并且默
认就是在 Tomcat apr 模式下运⾏行行,因此我们只需要下载最新版本的
Tomcat 直接使⽤用即可。
默认情况下是 bio 模式,介绍下怎么更更换成 apr 模式:
[root@web]#yum install -y apr apr-util apr-devel
[root@web]# cd /data/node1/bin
[root@web bin]# tar -zxvf tomcat-native.tar.gz
[root@web bin]# cd tomcat-native-1.1.32-src/jni/native/
[root@web native]# ./configure --with-apr=/usr/bin/apr-1-config --with-
ssl=/usr/include/openssl/
[root@web native]# make && make install
tomcat和apr库整合,需要修改shell脚本⽂文件catalina.sh
[root@web node1]# vim /data/node1/bin/catalina.sh +99
JAVA_OPTS="-Djava.awt.headless=true -Dfile.encoding=UTF-8 -server -
Xms1024m -Xmx1024m -XX:NewSize=512m -XX:MaxNewSize=512m -XX:PermSize=512m
-XX:MaxPermSize=512m -XX:+DisableExplicitGC"
cygwin=false
darwin=false
CATALINA_OPTS="-Djava.library.path=/usr/local/apr/lib"
os400=false
保存退出,重启 tomcat。看 tomcat 启动输出⽇日志信息:
信息: Deploying web application directory /data/node1/webapps/host-manager
四⽉月 10, 2018 16:42:19 下午 org.apache.catalina.startup.HostConfig
deployDirectory
信息: Deployment of web application directory /data/node1/webapps/host-
manager has finished in 156 ms
四⽉月 10, 2018 16:42:19 下午 org.apache.catalina.startup.HostConfig
deployDirectory
信息: Deploying web application directory /data/node1/webapps/examples
四⽉月 10, 2018 16:42:19 下午 org.apache.catalina.startup.HostConfig
deployDirectory
信息: Deployment of web application directory /data/node1/webapps/examples
has finished in 1,490 ms
四⽉月 10, 2018 16:42:19 下午 org.apache.coyote.AbstractProtocol start
信息: Starting ProtocolHandler ["http-apr-8080"]
四⽉月 10, 2018 16:42:19 下午 org.apache.catalina.startup.Catalina start
信息: Server startup in 25191 ms
出现了了 ["http-apr-8080"] 字段,说明现在 tomcat 已经是 apr 模式。
三、Tomcat 安全和性能优化。
1. 内存优化
修改内存等 JVM 相关配置
Linux 下修改 TOMCAT_HOME/bin/catalina.sh,在其中加⼊入,可以放在
CLASSPATH = 下⾯面:
JAVA_OPTS="-server -XX:PermSize=512M -XX:MaxPermSize=1024m -Xms2048m -
Xmx2048m"
windows 下修改 TOMCAT_HOME/bin/catalina.bat,在其中加⼊入,可以放
在 set CLASSPATH = 下⾯面:
set JAVA_OPTS=-server -XX:PermSize=512M -XX:MaxPermSize=1024m -Xms2048m -
Xmx2048m
这些参数在我们学习 JVM 部分⽂文章时已经都认识过了了,不不过这⾥里里还是简
单介绍下:
-server:启⽤用 JDK的 server 版本;
-Xms:Java虚拟机初始化时堆的最⼩小内存,⼀一般与 Xmx配置为相同值,这样的好处是GC不不必再为
扩展内存空间⽽而消耗性能;
-Xmx:Java虚拟机可使⽤用堆的最⼤大内存;
-XX:PermSize:Java虚拟机永久代⼤大⼩小;
-XX:MaxPermSize:Java虚拟机永久代⼤大⼩小最⼤大值;
除了了这些参数外您还可以根据具体需要配置其他参数,参数的配置可以参
考 JVM 参数的配置
2. 配置优化
我们知道 TOMCAT_HOME/conf/server.xml 可以配置端⼝口,虚拟路路径等等
Tomcat 相关主要配置。
1) Connector 优化
Connector 是连接器器,负责接收客户的请求,以及向客户端回送响应的消
息。所以 Connector 的优化是重要部分。默认情况下 Tomcat 只⽀支持 200
线程访问,超过这个数量量的连接将被等待甚⾄至超时放弃,所以我们需要提
⾼高这⽅方⾯面的处理理能⼒力力。
修改这部分配置需要修改 TOMCAT_HOME/conf/server.xml,打开
server.xml 找到 Connector 标签项,默认配置如下:
Xml代码
connectionTimeout="20000"
redirectPort="8443" />
其中 port 代表服务接⼝口;protocol 代表协议类型;connectionTimeout 代
表连接超时时间,单位为毫秒;redirectPort 代表安全通信(https)转发
端⼝口,⼀一般配置成 443。
可以看到除了了这⼏几个基本配置外并⽆无特殊功能,所以我们需要对
Connector 进⾏行行扩展。
其中 Connector ⽀支持参数属性可以参考 Tomcat 官⽅方⽹网站
(https://tomcat.apache.org/tomcat-8.0-doc/config/http.html ),⾮非常
多,所以本⽂文就只介绍些常⽤用的。
我们将 Connector 配置修改为如下:
protocol="HTTP/1.1"
maxThreads="1000"
minSpareThreads="100"
acceptCount="1000"
maxConnections="1000"
connectionTimeout="20000"
maxHttpHeaderSize="8192"
tcpNoDelay="true"
redirectPort="8443"
enableLookups="false"
URIEncoding="UTF-8" />
port:代表 Tomcat 监听端⼝口,也就是⽹网站的访问端⼝口,默认为
8080,可以根据需要改成其他。 -protocol:协议类型,可选类型有
四种,分别为 BIO(阻塞型 IO),NIO,NIO2 和 APR。
BIO:BIO(Blocking I/O),顾名思义,即阻塞式 I/O 操作,表示 Tomcat
使⽤用的是传统的 Java I/O 操作 (即 java.io 包及其⼦子包)。Tomcat 在默认
情况下,是以 bio 模式运⾏行行的。遗憾的是,就⼀一般⽽而⾔言,bio 模式是三
种运⾏行行模式中性能最低的⼀一种。BIO 配置采⽤用默认即可。 NIO:
NIO(New I/O),是 Java SE 1.4 及后续版本提供的⼀一种新的 I/O 操作⽅方
式 (即 java.nio 包及其⼦子包)。Java nio 是⼀一个基于缓冲区、并能提供⾮非
阻塞 I/O 操作的 Java API,因此 nio 也被看成是 non-blocking I/O 的缩
写。它拥有⽐比传统 I/O 操作 (bio) 更更好的并发运⾏行行性能。要让 Tomcat
以 nio 模式来运⾏行行也⽐比较简单,我们只需要 protocol 类型修改为:
//NIO
protocol="org.apache.coyote.http11.Http11NioProtocol"
//NIO2
protocol="org.apache.coyote.http11.Http11Nio2Protocol"
即可。
2) 线程池
Executor 代表了了⼀一个线程池,可以在 Tomcat 组件之间共享。使⽤用线程池
的好处在于减少了了创建销毁线程的相关消耗,⽽而且可以提⾼高线程的使⽤用效
率。
要想使⽤用线程池,⾸首先需要在 Service 标签中配置 Executor,如下:

namePrefix="catalina-exec-"
maxThreads="1000"
minSpareThreads="100"
maxIdleTime="60000"
maxQueueSize="Integer.MAX_VALUE"
prestartminSpareThreads="false"
threadPriority="5"
className="org.apache.catalina.core.StandardThreadExecutor"/>
....
其中,
name:线程池名称,⽤用于 Connector中指定。
namePrefix:所创建的每个线程的名称前缀,⼀一个单独的线程名称为
namePrefix+threadNumber。
maxThreads:池中最⼤大线程数。
minSpareThreads:活跃线程数,也就是核⼼心池线程数,这些线程不不会被销毁,会⼀一直存在。
maxIdleTime:线程空闲时间,超过该时间后,空闲线程会被销毁,默认值为6000(1分钟),单
位毫秒。
maxQueueSize:在被执⾏行行前最⼤大线程排队数⽬目,默认为Int的最⼤大值,也就是⼴广义的⽆无限。除⾮非特
殊情况,这个值不不需要更更改,否则会有请求不不会被处理理的情况发⽣生。
prestartminSpareThreads:启动线程池时是否启动 minSpareThreads部分线程。默认值
为false,即不不启动。
threadPriority:线程池中线程优先级,默认值为5,值从1到10。
className:线程池实现类,未指定情况下,默认实现类
为org.apache.catalina.core.StandardThreadExecutor。如果想使⽤用⾃自定义线程池⾸首先需
要实现 org.apache.catalina.Executor接⼝口。
线程池配置完成后需要在 Connector 中指定:
...
3) Listener 配置
另⼀一个影响 Tomcat 性能的因素是内存泄露露。Server 标签中可以配置多个
Listener,其中 JreMemoryLeakPreventionListener 是⽤用来预防 JRE 内存
泄漏漏。此 Listener 只需在 Server 标签中配置即可,默认情况下⽆无需配
置,已经添加在 Server 中。
className="org.apache.catalina.core.JreMemoryLeakPreventionListener" />
3. 缓存优化
参数说明
⼤大家通过以上我们队 tomcat 的有效配置,包括 (从内存,运⾏行行模式、并
发、缓存 4 个⽅方⾯面) 优化。能让⾃自⼰己的项⽬目稳定的服务于客户,达到我们
理理想的运⾏行行效果。
本⽂文⾸首发于GitChat,未经授权不不得转载,转载需与GitChat联系。
  compression 打开压缩功能
  compressionMinSize 启⽤用压缩的输出内容⼤大⼩小,这⾥里里⾯面默认为2KB
  compressableMimeType 压缩类型
  connectionTimeout 定义建⽴立客户连接超时的时间. 如果为 -1, 表示不不限制建⽴立客户连接
的时间
  ...........
  compression="on"
  compressionMinSize="2048"
connectionTimeout="20000"
compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain"
................
  />
 

你可能感兴趣的:(Linux运维,Tomcat)