【问题标题】:web application runs much faster in embedded tomcat than in standalone tomcatWeb 应用程序在嵌入式 tomcat 中的运行速度比在独立 tomcat 中快得多
【发布时间】: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


【解决方案1】:

检查独立 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 或类似工具检查正在运行的 VM。

【讨论】:

  • Java 堆大小被明确设置为相同(32g)。我会尝试为独立的tomcat提升它,因为它可能会为自己保留一些内存,而不像嵌入式的那样
  • 如果我给独立的tomcat 64g堆,GC百分比下降到45%。这不是一个很大的改进,这可能只是一个测量错误。 :(
  • 您是否尝试过使用 jVisualVm 监控已使用的堆?您是否在使用嵌入式和独立 tomcat 时都达到了 32Gb 堆限制?
  • 我没有使用 jVisualVm,​​但我确实有一个显示当前内存消耗的状态页面。这表明,即使是 60g,独立的 Tomcat 也需要 5 分钟左右的时间来填充,嵌入式 Tomcat 的情况也差不多。当然,GC 会定期释放它,但嵌入式 tomcat 使用的时间要少得多。
猜你喜欢
  • 2019-03-13
  • 2018-02-03
  • 2017-05-07
  • 1970-01-01
  • 2018-05-13
  • 2012-08-04
  • 2011-06-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多