Docker Tomcat 性能调优详解 tomcat 9 adoptopenjdk openj9 home 编辑时间 2021/05/07 ![](/api/file/getImage?fileId=6094eecd16199b501c023730) <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 送人玫瑰,手留余香 赞赏 Wechat Pay Alipay Ubuntu 20.04 安装 Android 模拟器 Genymotion Docker GoAccess 入门 实现 Nginx 日志分析 数据可视化