tomcat--知识梳理

一、前提:电脑需要安装jdk
二、目录
1、bin:启动、关闭tomcat的文件
startup、shutdown为启动停止文件;
catalina.sh文件为配置文件(配置堆栈信息、日志等)

2、conf:配置文件
server.xml 最重要的配置文件(修改连接池、http端口等)

3、webapps:项目包放置路径
把war、jar包,放在这个路径下,tomcat启动时会自动解压

还有另外一种方式,使用java -jar 直接启动
只有当war包是微服务项目springboot框架时可以直接用java -jar启动
java -jar **.war|jar --port 自定义端口

三、修改配置文件
1、配置tomcat的jvm信息,调整jvm堆栈信息
编辑bin/catalina.sh文件,搜索JAVA_OPTS
添加以下代码:
JAVA_OPTS="-server -Xms512m -Xmx512m -Xss256k -XX:PermSize=128m"
-server :当前为一个server服务,现在的服务器一般都是多核
-Xms512m: 初始分配堆大小
-Xmx512m:最大堆大小
-Xmn:新生代的大小
-Xss256k:每个线程栈的大小
-XX:PermSize=128m:非堆内存大小

2、JAVA_OPTS参数添加垃圾回收统计、设置并行收集器、设置并发收集器,详见下图


3、修改tomcat连接池
编辑conf/server.xml文件


<Executor name="tomcatThreadPool" namePrefix="catalina-exec-"
maxThreads="32" minSpareThreads="4"/>
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
acceptCount=100
maxConnections=1000
redirectPort="8443" />
acceptCount:能接受的队列长度
maxConnections:最大连接数,配置-1,不限制
maxThreads:最大线程数,相对与能支持的最大并发用户数
connectionTimeout :连接超时时长,单位毫秒
minSpareThreads:tomcat初始化默认时创建的线程数,也是以后线程增加时一次增加的最小数量
maxSpareThreads:一旦创建的线程数超过这个值,tomcat就会关闭不活动的线程

 图解:maxConnections、maxThreads、acceptCount关系

我们可以把tomcat比做一个火锅店,流程是取号、入座、叫服务员,可以做一下三个形象的类比:

1)acceptCount 最大等待数
可以类比为火锅店的排号处能够容纳排号的最大数量;排号的数量不是无限制的,火锅店的排号到了一定数据量之后,服务往往会说:已经客满。
(2)maxConnections 最大连接数
可以类比为火锅店的大堂的餐桌数量,也就是可以就餐的桌数。如果所有的桌子都已经坐满,则表示餐厅已满,已经达到了服务的数量上线,不能再有顾客进入餐厅了。
(3)maxThreads:最大线程数
可以类比为厨师的个数。每一个厨师,在同一时刻,只能给一张餐桌炒菜,就像极了JVM中的一条线程。

整个就餐的流程,大致如下:
(1)取号:如果maxConnections连接数没有满,就不需要取号,因为还有空余的餐桌,直接被大堂服务员领上餐桌,点菜就餐即可。如果 maxConnections 连接数满了,但是取号人数没有达到 acceptCount,则取号成功。如果取号人数已达到acceptCount,则拿号失败,会得到Tomcat的Connection refused connect 的回复信息。
(2)上桌:如果有餐桌空出来了,表示maxConnections连接数没有满,排队的人,可以进入大堂上桌就餐。
(3)就餐:就餐需要厨师炒菜。厨师的数量,比顾客的数量,肯定会少一些。一个厨师一定需要给多张餐桌炒菜,如果就餐的人越多,厨师也会忙不过来。这时候就可以增加厨师,一增加到上限maxThreads的值,如果还是不够,只能是拖慢每一张餐桌的上菜速度,这种情况,就是大家常见的“上一道菜吃光了,下一道菜还没有上”尴尬场景。
详见截图:

结论:服务器支持的最大连接数在acceptCount+maxConnections之间,超出这个值后,如果有新的请求进来,就会有超时的错误提示

 四、性能调优

调优1:做性能测试时,在服务器日志中,查看到 Out of Memory (oom内存溢出的信息)时可以适当的调整jvm堆栈信息,不能超过物理内存的一半

 
调优2:tomcat连接池不够时,调整线程池大小
netstat -apo | grep 8080 | grep ESTABLISHED | wc -l         -----查看连接数

 参考链接:https://www.jianshu.com/p/5198359b59f7

原文地址:https://www.cnblogs.com/sgfg-1314/p/14353630.html