我有一个spring-boot Web应用程序(主要通过REST调用使用),我可以使用启动嵌入式tomcat(8.5.11)的mvn exec
运行,或者构建一个war并将其部署到一个独立的tomcat(debian股票8.5.14-1~bpo8 + 1)。两者都以相同的方式配置,使用
令我们极为惊讶的是,对于高负载(使用jmeter的200+线程的小测试序列),嵌入式tomcat似乎要快得多。在600个线程中,例如:
据说两个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%左右。
这绝不是一个解决方案,但它有助于缩小两只雄猫之间的差距,因此现在问题并不那么重要。
答案 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。