原文:https://www.cnblogs.com/linhankbl/articles/9149804.html#topjavascript
JVM菜鸟进阶高手之路七(tomcat调优以及tomcat七、8性能对比)-------https://blog.csdn.net/lirenzuo/article/details/77164033css
Linux服务器上同时部署多个Tomcat方法介绍------https://blog.csdn.net/github_38383183/article/details/78608229html
jvm层面优化:java
Jdk7:node
-Xms2G -Xmx2G -Xmn512m -XX:PermSize=512M -XX:MaxPermSize=512M -XX:+UseConcMarkSweepGC -XX:+CMSClassUnloadingEnabled -XX:+HeapDumpOnOutOfMemoryError -verbose:gc -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintGCDateStamps -Xloggc:/appl/gc.log -XX:CMSInitiatingOccupancyFraction=75 -XX:+UseCMSInitiatingOccupancyOnlylinux
Jdk8:nginx
-Xms2G -Xmx2G -Xmn512m -XX:MetaspaceSize=512M -XX:MaxMetaspaceSize=512M -XX:+UseConcMarkSweepGC -XX:+CMSClassUnloadingEnabled -XX:+HeapDumpOnOutOfMemoryError -verbose:gc -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintGCDateStamps -Xloggc:/appl/gc.log -XX:CMSInitiatingOccupancyFraction=75 -XX:+UseCMSInitiatingOccupancyOnly -XX:HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/javaheapc++
一 安装tomcat 8.5
修改运行级别为文本
# ln -sf /lib/systemd/system/multi-user.target /etc/systemd/system/default.target
1. 建立标准目录结构
mkdir /software
mkdir /data
mkdir /script
1.准备软件
cd /software/
wget http://124.202.164.15/files/116700000B429E7F/download.oracle.com/otn-pub/java/jdk/8u161-b12/2f38c3b165be4555a1fa6e98c45e0808/jdk-8u161-linux-x64.tar.gz
wget http://mirrors.tuna.tsinghua.edu.cn/apache/tomcat/tomcat-8/v8.5.28/bin/apache-tomcat-8.5.28.tar.gz
2.安装前检查:
rpm -qa | grep java
rpm -e --nodeps java*
3. 安装jdk
cd /woftware/
tar zxvf jdk-8u161-linux-x64.tar.gz
mv jdk1.8.0_161 /data/jdk
ln -s /data/jdk /usr/local/JAVA
# 配置环境变量:
在/etc/profile 中加入:
# Set JDK 环境变量
export JAVA_HOME=/usr/local/JAVA ##JDK路径
export PATH=/bin:/jre/bin:/usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/bin:/bin:/usr/sbin:/sbin:/root/bin
export CLASSPATH=/lib/:/jre/lib:
# 运行:source /etc/profile 使配置文件生效
source /etc/profile
# 检查验证是否安装成功
[root@tomcat_jvm software]# /usr/local/JAVA/bin/java -version
java version "1.8.0_161"
Java(TM) SE Runtime Environment (build 1.8.0_161-b12)
Java HotSpot(TM) 64-Bit Server VM (build 25.161-b12, mixed mode)
4 .安装tomcat 8.5
[root@tomcat_jvm software]# tar zxvf apache-tomcat-8.5.28.tar.gz
# 根据部署的内容将apache-tomcat更名
[root@tomcat_jvm software]# cp -r apache-tomcat-8.5.28 /data/Tomcat-Pay
[root@tomcat_jvm software]# cd /data/Tomcat-Pay/
[root@tomcat_jvm Tomcat-Pay]# ls
bin conf lib LICENSE logs NOTICE RELEASE-NOTES RUNNING.txt temp webapps work
#===============================================================================
# 安装后配置:Tomcat启动、中止等
# 启动
[root@tomcat_jvm bin]# /data/Tomcat-Pay/bin/startup.sh
# 中止
[root@tomcat_jvm bin]# /data/Tomcat-Pay/bin/shutdown.sh
# 查看版本信息
[root@tomcat_jvm bin]# /data/Tomcat-Pay/bin/version.sh
# 输出结果:
Using CATALINA_BASE: /data/Tomcat-Pay
Using CATALINA_HOME: /data/Tomcat-Pay
Using CATALINA_TMPDIR: /data/Tomcat-Pay/temp
Using JRE_HOME: /usr/local/JAVA
Using CLASSPATH: /data/Tomcat-Pay/bin/bootstrap.jar:/data/Tomcat-Pay/bin/tomcat-juli.jar
Server version: Apache Tomcat/8.5.28
Server built: Feb 6 2018 23:10:25 UTC
Server number: 8.5.28.0
OS Name: Linux
OS Version: 3.10.0-327.el7.x86_64
Architecture: amd64
JVM Version: 1.8.0_161-b12
JVM Vendor: Oracle Corporation
5. 配置开机启动
[root@tomcat_jvm bin]# chmod +x /etc/rc.d/rc.local
[root@tomcat_jvm bin]# echo '/data/Tomcat-Pay/bin/startup.sh' >> /etc/rc.d/rc.local
二 安装apr扩展提高tomcat性能
Tomcat 8.5 基于 Apache Portable Runtime(APR)库性能优化
Tomcat可使用Apache Portable Runtime来提供卓越的性能及可扩展性,更好地与本地服务器技术的集成。Apache Portable Runtime是一个高度可移植的库,位于Apache HTTP Server 2.x的核心。APR有许多用途,包括访问高级IO功能(如sendfile,epoll和OpenSSL),操做系统级功能(随机数生成,系统状态等)以及本地进程处理(共享内存,NT管道和Unix套接字)。
这些功能不只仅是一个后端集中的技术,还可让Tomcat成为通用的网络服务器,能够实现与本地的其余Web技术更好的集成,并使Java成为一个完整的网络服务器平台。
官方要求:
APR 1.2+ development headers (libapr1-dev package)
OpenSSL 1.0.2+ development headers (libssl-dev package)
JNI headers from Java compatible JDK 1.4+
GNU development environment (gcc, make)
生产环境:
CentOS Linux release 7 (Core) x86 64
Server version: Apache Tomcat/8.5.28
java version “1.8.0_131”
1.安装相关依赖包
# yum -y install gcc gcc-c++ libtool* autoconf automake expat-devel perl perl-devel
2.下载安装包 http://mirror.bit.edu.cn/apache/apr/
# cd /software/
# wget http://mirror.bit.edu.cn/apache/apr/apr-1.6.2.tar.gz
# wget http://mirror.bit.edu.cn/apache/apr/apr-iconv-1.2.2.tar.gz
# wget http://mirror.bit.edu.cn/apache/apr/apr-util-1.6.0.tar.gz
# wget https://www.openssl.org/source/openssl-1.1.0f.tar.gz
备用地址 https://mirrors.tuna.tsinghua.edu.cn/apache//apr/
wget http://219.239.26.11/files/224600000AE1B9A7/mirror.bit.edu.cn/apache//apr/apr-1.6.3.tar.gz
wget https://mirrors.tuna.tsinghua.edu.cn/apache//apr/apr-1.6.3.tar.gz
wget https://mirrors.tuna.tsinghua.edu.cn/apache//apr/apr-iconv-1.2.2.tar.gz
wget http://mirrors.tuna.tsinghua.edu.cn/apache//apr/apr-util-1.6.1.tar.gz
3.安装APR
# tar zxvf apr-1.6.2.tar.gz
# cd apr-1.6.2
# vim configure
若有问题能够修改该值,经测试并无发现该问题
默认值:
RM='$RM'
修改成:
RM='$RM -f'
# ./configure --prefix=/usr/local/apr
# make && make install
4.安装apr-iconv
# tar zxvf apr-iconv-1.2.1.tar.gz
# cd apr-iconv-1.2.1
# ./configure --prefix=/usr/local/apr-iconv --with-apr=/usr/local/apr
# make && make install
5.安装apr-util
# tar zxvf apr-util-1.6.0.tar.gz
# cd apr-util-1.6.0
# ./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr --with-apr-iconv=/usr/local/apr-iconv/bin/apriconv
# make && make install
6.安装OpenSSL
# tar zxvf openssl-1.1.0f.tar.gz
# cd openssl-1.1.0f
# ./config --prefix=/usr/local/openssl
# make -j 4 && make install
7.安装tomcat-native
# cd /usr/local/tomcat/bin/
# tar zxvf tomcat-native.tar.gz
# cd tomcat-native-1.2.12-src/native
# ./configure --with-ssl=/usr/local/openssl --with-apr=/usr/local/apr --with-java-home=/usr/local/JAVA
# make && make install
注意:若是以上 configure 失败,能够执行 make distclean 清除
8.添加变量内容
# vim /etc/profile.d/jdk.sh
export LD_LIBRARY_PATH=/usr/local/apr/lib:$LD_LIBRARY_PATH
# source /etc/profile.d/jdk.sh
至此APR安装成功。
9.接下来须要修改tomcat配置文件中的APR运行模式,并测试是否安装成功。
# vim /usr/local/tomcat/conf/server.xml
默认值:
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
修改成:
<Connector port="8080" protocol="org.apache.coyote.http11.Http11AprProtocol"
connectionTimeout="20000"
redirectPort="8443" />
默认值:
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
修改成:
<Connector port="8009" protocol="org.apache.coyote.ajp.AjpAprProtocol" redirectPort="8443" />
10.如今重启tomcat服务,并查看启动日志
# systemctl restart tomcat
# cat /usr/local/tomcat/logs/catalina.out
...
INFO [main] org.apache.catalina.core.AprLifecycleListener.lifecycleEvent The APR based Apache Tomcat Native library which allows optimal performance in production environments was not found on the java.library.path: [/usr/java/packages/lib/amd64:/usr/lib64:/lib64:/lib:/usr/lib]
INFO [main] org.apache.coyote.AbstractProtocol.init Initializing ProtocolHandler ["http-nio-8080"]
INFO [main] org.apache.tomcat.util.net.NioSelectorPool.getSharedSelector Using a shared selector for servlet write/read
INFO [main] org.apache.coyote.AbstractProtocol.init Initializing ProtocolHandler ["ajp-nio-8009"]
INFO [main] org.apache.tomcat.util.net.NioSelectorPool.getSharedSelector Using a shared selector for servlet write/read
...
注意:若是遇到上面的提示找不到基于APR的Apache Tomcat Native库,所以没法使用APR模式启动。
解决方案:
# cp -R /usr/local/apr/lib/* /usr/lib64
# cp -R /usr/local/apr/lib/* /usr/lib
再次重启tomcat,并查看启动日志
# cat /usr/local/tomcat/logs/catalina.out
...
INFO [main] org.apache.coyote.AbstractProtocol.start Starting ProtocolHandler ["http-apr-8080"]
INFO [main] org.apache.coyote.AbstractProtocol.start Starting ProtocolHandler ["http-apr-8009"]
...
能够看到已经以apr协议模式启动成功,经基于APR的技术web压力测试,Tomcat的性能飙升。
三 tomcat 调整:
1. 线程池(Thread Pool)优化
编辑“Tomcat安装目录/conf/server.xml”文件,找到以下内容
<!--
<Executor name="tomcatThreadPool" namePrefix="catalina-exec-"
maxThreads="150" minSpareThreads="4"/>
-->
取消注释,参数作以下调整
<Executor name="tomcatThreadPool" namePrefix="catalina-exec-"
maxThreads="1000" minSpareThreads="25"
maxIdleTime="600000" acceptCount="500"/>
参数说明:
name 这个是线程池的名字,必须惟一,默认便可,咱们在后面的配置里要用到这个东西
namePrefix 线程的名字前缀,用来标记线程名字的,这样每一个线程就用这个前缀加上线程编号了,好比 catalina-exec-1 catalina-exec-2
maxThreads 线程池能够容纳的最大线程数,tomcat使用线程来处理接收的请求每个线程处理一个请求,这个值决定了同时可以处理的最大请求数,缺省值为200
minSpareThreads 最小的保持活跃的线程数量,缺省值为4(tomcat5有此参数,而tomcat6无此参数,到了tomcat7又从新使用此参数,顺便提下5和7中这两个参数含义并不相同有兴趣能够查看官方文档)
maxIdleTime 关闭一个空闲线程以前容许空闲线程持续的时间,只有当前空闲线程数大于minSpareThread的值,才会关闭空闲线程
acceptCount 当全部可用的请求处理线程都被使用的时候,链接请求队列的最大长度。当该队列满了之后的全部请求都被拒绝,缺省值为10
顺便提下以下3个参数maxSpareThreads、maxProcessors和minProcessors
maxSpareThreads:容许存在的空闲线程的最大数量,tomcat5及之前版本才有的参数,tomcat6和tomcat7均无此参数
minProcessors:最小空闲链接线程数,用于提升系统处理性能
maxProcessors:最大链接线程数,即并发处理的最大请求数
maxProcessors和minProcessors是tomcat4才有的,tomcat5以后的版本均取消了这2个参数,tomcat4基本无人在用了吧,因此优化的时候别再把这2个参数加上了
2. 链接器(Connector)优化
编辑“Tomcat安装目录/conf/server.xml”文件,找到以下内容将其注释掉
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
再找到以下内容,取消注释
<!--
<Connector executor="tomcatThreadPool"
port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
-->
参数作以下调整
<Connector executor="tomcatThreadPool"
port="8080" protocol="HTTP/1.1"
URIEncoding="UTF-8" enableLookups="false" disableUploadTimeout="true"
connectionTimeout="20000" keepAliveTimeout="15000" maxKeepAliveRequests="1000"
useURIValidationHack="false" compression="on" compressionMinSize="2048"
compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain"
redirectPort="8443"/>
+---------------------------------------------------------------+
|
|
|
|
|
|
+--------------------------------------参数说明-------------------
AJP/1.3协议负责和其余HTTP服务器创建链接,监听的是8009端口,好比tomcat和apache或者iis集成时使用这个链接器,此时则需优化8009端口的Connector。
<!-- Define an AJP 1.3 Connector on port 8009 -->
<Connector port="8009" protocol="AJP/1.3"
URIEncoding="UTF-8" enableLookups="false" disableUploadTimeout="true"
connectionTimeout="20000" keepAliveTimeout="15000" maxKeepAliveRequests="1000"
useURIValidationHack="false" compression="on" compressionMinSize="2048"
compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain"
redirectPort="8443" />
# 若是使用 nginx的话,能够直接注释掉AJP
参数说明:
executor="tomcatThreadPool" 在 Connector里指定使用共享线程池的名称
port="8080" 指定服务器端要建立的端口号,并在这个端口监听来自客户端的请求
protocol="HTTP/1.1" 负责创建HTTP链接,web应用经过浏览器访问tomcat服务器用的就是这个链接器,默认监听的是8080端口。因此咱们优化的是8080端口的Connector
URIEncoding="UTF-8" URI解码所使用的字符集,只影响GET请求的URI解码,不影响post的解码
enableLookups="false" 禁用DNS查询,默认值为true,为了提升处理能力应设置为false
disableUploadTimeout="true" 容许servlet container在一个servlet执行的时候,使用一个不一样的,更长的链接超时。最终的结果是给servlet更长的时间以便完成其执行,或者在数据上载的时候更长的超时时间。若是没有指定默认为false
connectionTimeout="20000" 在Connector接受一个链接之后,等待发生第一个请求的时间,单位毫秒。缺省值为60000(60秒)
keepAliveTimeout="15000" 在一个长链接中2次请求之间的最大间隔时间,超过此时间链接断开,单位毫秒
maxKeepAliveRequests="1000" 在server关闭链接以前,接受的HTTP请求的最大数目。若是该值设为1,会禁止HTTP/1.0保活,同时也会禁止HTTP/1.1保活和pipelining。若是没有指定默认值100。
useURIValidationHack="false" 减小它对一些url的没必要要的检查从而减省开销
compression="on" 设为on开启Connector使用HTTP/1.1的GZIP压缩,可节省服务器带宽
compressionMinSize="2048" 启用压缩的输出内容大小,这里面设置为2KB
compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain" 压缩文件的类型
redirectPort="8443" 若是Connector支持非SSL请求,在收到一个要求使用SSL传输的请求之后,Catalina会自动将该请求重定向到这里指定的端口号
3. JAVA虚拟机(JVM)优化
注意调优JVM须要了解使用的JDK是什么版本,随着JDK版本发展有新参数引入,同时有旧参数废弃。本文档以JDK7为例进行调优
JDK7的JVM内存由Heap(堆空间)和Perm(持久代)组成. 其中Heap = {Old + young = { Eden , from, to } }
JDK8的JVM已经将Perm(持久代)从内存空间移除
Linux平台,编辑“Tomcat安装目录/conf/catalina.sh”文件,该文件开头是一大段由#包裹的注释,在注释的最后添加以下内容
export JAVA_OPTS="-server -Xms3072M -Xmx3072M -Xmn512M -Xss512k -XX:+AggressiveOpts -XX:+UseBiasedLocking -XX:PermSize=256M -XX:MaxPermSize=256M -XX:+DisableExplicitGC -XX:+UseConcMarkSweepGC -XX:+UseParNewGC -XX:+CMSParallelRemarkEnabled -XX:+UseCMSCompactAtFullCollection -XX:CMSMaxAbortablePrecleanTime=5 -XX:+CMSClassUnloadingEnabled -XX:LargePageSizeInBytes=128m -XX:+UseFastAccessorMethods -XX:+UseCMSInitiatingOccupancyOnly -XX:CMSInitiatingOccupancyFraction=70 -Djava.awt.headless=true"
若是想要打印JVM运行日志信息,则能够再添加以下参数,-Xloggs指定日志路径
-Xloggc:/path/jvm.log -XX:+PrintGCDateStamps -XX:+PrintGCApplicationStoppedTime -XX:+PrintGCApplicationConcurrentTime -XX:+PrintGCDetails
Windows平台,则编辑“Tomcat安装目录/conf/catalina.bat”文件
set JAVA_OPTS=-server -Xms3072M -Xmx3072M -Xmn512M -Xss512k -XX:+AggressiveOpts -XX:+UseBiasedLocking -XX:PermSize=256M -XX:MaxPermSize=256M -XX:+DisableExplicitGC -XX:+UseConcMarkSweepGC -XX:+UseParNewGC -XX:+CMSParallelRemarkEnabled -XX:+UseCMSCompactAtFullCollection -XX:CMSMaxAbortablePrecleanTime=5 -XX:+CMSClassUnloadingEnabled -XX:LargePageSizeInBytes=128m -XX:+UseFastAccessorMethods -XX:+UseCMSInitiatingOccupancyOnly -XX:CMSInitiatingOccupancyFraction=70 -Djava.awt.headless=true
若是想要打印JVM运行日志信息,则能够再添加以下参数,-Xloggs指定日志路径
-Xloggc:D:\path\jvm.log -XX:+PrintGCDateStamps -XX:+PrintGCApplicationStoppedTime -XX:+PrintGCApplicationConcurrentTime -XX:+PrintGCDetails
参数说明:
-server 指定JAVA虚拟机运行在server模式
-Xms 初始Heap内存大小,本文档设置了3G,须要结合服务器CPU核数,内存总量等实际状况来设置合适数值,此值并不是越大越好,过大将增长垃圾回收的压力
-Xmx 最大Heap内存大小,本文档设置了3G,须要结合服务器CPU核数,内存总量等实际状况来设置合适数值,此值并不是越大越好,过大将增长垃圾回收的压力
-Xmn 新生代内存大小
-Xss 每一个线程的堆栈大小
-XX:+AggressiveOpts 启用JVM开发团队最新的调优成果,例如:编译优化,偏向锁,并行老年代收集,JDK5.6后引入,JDK6默认开启
-XX:+UseBiasedLocking 启用一个优化了的线程锁(偏向锁),JDK5.6后引入,JDK6默认开启
-XX:PermSize 初始持久代内存大小,须要注意永久代在JDK8中被彻底的移除了,永久代的参数-XX:PermSize和-XX:MaxPermSize也被移除了
-XX:MaxPermSize 最大持久代内存大小,须要注意永久代在JDK8中被彻底的移除了,永久代的参数-XX:PermSize和-XX:MaxPermSize也被移除了
-XX:+DisableExplicitGC 禁止显示的调用System.gc()方法进行GC
-XX:+UseConcMarkSweepGC 使用并发标记清除(CMS)垃圾收集器 它是对年老代进行垃圾收集的。CMS收集器经过多线程并发进行垃圾回收,尽可能减小垃圾收集形成的停顿。采用这种垃圾收集器默认会开启-XX:+UseParNewGC参数对新生代使用Parallel GC(并行垃圾回收器)
-XX:+UseParNewGC 新生代使用Parallel GC(并行垃圾回收器),若是老年代使用了CMS垃圾回收期,则新生代默认就是这种垃圾回收器
-XX:+CMSParallelRemarkEnabled CMS垃圾回收器回收对象时,应用有2次停顿,第一次是初始标记,第二次是从新标记,开启并行remark能够下降从新标记停顿时间,
-XX:+UseCMSCompactAtFullCollection CMS不会整理堆碎片,为了防止堆碎片引发full gc,设置此参数使CMS垃圾回收时进行合并碎片,开启这个选项必定程度上会影响性能
-XX:CMSMaxAbortablePrecleanTime
-XX:+CMSClassUnloadingEnabled 开启CMS回收持久代,避免Perm区满引发的full gc
-XX:LargePageSizeInBytes 指定Java heap的分页页面大小
-XX:+UseFastAccessorMethods 将get(),set()方法转成本地代码,默认开启
-XX:+UseCMSInitiatingOccupancyOnly 只有达到-XX:CMSInitiatingOccupancyFraction指定的使用百分比才进行老年代的垃圾回收
-XX:CMSInitiatingOccupancyFraction 指定老年代在使用了多少百分比空间时开始进行垃圾回收,JDK5默认68%,JDK6默认92%
-Djava.awt.headless 解决J2EE工程中的图表工具在Linux/Unix环境下会致使图片显示不出来
-Xloggc 指定JVM日志输出到文件
-XX:+PrintGCDateStamps 打印GC发生的时间,JDK6和JDK7才支持,若是是JDK5请使用-XX:+PrintGCTimeStamps
-XX:+PrintGCApplicationStoppedTime 打印GC形成应用停顿的时间
-XX:+PrintGCApplicationConcurrentTime 打印GC时应用并发执行的时间
-XX:+PrintGCDetails 打印GC详细信息
4. 调整Tomcat Connector的运行模式简单介绍一下直接使用apr (上面已经配置为apr模式)
首先大体了解Tomcat Connector的三种运行模式:bio、nio和apr
bio
bio(blocking I/O),顾名思义,即阻塞式I/O操做,表示Tomcat使用的是传统的Java I/O操做(即java.io包及其子包)。Tomcat在默认状况下,就是以bio模式运行的。遗憾的是,就通常而言,bio模式是三种运行模式中性能最低的一种。咱们能够经过Tomcat Manager来查看服务器的当前状态。
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文件中将以下配置:
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
中的protocol属性值改成org.apache.coyote.http11.Http11NioProtocol便可
<Connector port="8080" protocol="org.apache.coyote.http11.Http11NioProtocol"
connectionTimeout="20000"
redirectPort="8443" />
此时,咱们就能够在Tomcat Manager中看到当前服务器状态页面的HTTP协议的Connector运行模式已经从http-bio-8080变成了nio
四 系统优化:
1. 修改pam限制
2. 修改硬盘算法
3. 内核参数
4. 关闭无用服务
5. 等等待续
五 安全设置:
1.编辑修改配置文件:
# vim /usr/program/tomcat8/conf/server.xml
2.禁用8005端口
telnet localhost 8005 而后输入 SHUTDOWN 就能够关闭 Tomcat,为了安全咱们要禁用该功能
默认值:
<Server port="8005" shutdown="SHUTDOWN">
修改成:
<Server port="-1" shutdown="SHUTDOWN">
3.应用程序安全&关闭自动部署
默认值:
<Host name="localhost" appBase="webapps"
unpackWARs="true" autoDeploy="true">
修改成:
<Host name="localhost" appBase="webapps"
unpackWARs="false" autoDeploy="false" reloadable="false">
4.maxThreads 链接数限制修改配置
默认值:
<!--
<Executor name="tomcatThreadPool" namePrefix="catalina-exec-"
maxThreads="150" minSpareThreads="4"/>
-->
修改成:
<Executor
name="tomcatThreadPool"
namePrefix="catalina-exec-"
maxThreads="500"
minSpareThreads="30"
maxIdleTime="60000"
prestartminSpareThreads = "true"
maxQueueSize = "100"
/>
参数解释:
maxThreads:最大并发数,默认设置 200,通常建议在 500 ~ 800,根据硬件设施和业务来判断
minSpareThreads:Tomcat 初始化时建立的线程数,默认设置 25
maxIdleTime:若是当前线程大于初始化线程,那空闲线程存活的时间,单位毫秒,默认60000=60秒=1分钟。
prestartminSpareThreads:在 Tomcat 初始化的时候就初始化 minSpareThreads 的参数值,若是不等于 true,minSpareThreads 的值就没啥效果了
maxQueueSize:最大的等待队列数,超过则拒绝请求
5.Connector 参数优化配置
默认值:
<Connector
port="8080"
protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443"
/>
修改成:
<Connector
executor="tomcatThreadPool"
port="8080"
protocol="org.apache.coyote.http11.Http11Nio2Protocol"
connectionTimeout="60000"
maxConnections="10000"
redirectPort="8443"
enableLookups="false"
acceptCount="100"
maxPostSize="10485760"
maxHttpHeaderSize="8192"
compression="on"
disableUploadTimeout="true"
compressionMinSize="2048"
acceptorThreadCount="2"
compressableMimeType="text/html,text/plain,text/css,application/javascript,application/json,application/x-font-ttf,application/x-font-otf,image/svg+xml,image/jpeg,image/png,image/gif,audio/mpeg,video/mp4"
URIEncoding="utf-8"
processorCache="20000"
tcpNoDelay="true"
connectionLinger="5"
server="Server Version 11.0"
/>
参数解释:
protocol:Tomcat 8 设置 nio2 更好:org.apache.coyote.http11.Http11Nio2Protocol
protocol:Tomcat 6 设置 nio 更好:org.apache.coyote.http11.Http11NioProtocol
protocol:Tomcat 8 设置 APR 性能飞快:org.apache.coyote.http11.Http11AprProtocol 更多详情:《Tomcat 8.5 基于 Apache Portable Runtime(APR)库性能优化》
connectionTimeout:Connector接受一个链接后等待的时间(milliseconds),默认值是60000。
maxConnections:这个值表示最多能够有多少个socket链接到tomcat上
enableLookups:禁用DNS查询
acceptCount:当tomcat起动的线程数达到最大时,接受排队的请求个数,默认值为100。
maxPostSize:设置由容器解析的URL参数的最大长度,-1(小于0)为禁用这个属性,默认为2097152(2M) 请注意, FailedRequestFilter 过滤器能够用来拒绝达到了极限值的请求。
maxHttpHeaderSize:http请求头信息的最大程度,超过此长度的部分不予处理。通常8K。
compression:是否启用GZIP压缩 on为启用(文本数据压缩) off为不启用, force 压缩全部数据
disableUploadTimeout:这个标志容许servlet容器使用一个不一样的,一般长在数据上传链接超时。 若是不指定,这个属性被设置为true,表示禁用该时间超时。
compressionMinSize:当超过最小数据大小才进行压缩
acceptorThreadCount:用于接受链接的线程数量。增长这个值在多CPU的机器上,尽管你永远不会真正须要超过2。 也有不少非维持链接,您可能但愿增长这个值。默认值是1。
compressableMimeType:配置想压缩的数据类型
URIEncoding:网站通常采用UTF-8做为默认编码。
processorCache:协议处理器缓存的处理器对象来提升性能。 该设置决定多少这些对象的缓存。-1意味着无限的,默认是200。 若是不使用Servlet 3.0异步处理,默认是使用同样的maxThreads设置。 若是使用Servlet 3.0异步处理,默认是使用大maxThreads和预期的并发请求的最大数量(同步和异步)。
tcpNoDelay:若是设置为true,TCP_NO_DELAY选项将被设置在服务器套接字,而在大多数状况下提升性能。这是默认设置为true。
connectionLinger:秒数在这个链接器将持续使用的套接字时关闭。默认值是 -1,禁用socket 延迟时间。
server:隐藏Tomcat版本信息,首先隐藏HTTP头中的版本信息
6.隐藏或修改 Tomcat 版本号
# cd /usr/local/tomcat/lib/
# unzip catalina.jar
# cd org/apache/catalina/util
# vim ServerInfo.properties
server.info=Apache Tomcat/8.5.16
server.number=8.5.16.0
server.built=Jun 21 2017 17:01:09 UTC
将以上去掉或修改版本号便可。
7.删除禁用默认管理页面以及相关配置文件
# rm -rf /usr/local/apache-tomcat-8.5.16/webapps/*
# rm -rf /usr/local/apache-tomcat-8.5.16/conf/tomcat-users.xml
一 安装tomcat 8.5修改运行级别为文本# ln -sf /lib/systemd/system/multi-user.target /etc/systemd/system/default.target1. 建立标准目录结构mkdir /softwaremkdir /datamkdir /script1.准备软件cd /software/wget http://124.202.164.15/files/116700000B429E7F/download.oracle.com/otn-pub/java/jdk/8u161-b12/2f38c3b165be4555a1fa6e98c45e0808/jdk-8u161-linux-x64.tar.gzwget http://mirrors.tuna.tsinghua.edu.cn/apache/tomcat/tomcat-8/v8.5.28/bin/apache-tomcat-8.5.28.tar.gz2.安装前检查:rpm -qa | grep javarpm -e --nodeps java*3. 安装jdkcd /woftware/tar zxvf jdk-8u161-linux-x64.tar.gzmv jdk1.8.0_161 /data/jdkln -s /data/jdk /usr/local/JAVA# 配置环境变量:在/etc/profile 中加入:# Set JDK 环境变量export JAVA_HOME=/usr/local/JAVA ##JDK路径export PATH=/bin:/jre/bin:/usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/bin:/bin:/usr/sbin:/sbin:/root/binexport CLASSPATH=/lib/:/jre/lib:# 运行:source /etc/profile 使配置文件生效source /etc/profile# 检查验证是否安装成功[root@tomcat_jvm software]# /usr/local/JAVA/bin/java -versionjava version "1.8.0_161"Java(TM) SE Runtime Environment (build 1.8.0_161-b12)Java HotSpot(TM) 64-Bit Server VM (build 25.161-b12, mixed mode)4 .安装tomcat 8.5[root@tomcat_jvm software]# tar zxvf apache-tomcat-8.5.28.tar.gz# 根据部署的内容将apache-tomcat更名[root@tomcat_jvm software]# cp -r apache-tomcat-8.5.28 /data/Tomcat-Pay[root@tomcat_jvm software]# cd /data/Tomcat-Pay/[root@tomcat_jvm Tomcat-Pay]# lsbin conf lib LICENSE logs NOTICE RELEASE-NOTES RUNNING.txt temp webapps work#===============================================================================# 安装后配置:Tomcat启动、中止等# 启动[root@tomcat_jvm bin]# /data/Tomcat-Pay/bin/startup.sh# 中止[root@tomcat_jvm bin]# /data/Tomcat-Pay/bin/shutdown.sh# 查看版本信息[root@tomcat_jvm bin]# /data/Tomcat-Pay/bin/version.sh# 输出结果:Using CATALINA_BASE: /data/Tomcat-PayUsing CATALINA_HOME: /data/Tomcat-PayUsing CATALINA_TMPDIR: /data/Tomcat-Pay/tempUsing JRE_HOME: /usr/local/JAVAUsing CLASSPATH: /data/Tomcat-Pay/bin/bootstrap.jar:/data/Tomcat-Pay/bin/tomcat-juli.jarServer version: Apache Tomcat/8.5.28Server built: Feb 6 2018 23:10:25 UTCServer number: 8.5.28.0OS Name: LinuxOS Version: 3.10.0-327.el7.x86_64Architecture: amd64JVM Version: 1.8.0_161-b12JVM Vendor: Oracle Corporation5. 配置开机启动[root@tomcat_jvm bin]# chmod +x /etc/rc.d/rc.local[root@tomcat_jvm bin]# echo '/data/Tomcat-Pay/bin/startup.sh' >> /etc/rc.d/rc.local二 安装apr扩展提高tomcat性能Tomcat 8.5 基于 Apache Portable Runtime(APR)库性能优化Tomcat可使用Apache Portable Runtime来提供卓越的性能及可扩展性,更好地与本地服务器技术的集成。Apache Portable Runtime是一个高度可移植的库,位于Apache HTTP Server 2.x的核心。APR有许多用途,包括访问高级IO功能(如sendfile,epoll和OpenSSL),操做系统级功能(随机数生成,系统状态等)以及本地进程处理(共享内存,NT管道和Unix套接字)。这些功能不只仅是一个后端集中的技术,还可让Tomcat成为通用的网络服务器,能够实现与本地的其余Web技术更好的集成,并使Java成为一个完整的网络服务器平台。官方要求:APR 1.2+ development headers (libapr1-dev package)OpenSSL 1.0.2+ development headers (libssl-dev package)JNI headers from Java compatible JDK 1.4+GNU development environment (gcc, make)生产环境:CentOS Linux release 7 (Core) x86 64Server version: Apache Tomcat/8.5.28java version “1.8.0_131”1.安装相关依赖包# yum -y install gcc gcc-c++ libtool* autoconf automake expat-devel perl perl-devel2.下载安装包 http://mirror.bit.edu.cn/apache/apr/# cd /software/# wget http://mirror.bit.edu.cn/apache/apr/apr-1.6.2.tar.gz# wget http://mirror.bit.edu.cn/apache/apr/apr-iconv-1.2.2.tar.gz# wget http://mirror.bit.edu.cn/apache/apr/apr-util-1.6.0.tar.gz# wget https://www.openssl.org/source/openssl-1.1.0f.tar.gz备用地址 https://mirrors.tuna.tsinghua.edu.cn/apache//apr/wget http://219.239.26.11/files/224600000AE1B9A7/mirror.bit.edu.cn/apache//apr/apr-1.6.3.tar.gzwget https://mirrors.tuna.tsinghua.edu.cn/apache//apr/apr-1.6.3.tar.gzwget https://mirrors.tuna.tsinghua.edu.cn/apache//apr/apr-iconv-1.2.2.tar.gzwget http://mirrors.tuna.tsinghua.edu.cn/apache//apr/apr-util-1.6.1.tar.gz3.安装APR# tar zxvf apr-1.6.2.tar.gz# cd apr-1.6.2# vim configure若有问题能够修改该值,经测试并无发现该问题默认值:RM='$RM'修改成:RM='$RM -f'# ./configure --prefix=/usr/local/apr# make && make install4.安装apr-iconv# tar zxvf apr-iconv-1.2.1.tar.gz# cd apr-iconv-1.2.1# ./configure --prefix=/usr/local/apr-iconv --with-apr=/usr/local/apr# make && make install5.安装apr-util# tar zxvf apr-util-1.6.0.tar.gz# cd apr-util-1.6.0# ./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr --with-apr-iconv=/usr/local/apr-iconv/bin/apriconv# make && make install6.安装OpenSSL# tar zxvf openssl-1.1.0f.tar.gz# cd openssl-1.1.0f# ./config --prefix=/usr/local/openssl# make -j 4 && make install7.安装tomcat-native# cd /usr/local/tomcat/bin/# tar zxvf tomcat-native.tar.gz# cd tomcat-native-1.2.12-src/native# ./configure --with-ssl=/usr/local/openssl --with-apr=/usr/local/apr --with-java-home=/usr/local/JAVA# make && make install注意:若是以上 configure 失败,能够执行 make distclean 清除8.添加变量内容# vim /etc/profile.d/jdk.shexport LD_LIBRARY_PATH=/usr/local/apr/lib:$LD_LIBRARY_PATH# source /etc/profile.d/jdk.sh至此APR安装成功。9.接下来须要修改tomcat配置文件中的APR运行模式,并测试是否安装成功。# vim /usr/local/tomcat/conf/server.xml默认值:<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />修改成:<Connector port="8080" protocol="org.apache.coyote.http11.Http11AprProtocol" connectionTimeout="20000" redirectPort="8443" />默认值:<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />修改成:<Connector port="8009" protocol="org.apache.coyote.ajp.AjpAprProtocol" redirectPort="8443" />10.如今重启tomcat服务,并查看启动日志# systemctl restart tomcat# cat /usr/local/tomcat/logs/catalina.out...INFO [main] org.apache.catalina.core.AprLifecycleListener.lifecycleEvent The APR based Apache Tomcat Native library which allows optimal performance in production environments was not found on the java.library.path: [/usr/java/packages/lib/amd64:/usr/lib64:/lib64:/lib:/usr/lib]INFO [main] org.apache.coyote.AbstractProtocol.init Initializing ProtocolHandler ["http-nio-8080"]INFO [main] org.apache.tomcat.util.net.NioSelectorPool.getSharedSelector Using a shared selector for servlet write/readINFO [main] org.apache.coyote.AbstractProtocol.init Initializing ProtocolHandler ["ajp-nio-8009"]INFO [main] org.apache.tomcat.util.net.NioSelectorPool.getSharedSelector Using a shared selector for servlet write/read...注意:若是遇到上面的提示找不到基于APR的Apache Tomcat Native库,所以没法使用APR模式启动。解决方案:# cp -R /usr/local/apr/lib/* /usr/lib64# cp -R /usr/local/apr/lib/* /usr/lib再次重启tomcat,并查看启动日志# cat /usr/local/tomcat/logs/catalina.out...INFO [main] org.apache.coyote.AbstractProtocol.start Starting ProtocolHandler ["http-apr-8080"]INFO [main] org.apache.coyote.AbstractProtocol.start Starting ProtocolHandler ["http-apr-8009"]...能够看到已经以apr协议模式启动成功,经基于APR的技术web压力测试,Tomcat的性能飙升。三 tomcat 调整:1. 线程池(Thread Pool)优化编辑“Tomcat安装目录/conf/server.xml”文件,找到以下内容<!--<Executor name="tomcatThreadPool" namePrefix="catalina-exec-" maxThreads="150" minSpareThreads="4"/>-->取消注释,参数作以下调整<Executor name="tomcatThreadPool" namePrefix="catalina-exec-" maxThreads="1000" minSpareThreads="25" maxIdleTime="600000" acceptCount="500"/>参数说明:name 这个是线程池的名字,必须惟一,默认便可,咱们在后面的配置里要用到这个东西namePrefix 线程的名字前缀,用来标记线程名字的,这样每一个线程就用这个前缀加上线程编号了,好比 catalina-exec-1 catalina-exec-2maxThreads 线程池能够容纳的最大线程数,tomcat使用线程来处理接收的请求每个线程处理一个请求,这个值决定了同时可以处理的最大请求数,缺省值为200minSpareThreads 最小的保持活跃的线程数量,缺省值为4(tomcat5有此参数,而tomcat6无此参数,到了tomcat7又从新使用此参数,顺便提下5和7中这两个参数含义并不相同有兴趣能够查看官方文档)maxIdleTime 关闭一个空闲线程以前容许空闲线程持续的时间,只有当前空闲线程数大于minSpareThread的值,才会关闭空闲线程acceptCount 当全部可用的请求处理线程都被使用的时候,链接请求队列的最大长度。当该队列满了之后的全部请求都被拒绝,缺省值为10顺便提下以下3个参数maxSpareThreads、maxProcessors和minProcessorsmaxSpareThreads:容许存在的空闲线程的最大数量,tomcat5及之前版本才有的参数,tomcat6和tomcat7均无此参数minProcessors:最小空闲链接线程数,用于提升系统处理性能maxProcessors:最大链接线程数,即并发处理的最大请求数maxProcessors和minProcessors是tomcat4才有的,tomcat5以后的版本均取消了这2个参数,tomcat4基本无人在用了吧,因此优化的时候别再把这2个参数加上了2. 链接器(Connector)优化编辑“Tomcat安装目录/conf/server.xml”文件,找到以下内容将其注释掉<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />再找到以下内容,取消注释<!--<Connector executor="tomcatThreadPool" port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />-->参数作以下调整<Connector executor="tomcatThreadPool" port="8080" protocol="HTTP/1.1" URIEncoding="UTF-8" enableLookups="false" disableUploadTimeout="true" connectionTimeout="20000" keepAliveTimeout="15000" maxKeepAliveRequests="1000" useURIValidationHack="false" compression="on" compressionMinSize="2048" compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain" redirectPort="8443"/>+---------------------------------------------------------------+||||||+--------------------------------------参数说明-------------------AJP/1.3协议负责和其余HTTP服务器创建链接,监听的是8009端口,好比tomcat和apache或者iis集成时使用这个链接器,此时则需优化8009端口的Connector。<!-- Define an AJP 1.3 Connector on port 8009 --> <Connector port="8009" protocol="AJP/1.3" URIEncoding="UTF-8" enableLookups="false" disableUploadTimeout="true" connectionTimeout="20000" keepAliveTimeout="15000" maxKeepAliveRequests="1000" useURIValidationHack="false" compression="on" compressionMinSize="2048" compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain" redirectPort="8443" /># 若是使用 nginx的话,能够直接注释掉AJP参数说明:executor="tomcatThreadPool" 在 Connector里指定使用共享线程池的名称port="8080" 指定服务器端要建立的端口号,并在这个端口监听来自客户端的请求protocol="HTTP/1.1" 负责创建HTTP链接,web应用经过浏览器访问tomcat服务器用的就是这个链接器,默认监听的是8080端口。因此咱们优化的是8080端口的ConnectorURIEncoding="UTF-8" URI解码所使用的字符集,只影响GET请求的URI解码,不影响post的解码enableLookups="false" 禁用DNS查询,默认值为true,为了提升处理能力应设置为falsedisableUploadTimeout="true" 容许servlet container在一个servlet执行的时候,使用一个不一样的,更长的链接超时。最终的结果是给servlet更长的时间以便完成其执行,或者在数据上载的时候更长的超时时间。若是没有指定默认为falseconnectionTimeout="20000" 在Connector接受一个链接之后,等待发生第一个请求的时间,单位毫秒。缺省值为60000(60秒)keepAliveTimeout="15000" 在一个长链接中2次请求之间的最大间隔时间,超过此时间链接断开,单位毫秒maxKeepAliveRequests="1000" 在server关闭链接以前,接受的HTTP请求的最大数目。若是该值设为1,会禁止HTTP/1.0保活,同时也会禁止HTTP/1.1保活和pipelining。若是没有指定默认值100。useURIValidationHack="false" 减小它对一些url的没必要要的检查从而减省开销compression="on" 设为on开启Connector使用HTTP/1.1的GZIP压缩,可节省服务器带宽compressionMinSize="2048" 启用压缩的输出内容大小,这里面设置为2KBcompressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain" 压缩文件的类型redirectPort="8443" 若是Connector支持非SSL请求,在收到一个要求使用SSL传输的请求之后,Catalina会自动将该请求重定向到这里指定的端口号3. JAVA虚拟机(JVM)优化注意调优JVM须要了解使用的JDK是什么版本,随着JDK版本发展有新参数引入,同时有旧参数废弃。本文档以JDK7为例进行调优JDK7的JVM内存由Heap(堆空间)和Perm(持久代)组成. 其中Heap = {Old + young = { Eden , from, to } }JDK8的JVM已经将Perm(持久代)从内存空间移除Linux平台,编辑“Tomcat安装目录/conf/catalina.sh”文件,该文件开头是一大段由#包裹的注释,在注释的最后添加以下内容export JAVA_OPTS="-server -Xms3072M -Xmx3072M -Xmn512M -Xss512k -XX:+AggressiveOpts -XX:+UseBiasedLocking -XX:PermSize=256M -XX:MaxPermSize=256M -XX:+DisableExplicitGC -XX:+UseConcMarkSweepGC -XX:+UseParNewGC -XX:+CMSParallelRemarkEnabled -XX:+UseCMSCompactAtFullCollection -XX:CMSMaxAbortablePrecleanTime=5 -XX:+CMSClassUnloadingEnabled -XX:LargePageSizeInBytes=128m -XX:+UseFastAccessorMethods -XX:+UseCMSInitiatingOccupancyOnly -XX:CMSInitiatingOccupancyFraction=70 -Djava.awt.headless=true"若是想要打印JVM运行日志信息,则能够再添加以下参数,-Xloggs指定日志路径-Xloggc:/path/jvm.log -XX:+PrintGCDateStamps -XX:+PrintGCApplicationStoppedTime -XX:+PrintGCApplicationConcurrentTime -XX:+PrintGCDetailsWindows平台,则编辑“Tomcat安装目录/conf/catalina.bat”文件set JAVA_OPTS=-server -Xms3072M -Xmx3072M -Xmn512M -Xss512k -XX:+AggressiveOpts -XX:+UseBiasedLocking -XX:PermSize=256M -XX:MaxPermSize=256M -XX:+DisableExplicitGC -XX:+UseConcMarkSweepGC -XX:+UseParNewGC -XX:+CMSParallelRemarkEnabled -XX:+UseCMSCompactAtFullCollection -XX:CMSMaxAbortablePrecleanTime=5 -XX:+CMSClassUnloadingEnabled -XX:LargePageSizeInBytes=128m -XX:+UseFastAccessorMethods -XX:+UseCMSInitiatingOccupancyOnly -XX:CMSInitiatingOccupancyFraction=70 -Djava.awt.headless=true若是想要打印JVM运行日志信息,则能够再添加以下参数,-Xloggs指定日志路径-Xloggc:D:\path\jvm.log -XX:+PrintGCDateStamps -XX:+PrintGCApplicationStoppedTime -XX:+PrintGCApplicationConcurrentTime -XX:+PrintGCDetails参数说明:-server 指定JAVA虚拟机运行在server模式-Xms 初始Heap内存大小,本文档设置了3G,须要结合服务器CPU核数,内存总量等实际状况来设置合适数值,此值并不是越大越好,过大将增长垃圾回收的压力-Xmx 最大Heap内存大小,本文档设置了3G,须要结合服务器CPU核数,内存总量等实际状况来设置合适数值,此值并不是越大越好,过大将增长垃圾回收的压力-Xmn 新生代内存大小-Xss 每一个线程的堆栈大小-XX:+AggressiveOpts 启用JVM开发团队最新的调优成果,例如:编译优化,偏向锁,并行老年代收集,JDK5.6后引入,JDK6默认开启-XX:+UseBiasedLocking 启用一个优化了的线程锁(偏向锁),JDK5.6后引入,JDK6默认开启-XX:PermSize 初始持久代内存大小,须要注意永久代在JDK8中被彻底的移除了,永久代的参数-XX:PermSize和-XX:MaxPermSize也被移除了-XX:MaxPermSize 最大持久代内存大小,须要注意永久代在JDK8中被彻底的移除了,永久代的参数-XX:PermSize和-XX:MaxPermSize也被移除了-XX:+DisableExplicitGC 禁止显示的调用System.gc()方法进行GC-XX:+UseConcMarkSweepGC 使用并发标记清除(CMS)垃圾收集器 它是对年老代进行垃圾收集的。CMS收集器经过多线程并发进行垃圾回收,尽可能减小垃圾收集形成的停顿。采用这种垃圾收集器默认会开启-XX:+UseParNewGC参数对新生代使用Parallel GC(并行垃圾回收器)-XX:+UseParNewGC 新生代使用Parallel GC(并行垃圾回收器),若是老年代使用了CMS垃圾回收期,则新生代默认就是这种垃圾回收器-XX:+CMSParallelRemarkEnabled CMS垃圾回收器回收对象时,应用有2次停顿,第一次是初始标记,第二次是从新标记,开启并行remark能够下降从新标记停顿时间,-XX:+UseCMSCompactAtFullCollection CMS不会整理堆碎片,为了防止堆碎片引发full gc,设置此参数使CMS垃圾回收时进行合并碎片,开启这个选项必定程度上会影响性能-XX:CMSMaxAbortablePrecleanTime-XX:+CMSClassUnloadingEnabled 开启CMS回收持久代,避免Perm区满引发的full gc-XX:LargePageSizeInBytes 指定Java heap的分页页面大小-XX:+UseFastAccessorMethods 将get(),set()方法转成本地代码,默认开启-XX:+UseCMSInitiatingOccupancyOnly 只有达到-XX:CMSInitiatingOccupancyFraction指定的使用百分比才进行老年代的垃圾回收-XX:CMSInitiatingOccupancyFraction 指定老年代在使用了多少百分比空间时开始进行垃圾回收,JDK5默认68%,JDK6默认92%-Djava.awt.headless 解决J2EE工程中的图表工具在Linux/Unix环境下会致使图片显示不出来-Xloggc 指定JVM日志输出到文件-XX:+PrintGCDateStamps 打印GC发生的时间,JDK6和JDK7才支持,若是是JDK5请使用-XX:+PrintGCTimeStamps-XX:+PrintGCApplicationStoppedTime 打印GC形成应用停顿的时间-XX:+PrintGCApplicationConcurrentTime 打印GC时应用并发执行的时间-XX:+PrintGCDetails 打印GC详细信息4. 调整Tomcat Connector的运行模式简单介绍一下直接使用apr (上面已经配置为apr模式)首先大体了解Tomcat Connector的三种运行模式:bio、nio和aprbiobio(blocking I/O),顾名思义,即阻塞式I/O操做,表示Tomcat使用的是传统的Java I/O操做(即java.io包及其子包)。Tomcat在默认状况下,就是以bio模式运行的。遗憾的是,就通常而言,bio模式是三种运行模式中性能最低的一种。咱们能够经过Tomcat Manager来查看服务器的当前状态。nionio(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文件中将以下配置:<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />中的protocol属性值改成org.apache.coyote.http11.Http11NioProtocol便可<Connector port="8080" protocol="org.apache.coyote.http11.Http11NioProtocol" connectionTimeout="20000" redirectPort="8443" />此时,咱们就能够在Tomcat Manager中看到当前服务器状态页面的HTTP协议的Connector运行模式已经从http-bio-8080变成了nio四 系统优化:1. 修改pam限制2. 修改硬盘算法3. 内核参数4. 关闭无用服务5. 等等待续五 安全设置:1.编辑修改配置文件:# vim /usr/program/tomcat8/conf/server.xml2.禁用8005端口telnet localhost 8005 而后输入 SHUTDOWN 就能够关闭 Tomcat,为了安全咱们要禁用该功能默认值:<Server port="8005" shutdown="SHUTDOWN">修改成:<Server port="-1" shutdown="SHUTDOWN">3.应用程序安全&关闭自动部署默认值:<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true">修改成:<Host name="localhost" appBase="webapps" unpackWARs="false" autoDeploy="false" reloadable="false">4.maxThreads 链接数限制修改配置默认值:<!-- <Executor name="tomcatThreadPool" namePrefix="catalina-exec-" maxThreads="150" minSpareThreads="4"/> -->修改成:<Executor name="tomcatThreadPool" namePrefix="catalina-exec-" maxThreads="500" minSpareThreads="30" maxIdleTime="60000" prestartminSpareThreads = "true" maxQueueSize = "100"/>参数解释:maxThreads:最大并发数,默认设置 200,通常建议在 500 ~ 800,根据硬件设施和业务来判断minSpareThreads:Tomcat 初始化时建立的线程数,默认设置 25maxIdleTime:若是当前线程大于初始化线程,那空闲线程存活的时间,单位毫秒,默认60000=60秒=1分钟。prestartminSpareThreads:在 Tomcat 初始化的时候就初始化 minSpareThreads 的参数值,若是不等于 true,minSpareThreads 的值就没啥效果了maxQueueSize:最大的等待队列数,超过则拒绝请求5.Connector 参数优化配置默认值:<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />修改成:<Connector executor="tomcatThreadPool" port="8080" protocol="org.apache.coyote.http11.Http11Nio2Protocol" connectionTimeout="60000" maxConnections="10000" redirectPort="8443" enableLookups="false" acceptCount="100" maxPostSize="10485760" maxHttpHeaderSize="8192" compression="on" disableUploadTimeout="true" compressionMinSize="2048" acceptorThreadCount="2" compressableMimeType="text/html,text/plain,text/css,application/javascript,application/json,application/x-font-ttf,application/x-font-otf,image/svg+xml,image/jpeg,image/png,image/gif,audio/mpeg,video/mp4" URIEncoding="utf-8" processorCache="20000" tcpNoDelay="true" connectionLinger="5" server="Server Version 11.0" />参数解释:protocol:Tomcat 8 设置 nio2 更好:org.apache.coyote.http11.Http11Nio2Protocolprotocol:Tomcat 6 设置 nio 更好:org.apache.coyote.http11.Http11NioProtocolprotocol:Tomcat 8 设置 APR 性能飞快:org.apache.coyote.http11.Http11AprProtocol 更多详情:《Tomcat 8.5 基于 Apache Portable Runtime(APR)库性能优化》connectionTimeout:Connector接受一个链接后等待的时间(milliseconds),默认值是60000。maxConnections:这个值表示最多能够有多少个socket链接到tomcat上enableLookups:禁用DNS查询acceptCount:当tomcat起动的线程数达到最大时,接受排队的请求个数,默认值为100。maxPostSize:设置由容器解析的URL参数的最大长度,-1(小于0)为禁用这个属性,默认为2097152(2M) 请注意, FailedRequestFilter 过滤器能够用来拒绝达到了极限值的请求。maxHttpHeaderSize:http请求头信息的最大程度,超过此长度的部分不予处理。通常8K。compression:是否启用GZIP压缩 on为启用(文本数据压缩) off为不启用, force 压缩全部数据disableUploadTimeout:这个标志容许servlet容器使用一个不一样的,一般长在数据上传链接超时。 若是不指定,这个属性被设置为true,表示禁用该时间超时。compressionMinSize:当超过最小数据大小才进行压缩acceptorThreadCount:用于接受链接的线程数量。增长这个值在多CPU的机器上,尽管你永远不会真正须要超过2。 也有不少非维持链接,您可能但愿增长这个值。默认值是1。compressableMimeType:配置想压缩的数据类型URIEncoding:网站通常采用UTF-8做为默认编码。processorCache:协议处理器缓存的处理器对象来提升性能。 该设置决定多少这些对象的缓存。-1意味着无限的,默认是200。 若是不使用Servlet 3.0异步处理,默认是使用同样的maxThreads设置。 若是使用Servlet 3.0异步处理,默认是使用大maxThreads和预期的并发请求的最大数量(同步和异步)。tcpNoDelay:若是设置为true,TCP_NO_DELAY选项将被设置在服务器套接字,而在大多数状况下提升性能。这是默认设置为true。connectionLinger:秒数在这个链接器将持续使用的套接字时关闭。默认值是 -1,禁用socket 延迟时间。server:隐藏Tomcat版本信息,首先隐藏HTTP头中的版本信息6.隐藏或修改 Tomcat 版本号 # cd /usr/local/tomcat/lib/ # unzip catalina.jar # cd org/apache/catalina/util # vim ServerInfo.properties server.info=Apache Tomcat/8.5.16 server.number=8.5.16.0 server.built=Jun 21 2017 17:01:09 UTC将以上去掉或修改版本号便可。7.删除禁用默认管理页面以及相关配置文件 # rm -rf /usr/local/apache-tomcat-8.5.16/webapps/* # rm -rf /usr/local/apache-tomcat-8.5.16/conf/tomcat-users.xml