tomcat项目实战
tomcat 依赖 java运行环境,必须要有jre , 选择 jdk1.8 JvmPertest
千万不能用 kyj易捷支付 项目机器
- 选择 一台机器 ,安装jdk1.8的机器
- 下载tomcat的包 上传到机器,解压tomcat
tomcat文件
bin文件夹:
启动文件
堆栈配置文件 catalina.sh
JAVA_OPTS="-Xms256m -Xmx256m -Xmn128m"
JAVA_OPTS="-XX:+PrintGC -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintGCApplicationStoppedTime -Xloggc:gc.log"
JAVA_OPTS="-Xms256m -Xmx256m -Xmn128m"
JAVA_OPTS="-javaagent:./jmx_prometheus_javaagent-0.18.0.jar=3088:./tomcat.yml"
JAVA_OPTS="-Xms256m -Xmx256m -Xmn128m -javaagent:./jmx_prometheus_javaagent-0.18.0.jar=3088:./tomcat.yml -XX:+PrintGC -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintGCApplicationStoppedTime -Xloggc:gc.log"
conf文件夹
- server.xml文件
- tomcat的协议的服务端口 在这里配置; 如果一台电脑上,要启动多个tomcat,那么,就需要修改 这个文件中端口
- tomcat线程池的配置
<Executor name="tomcatThreadPool" namePrefix="catalina-exec-"
maxThreads="150" minSpareThreads="4"/>
<!-- A "Connector" represents an endpoint by which requests are received
and responses are returned. Documentation at :
Java HTTP Connector: /docs/config/http.html
Java AJP Connector: /docs/config/ajp.html
APR (HTTP/AJP) Connector: /docs/apr.html
Define a non-SSL/TLS HTTP/1.1 Connector on port 8080
-->
<!--
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
-->
<!-- A "Connector" using the shared thread pool-->
<Connector executor="tomcatThreadPool"
port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
tomcat性能调优:
- 如果,性能测试,发现tomcat有 内存不足的问题时候,或者,tomcat响应时间 偏慢,我们可以去 调整 catalina.sh文件中 JAVA_OPTS 的堆栈配置参数
- 如果,性能测试过程中,出现了 tomcat的连接数不够,或者 tomcat的并发用户数上不去。就要去改 server.xml文件中 连接池的配置参数。 ------连接池的大小, 不是想多大,就多大, 越大,消耗
- 的资源也会越多。要根据你的资源情况,来合理设置。
- 现在很多项目 springboot开发,这个框架,自带了tomcat, 也有连接池的配置参数,只是这个参数,开发写在代码中,打在jar包中。 ----如果,你性能测试,发现,需要调整,只能找开发人员去修改他代码
webapps文件夹
- 存放部署的项目包
- 部署的项目包 war格式 (不是jar包) 会自动解压
- 服务的访问路径 就要 带上 项目包名称
项目包 JvmPertest.war
访问地址: http://ip:8080/JvmPertest/pertest1
tomcat的监控
grafana+prometheus+jvm_exporter
- jvm_exporter 放到tomcat的机器上
- https://repo1.maven.org/maven2/io/prometheus/jmx/jmx_prometheus_javaagent/ 去里面下载自己要jar包
- 把jmx_prometheus_javaagent-0.16.1.jar包 上传到 tomcat的bin文件夹
- tomcat.yml文件 上传到 tomcat的bin文件夹
修改 catalina.sh文件
添加 JAVA_OPTS=“-javaagent:./jmx_prometheus_javaagent-0.18.0.jar=3088:./tomcat.yml”
cd /opt/apache-tomcat-8.5.59/bin
- 启动项目:
./startup.sh
启动日志收集:
cd /opt/apache-tomcat-8.5.59/logs
输入:tail -f catalina.out
配置prometheus
grafana的启动: systemctl restart grafana-server
端口: 3000
启动prometheus: ./prometheus
后台进程运行 nohup ./prometheus &
- 在grafana的web界面中,配置展示
- http://grafana_ip:3000 admin admin
- 添加数据源
把 gc配置 、堆栈配置 注释了
项目是有 oom问题
怎么知道有 OOM问题: 1、从请求日志, 2、或者 从服务日志中看 3、 或者通过监控
堆栈配置参数
-server
第一个参数,指定为服务,多核时用
-Xms
启动时,初始堆大小;没有配置时,从最小逐步增加到最大值
-Xmx
运行时分配的最大堆大小;默认64M
-Xmn
新生代堆大小
-Xss
每个线程栈大小
-XX:PermSize
初始化非堆内存大小
-XX:MaxPermSize
永久代(非堆)最大内存大小
-XX:MaxNewSize
新生代最大大小
gc的配置
-XX:+PrintGC
打印gc
-XX:+PrintGCDetails
打印gc的详细信息
-XX:+PrintGCTimeStamps
打印gc消耗时间
-XX:+PrintGCApplicationStoppedTime
打印出gc
操作时程序出现卡顿的时间
-Xloggc:gc.log
输出gc日志文件的路径, 直接写了gc.log
意思是,gc
日志文件,就在当前路径下。
tomcat的连接池参数
- connectionTimeout 连接超时时间,单位毫秒
- name:线程池的标记
- namePrefix: 线程名字前缀
- maxThreads: 线程池中最大活跃线程数,默认200
- minSpareThreads:线程池中保持的最小线程数,也是线程每次增加的最小数量,默认25
- acceptCount 最大可接受的排队数量
- maxSpareThreads:这个参数标识,一旦创建的线程数量超过这个值,Tomcat 就会关闭不活 动的线程