gpt4 book ai didi

spring - Web 应用程序在嵌入式 tomcat 中的运行速度比在独立 tomcat 中快得多

转载 作者:行者123 更新时间:2023-11-28 22:25:00 33 4
gpt4 key购买 nike

我有一个 spring-boot web 应用程序(主要通过 REST 调用使用),我可以使用启动嵌入式 tomcat (8.5.11) 的 mvn exec 运行它,或者构建一个 war 并部署它成为一个独立的 tomcat (debian stock 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% 的时间进行 GC .我用 awk 脚本计算了这些数字,因此它们可能有点被错误解析,但手动检查 GC 日志似乎证实了它们。它仍然没有解释为什么其中一个一直在进行 GC 而另一个不是......

再更新一次

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

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

最佳答案

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

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

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

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

关于spring - Web 应用程序在嵌入式 tomcat 中的运行速度比在独立 tomcat 中快得多,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49999798/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com