Docker Tomcat 性能调优详解 tomcat 9 adoptopenjdk openj9
2021-05-07
阅读 {{counts.readCount}}
评论 {{counts.commentCount}}
<br><br>
## 前言
标题起的略微有点大了,说是 '性能调优详解',其实都是东拼西凑一些网上的配置,到服务器进行实践。并没有特别科学严谨的详细测试优劣。只是个人的理解,仅供参考。
<br>
这里重点说下 `tomcat` 和 `jdk` 的版本选择
各位可以到 `docker hub` 中查看官方打包的 `tomcat`
有上百个版本可选,分歧主要是在 `tomcat` `jdk` `jvm` 的版本上
[https://hub.docker.com/_/tomcat?tab=tags&page=1&ordering=last_updated](https://hub.docker.com/_/tomcat?tab=tags&page=1&ordering=last_updated)
<br>
`tomcat` 版本上有 `8.0` `8.5` `9.0` `10.0`
`jdk` 有 `oraclejdk` `openjdk` , `openjdk` 等分支
`jdk` 版本上也可以选 `8.0` `11.0` `15.0` 以及更高
<br>
我个人中意的jdk版本是 `adopt openjdk`
他家的jdk的jvm有2个选择,分别是 `hotspot` 和 `openj9`
<br>
对这些分支有兴趣的小伙伴可以自行百度
我选择的考量是在有限的云主机资源中
榨取更多的性能表现。所以我会尽可能选低版本 `jdk` `tomcat`
更低内存消耗的 `jvm` ,以及尽可能希望支持更多高级特性
<br>
所以最终选择的是 `tomcat 8.5.65` `jdk8` `adoptopenjdk` `openj9`
<br><br>
## 安装
由于是升级,docker中已有运行中的tomcat,故之后在端口和命名上都会避开默认值
```shell
# 拉取镜像
docker pull tomcat:8.5.65-jdk8-adoptopenjdk-openj9
# 先运行一次镜像,拿到5个文件夹里的文件
docker run -d -p 8500:8080 --name tomcat8 tomcat:8.5.65-jdk8-adoptopenjdk-openj9
# 把5个关键文件夹复制到本地 ( 提前建好docker文件夹目录 )
docker cp tomcat8:/usr/local/tomcat/bin /root/docker/tomcat8/
docker cp tomcat8:/usr/local/tomcat/conf /root/docker/tomcat8/
docker cp tomcat8:/usr/local/tomcat/logs /root/docker/tomcat8/
docker cp tomcat8:/usr/local/tomcat/webapps /root/docker/tomcat8/
docker cp tomcat8:/usr/local/tomcat/work /root/docker/tomcat8/
# 停止并删除临时版本
dokcer stop tomcat8
docker rm tomcat8
# 创建正式版 ( 内存建议给物理机的 60~80% 建议提前关联redis和mysql )
docker run -d -p 8080:8080\
-e "TZ=Asia/Shanghai"\
--restart=always\
--link mysql\
--link redis\
-v /root/docker/tomcat8/logs:/usr/local/tomcat/logs\
-v /root/docker/tomcat8/webapps:/usr/local/tomcat/webapps\
-v /root/docker/tomcat8/bin:/usr/local/tomcat/bin\
-v /root/docker/tomcat8/conf:/usr/local/tomcat/conf\
-v /root/docker/tomcat8/work:/usr/local/tomcat/work\
-m 2048M\
--oom-kill-disable\
--memory-swap=-1\
--name tomcat\
tomcat:8.5.65-jdk8-adoptopenjdk-openj9
# 看下运行状态是否成功
docker stats
```
<br><br>
## 配置
首先是 `server.xml`
位置在 `/root/docker/tomcat8/conf/server.xml`
参考文档
[https://tomcat.apache.org/tomcat-8.5-doc/config/http.html](https://tomcat.apache.org/tomcat-8.5-doc/config/http.html)
```xml
# 默认是
<!--
<Executor name="tomcatThreadPool" namePrefix="catalina-exec-"
maxThreads="150" minSpareThreads="4"/>
-->
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
# 修改后
# 打开线程池 并增加最大最小线程
<Executor name="tomcatThreadPool" namePrefix="catalina-exec-"
maxThreads="512" minSpareThreads="64"/>
# 特别说明一下为什么不开http2,其实tomcat8.5.65已经完整支持http2了,但开启http2必须先开启https绑定ssl证书,由于后续nginx还会再做一次同样的步骤,且nginx效率明显高于tomcat,所以这一层保留http1.1
# 上文是把宿主机的8500端口,对到容器内的8080端口,所以tomcat内部依旧采用8080
# 最大连接数给1000 最大等待数给10000 开启gzip 等等
<Connector executor="tomcatThreadPool"
protocol="org.apache.coyote.http11.Http11Nio2Protocol"
port="8080"
maxConnections="1000"
acceptCount="10000"
enableLookups="false"
disableUploadTimeout="true"
useSendfile="true"
connectionTimeout="60000"
redirectPort="8443"
URIEncoding="UTF-8"
compression="on"
compressionMinSize="1024"
compressibleMimeType="text/html,text/xml,text/plain,text/css,text/javascript,application/javascript"
/>
```
再改 `catalina.sh`
位置在 `/root/docker/tomcat8/bin/catalina.sh`
```shell
# 尽量防止oom 合理分配内存 我喜欢按照物理机一半 和上文docker run中给的最大内存保持一致
JAVA_OPTS="-Xms128M -Xmx2048M -XX:MaxMetaspaceSize=1024M"
```
**至此配置完成,再去看下日志检查运行状态,一切正常,大功告成**
```shell
docker logs -f tomcat8
```
## END