前言java
关于 Tomcat 性能调优,一直以来就是运维面试的一个重要话题。今天咱们就简单聊聊 Tomcat 如何进行性能优化? 首先声明,我不会去说 Tomcat 是什么,内部结构,原理什么的。我不懂......我只是会说一些我在工做当中的一些参数以及本身所了解的方法,主要仍是和你们沟通、交流。程序员
1、关于选型面试
简单说明,关于Openjdk 和 Oracle jdk的选择,我我的比较倾向于使用Oracle jdk,虽然它很流氓可是我以为东西仍是靠谱;其次是在版本上的选择,建议选择最新稳定版进行在生产环境使用,以此来得到更高效的性能;apache
1、JVM相关参数优化tomcat
export JAVA_OPTS=""-Dfile.encoding=UTF-8 -server -Xms1400M -Xmx1400M -Xss512k -XX:+AggressiveOpts -XX:+UseBiasedLocking -XX:PermSize=128M -XX:MaxPermSize=256M -XX:+DisableExplicitGC -XX:MaxTenuringThreshold=30 -XX:+UseConcMarkSweepGC -XX:+UseParNewGC -XX:+CMSParallelRemarkEnabled -XX:ReservedCodeCacheSize=32m -XX:+UseCMSCompactAtFullCollection -XX:LargePageSizeInBytes=128m -XX:+UseFastAccessorMethods -XX:+UseCMSInitiatingOccupancyOnly -Djava.awt.headless=true"
提示:在java 8中永久代已被移除,若是你是java8的环境,须要你去掉"-XX:PermSize=128M -XX:MaxPermSize=256M"参数,而且"-XX:MaxTenuringThreshold=31"参数值只能设置在0-15,不然会提示相关错误; 性能优化
配置说明:bash
Tomcat Connector(Tomcat链接器)有bio、nio、apr三种运行模式,简单介绍(抄百度的,有本事来打我):服务器
特性:一个线程处理一个请求。缺点:并发量高时,线程数较多,浪费资源。网络
12-Dec-2017 14:17:46.429 信息 [main] org.apache.coyote.AbstractProtocol.init Initializing ProtocolHandler ["http-nio-8080"]
12-Dec-2017 14:17:46.445 信息 [main] org.apache.tomcat.util.net.NioSelectorPool.getSharedSelector Using a shared selector for servlet write/read
12-Dec-2017 14:17:46.473 信息 [main] org.apache.coyote.AbstractProtocol.init Initializing ProtocolHandler ["ajp-nio-8009"]
12-Dec-2017 14:17:46.474 信息 [main] org.apache.tomcat.util.net.NioSelectorPool.getSharedSelector Using a shared selector for servlet write/read
12-Dec-2017 14:17:46.476 信息 [main] org.apache.catalina.startup.Catalina.load Initialization processed in 1031 ms
特性:利用Java的异步IO处理,能够经过少许的线程处理大量的请求。多线程
3.2 tomcat server.xml配置优化
线程池参数配置:
<?xml version="1.0" encoding="UTF-8"?>
<Service name="Catalina">
<!--The connectors can use a shared executor, you can define one or more named thread pools-->
<!--
<Executor name="tomcatThreadPool" namePrefix="catalina-exec-"
maxThreads="150" minSpareThreads="4"/>
-->
<Executor name="tomcatThreadPool" namePrefix="catalina-exec-"
maxThreads="1000"
minSpareThreads="100"
maxIdleTime="60000"
prestartminSpareThreads = "true"
maxQueueSize = "100"
className="org.apache.catalina.core.StandardThreadExecutor" />
提示:网上不少混淆了,异步servlet和非阻塞connector,一个是Executor,一个是connector,二者的工做阶段不一样。
链接器配置:
<Connector executor="tomcatThreadPool" URIEncoding="utf-8" port="8080" protocol="org.apache.coyote.http11.Http11Nio2Protocol" enableLookups="false" maxConnections="2000" useURIValidationHack="false" keepAliveTimeout="60000" connectionTimeout="20000"
maxThreads="1000"
minSpareThreads="100"
maxSpareThreads="2000"
minProcessors="100"
maxProcessors="1000" tcpNoDelay="true" redirectPort="8443" />
提示:Tomcat 中能够同时接收的链接数为maxConnections+acceptCount 。上面这些参数须要手动开启,默认值配置都较低,没法发挥最佳性能。能够去大家生产环境看看,是否是不少没有作优化呢;
4、关于性能分析
4.1 常见工具
4.2 其余
查看tomcat链接数:
netstat –nat | grep 8080
查看 tomcat 线程数:
# 查看进程ID ps -ef |grep java # 查看线程 ps -o nlwp 3598
提示:经过使用该方式能够查看到该进程有多少线程,但并无排除处于idle状态的线程。因此,要想获取当前进程running的线程数,还须要执行以下命令。
ps -eLo pid,stat | grep 3598 | grep running | wc -l
其中ps -eLo pid,stat能够找出全部线程,并打印其所在的进程号和线程当前的状态;两个grep命令分别筛选进程号和线程状态;wc统计个数。SL表示空闲状态。