嵌入式tomcat中的Web应用程序运行速度比独立tomcat

时间:2018-04-24 10:49:11

标签: spring performance tomcat

我有一个spring-boot Web应用程序(主要通过REST调用使用),我可以使用启动嵌入式tomcat(8.5.11)的mvn exec运行,或者构建一个war并将其部署到一个独立的tomcat(debian股票8.5.14-1~bpo8 + 1)。两者都以相同的方式配置,使用

令我们极为惊讶的是,对于高负载(使用jmeter的200+线程的小测试序列),嵌入式tomcat似乎要快得多。在600个线程中,例如:

  • 独立的tomcat具有非常大的响应时间,而负载相对较低,为50-70(服务器有64个内核,可以运行128个线程),并且IO使用率很低。
  • 嵌入式tomcat的负载为150-200,响应时间更快,I / O使用率更高(这似乎是数据库的限制因素,但它会优雅地降级:600个线程导致速度减慢300倍线程)。

据说两个tomcats的配置相同,所以目前我很困扰因为这个。如果我能帮忙的话,我真的不想在生产中运行嵌入式tomcat。

有没有人有想法:

  • 这种表现差异的原因可能是什么,
  • 我们如何可靠地比较两只雄猫的配置?

更新

在查看垃圾收集器日志之后,我运行了一些测试并发现了一个显着的差异:使用600个jmeter线程,嵌入式tomcat花费了大约5%的时间GCing,而独立的tomcat花费了大约50%的时间GCing 。我使用awk脚本计算了这些数字,因此它们可能有点误解,但手动检查GC日志似乎证实了它们。它仍然没有解释为什么其中一个是GCing一直是GCing而另一个不是......

再次更新

我设法通过将垃圾收集器切换到G1来加速独立的tomcat。现在,它使用大约20%的已用时间进行垃圾收集,并且对于任何单个GC运行都不会超过1秒。现在,独立的tomcat比嵌入式tomcat慢20-30%。有趣的是,在嵌入式tomcat中使用G1对其性能没有实际影响,那里的GC开销仍然在15%左右。

这绝不是一个解决方案,但它有助于缩小两只雄猫之间的差距,因此现在问题并不那么重要。

1 个答案:

答案 0 :(得分:0)

检查独立Tomcat和spring引导应用程序的内存参数,尤其是java堆大小。

我的猜测是你的独立Tomcat在启动脚本中设置了Xmx的值(catalina.sh和/或setenv.sh),例如1 Gb,这比你的Spring Boot应用程序使用的要低得多

如果您没有在Spring启动应用程序的命令行中为Xmx指定值,则默认为物理内存的25%。如果你的服务器有16 Gb的RAM,那将是4Gb ......

我建议在确保使用相同的JVM参数(Xms,Xmx,各种GC选项......)后再次运行测试。如果不确定,请使用jVisualVm或类似工具检查正在运行的VM。