前言

标题起的略微有点大了,说是 ‘性能调优详解’,其实都是东拼西凑一些网上的配置,到服务器进行实践。并没有特别科学严谨的详细测试优劣。只是个人的理解,仅供参考。

这里重点说下 tomcatjdk 的版本选择
各位可以到 docker hub 中查看官方打包的 tomcat
有上百个版本可选,分歧主要是在 tomcat jdk jvm 的版本上
https://hub.docker.com/_/tomcat?tab=tags&page=1&ordering=last_updated

tomcat 版本上有 8.0 8.5 9.0 10.0
jdkoraclejdk openjdk , openjdk 等分支
jdk 版本上也可以选 8.0 11.0 15.0 以及更高

我个人中意的jdk版本是 adopt openjdk
他家的jdk的jvm有2个选择,分别是 hotspotopenj9

对这些分支有兴趣的小伙伴可以自行百度
我选择的考量是在有限的云主机资源中
榨取更多的性能表现。所以我会尽可能选低版本 jdk tomcat
更低内存消耗的 jvm ,以及尽可能希望支持更多高级特性

所以最终选择的是 tomcat 8.5.65 jdk8 adoptopenjdk openj9



安装

由于是升级,docker中已有运行中的tomcat,故之后在端口和命名上都会避开默认值

  1. # 拉取镜像
  2. docker pull tomcat:8.5.65-jdk8-adoptopenjdk-openj9
  3. # 先运行一次镜像,拿到5个文件夹里的文件
  4. docker run -d -p 8500:8080 --name tomcat8 tomcat:8.5.65-jdk8-adoptopenjdk-openj9
  5. # 把5个关键文件夹复制到本地 ( 提前建好docker文件夹目录 )
  6. docker cp tomcat8:/usr/local/tomcat/bin /root/docker/tomcat8/
  7. docker cp tomcat8:/usr/local/tomcat/conf /root/docker/tomcat8/
  8. docker cp tomcat8:/usr/local/tomcat/logs /root/docker/tomcat8/
  9. docker cp tomcat8:/usr/local/tomcat/webapps /root/docker/tomcat8/
  10. docker cp tomcat8:/usr/local/tomcat/work /root/docker/tomcat8/
  11. # 停止并删除临时版本
  12. dokcer stop tomcat8
  13. docker rm tomcat8
  14. # 创建正式版 ( 内存建议给物理机的 60~80% 建议提前关联redis和mysql )
  15. docker run -d -p 8080:8080\
  16. -e "TZ=Asia/Shanghai"\
  17. --restart=always\
  18. --link mysql\
  19. --link redis\
  20. -v /root/docker/tomcat8/logs:/usr/local/tomcat/logs\
  21. -v /root/docker/tomcat8/webapps:/usr/local/tomcat/webapps\
  22. -v /root/docker/tomcat8/bin:/usr/local/tomcat/bin\
  23. -v /root/docker/tomcat8/conf:/usr/local/tomcat/conf\
  24. -v /root/docker/tomcat8/work:/usr/local/tomcat/work\
  25. -m 2048M\
  26. --oom-kill-disable\
  27. --memory-swap=-1\
  28. --name tomcat\
  29. tomcat:8.5.65-jdk8-adoptopenjdk-openj9
  30. # 看下运行状态是否成功
  31. docker stats



配置

首先是 server.xml
位置在 /root/docker/tomcat8/conf/server.xml
参考文档
https://tomcat.apache.org/tomcat-8.5-doc/config/http.html

  1. # 默认是
  2. <!--
  3. <Executor name="tomcatThreadPool" namePrefix="catalina-exec-"
  4. maxThreads="150" minSpareThreads="4"/>
  5. -->
  6. <Connector port="8080" protocol="HTTP/1.1"
  7. connectionTimeout="20000"
  8. redirectPort="8443" />
  9. # 修改后
  10. # 打开线程池 并增加最大最小线程
  11. <Executor name="tomcatThreadPool" namePrefix="catalina-exec-"
  12. maxThreads="512" minSpareThreads="64"/>
  13. # 特别说明一下为什么不开http2,其实tomcat8.5.65已经完整支持http2了,但开启http2必须先开启https绑定ssl证书,由于后续nginx还会再做一次同样的步骤,且nginx效率明显高于tomcat,所以这一层保留http1.1
  14. # 上文是把宿主机的8500端口,对到容器内的8080端口,所以tomcat内部依旧采用8080
  15. # 最大连接数给1000 最大等待数给10000 开启gzip 等等
  16. <Connector executor="tomcatThreadPool"
  17. protocol="org.apache.coyote.http11.Http11Nio2Protocol"
  18. port="8080"
  19. maxConnections="1000"
  20. acceptCount="10000"
  21. enableLookups="false"
  22. disableUploadTimeout="true"
  23. useSendfile="true"
  24. connectionTimeout="60000"
  25. redirectPort="8443"
  26. URIEncoding="UTF-8"
  27. compression="on"
  28. compressionMinSize="1024"
  29. compressibleMimeType="text/html,text/xml,text/plain,text/css,text/javascript,application/javascript"
  30. />

再改 catalina.sh
位置在 /root/docker/tomcat8/bin/catalina.sh

  1. # 尽量防止oom 合理分配内存 我喜欢按照物理机一半 和上文docker run中给的最大内存保持一致
  2. JAVA_OPTS="-Xms128M -Xmx2048M -XX:MaxMetaspaceSize=1024M"

至此配置完成,再去看下日志检查运行状态,一切正常,大功告成

  1. docker logs -f tomcat8

END