【发布时间】:2018-10-04 14:29:38
【问题描述】:
我有一个 spring-boot Web 应用程序(主要通过 REST 调用使用),我可以使用 mvn exec 运行它,它启动一个嵌入式 tomcat (8.5.11),或者构建一个 war 并将其部署到一个独立的 tomcat 中( Debian 股票 8.5.14-1~bpo8+1)。两者的配置方式相同,使用
令我们最惊讶的是,嵌入式 tomcat 在高负载下似乎要快得多(使用 jmeter 的 200 多个线程的小型测试序列)。以 600 个线程为例:
- 独立的 tomcat 的响应时间非常长,同时负载相对较低,为 50-70(服务器有 64 个内核,可以运行 128 个线程),并且 IO 使用率较低。
- 嵌入式tomcat的负载为150-200,响应时间更快,I/O使用率高(看来数据库是这里的限制因素,但它优雅降级:600线程导致慢到300的两倍线程)。
据说两个tomcat的配置是一样的,所以目前我为此很困扰。如果可以的话,我真的不想在生产环境中运行嵌入式 tomcat。
有没有人有想法:
- 造成这种性能差异的原因可能是什么,以及
- 我们如何可靠地比较两个 tomcat 的配置?
更新
我运行了一些测试,并在查看垃圾收集器日志后发现了一个显着差异:在 600 个 jmeter 线程中,嵌入式 tomcat 花费了大约 5% 的时间进行 GC,而独立的 tomcat 花费了大约 50% 的时间 GCing .我使用 awk 脚本计算了这些数字,因此它们可能有点被错误解析,但手动检查 GC 日志似乎可以证实它们。它仍然没有解释为什么其中一个一直在 GCing 而另一个没有......
另一个更新
我设法通过将垃圾收集器切换到 G1 来加速独立的 tomcat。现在,它使用大约 20% 的已用时间进行垃圾收集,并且任何单次 GC 运行都不会超过 1 秒。现在独立的 tomcat 只比嵌入式 tomcat 慢 20-30%。有趣的是,在嵌入式 tomcat 中使用 G1 对其性能没有实际影响,GC 开销仍然在 15% 左右。
这绝不是一个解决方案,但它有助于缩小两个 tomcat 之间的差距,因此现在问题不是那么严重。
【问题讨论】:
-
我认为你应该进一步研究它。您可以轻松找到很多关于嵌入式 tomcat 优缺点的信息。你真的应该考虑将它用于生产。
-
首先比较 server.xml 文件和 JVM 选项(它们应该在 setenv.sh 但它们可以在其他地方)
-
@EugèneAdell 嵌入式tomcat没有server.xml,是spring-boot配置的。我已经配置了相同的线程和连接数,但我不能说它们真的是一样的,因为我无法在线查询该信息:)。
-
@P.Péter JMX 激活了吗?
标签: spring performance tomcat