【问题标题】:Grails app is too slow to startupGrails 应用程序启动太慢
【发布时间】:2017-02-08 05:58:19
【问题描述】:

我正在使用 grails 2.4.4 开发 Web 应用程序,而 Grails(使用 jetty 插件)大约需要 20 秒来初始化应用程序并使应用程序可用。

我可以接受这个相当长的时间,但旧硬件启动整个过程需要 3 分钟,我需要它更快,因为一旦服务器启动,性能就很好,不用担心。

p>

在 SO 中搜索发现 jar 扫描 servlet 注释可能是问题,并为 WEB-INF/lib 中的类禁用它并将其添加到应用程序上下文 xml:

<Call name="setAttribute">
    <Arg>org.eclipse.jetty.server.webapp.WebInfIncludeJarPattern</Arg>
    <Arg>nothing.jar$</Arg>
</Call>

这有助于将时间从 16 秒缩短到 13 秒。 还尝试使用配置的 servlet 2.5 而不是 3.0(并移至 jetty 7)进行构建,以尝试进一步改进这一点,因为注释扫描是 servlet 3.0 的一项功能,但速度提升很小(大约 1 秒)。

我的目标是将这个时间缩短到 6 秒,因为在我测试过的最旧的硬件中,它大约需要 3 分钟,所以它慢了大约 10 倍,而且 1 分钟的启动时间在某种程度上是可以容忍的。

我对如何实现这一点有点迷茫。查看日志发现上下文初始化大约需要 2000 毫秒

2017-02-08 02:15:08,318 [main] INFO context.ContextLoader - Root WebApplicatio nContext:初始化在 2001 毫秒内完成

有没有办法加快这个速度?

【问题讨论】:

    标签: hibernate grails jetty grails-orm


    【解决方案1】:

    如果您使用的是 Jetty 9.x,那么知道类路径/字节码扫描是必需的,因为它实现了 Servlet 3.1(需要它)。

    使用org.eclipse.jetty.server.webapp.WebInfIncludeJarPattern 只会跳过WEB-INF/lib 中的那些jar,但仍会扫描您的容器类路径(意味着活动grails 环境中的所有内容)。

    注意:您永远不应该从构建工具(maven、grails 等)中踢出生产服务器,因为这会带来巨大的性能和安全风险。

    无法通过更换 servlet 支持 jar 来更改扫描行为(事实上,您不能将 Servlet 2.5 jar 与 Jetty 一起使用,它会彻底失败)。您实际使用 Servlet 2.5 jar 交换所做的是更改应用程序的支持级别,而不是 Jetty 中的行为。

    但一切都没有丢失,您可以“预先计算”扫描要求并使用 Jetty 9 的 quickstart features 启动您的应用程序,为其提供所需的内容,避免每次启动时重复扫描。

    云提供商大量使用快速启动技术来实现网络应用程序的近乎瞬时启动(通常低于 500 毫秒)。

    注意:如果您使用的是 hibernate、spring、cdi 或其他具有自己注解的库,则该库通常会执行另一个字节码扫描步骤,而不是 Jetty。

    【讨论】:

    • 您好,感谢您的回答。当我更改 Servlet jar 时,我也将我的应用程序移到了 jetty 7,但我忘了提及这一点。我也尝试过使用 jetty 9 quickstart,但是 webapp 是第一次加载,当我重新启动 jetty 时,它失败了,出现 URI 不是分层错误。
    • 我可以让码头快速启动工作,所以现在启动时间已经下降到 10 秒。我现在会解决这个问题。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-19
    • 2010-11-08
    • 2018-02-20
    • 1970-01-01
    相关资源
    最近更新 更多