AIX 上生产环境中缓慢的动态 GSP 重新加载

Posted

技术标签:

【中文标题】AIX 上生产环境中缓慢的动态 GSP 重新加载【英文标题】:Slow Dynamic GSP Reloading in Production on AIX 【发布时间】:2013-08-01 03:43:45 【问题描述】:

我们使用 Grails 2.2.4、WebSphere 8.0.0.5 都在 AIX 6.1.0.0 上运行。 Websphere 正在使用 IBM JDK:

Java(TM) SE 运行时环境(构建 pap6460_26sr3ifix-20121005_02(SR3+IV27268+IV27928+IV28217+IV25699))

IBM J9 VM(内部版本 2.6,JRE 1.6.0 AIX ppc64-64 20120919_122629(启用 JIT,启用 AOT)

J9VM - R26_Java626_SR3_iFix_1_20120919_1316_B122629

JIT - r11.b01_20120808_24925ifx1

GC - R26_Java626_SR3_iFix_1_20120919_1316_B122629 J9CL - 20120919_122629)

JCL - 20120713_01

问题在于使用:

grails.gsp.enable.reload = true
grails.gsp.view.dir="/path/to/gsp/views"

很慢,我的意思是要花 20 秒来渲染一个小的 GSP。有趣的是,在我们的本地开发环境中,这需要 2 秒。

我们已经通过让控制器在模型中没有任何内容的空白 GSP 上调用 render(..) 来隔离这个问题,所以我只能假设它是编译,但我可能错了。

有没有人遇到过渲染 GSP 非常慢的其他实例,或者有任何建议,也许是 AIX 上某种奇怪的 JDK 问题?

除了赏金之外,回答正确的人将获得免费华夫饼。

编辑前几天刚刚注意到这一点:三个环境具有相同的 WAS 配置和设置,其中一个工作正常,因此肯定是某种环境问题。

【问题讨论】:

您可以尝试对 /path/to/gsp/views 进行 dd 测试吗? 本地开发环境,是本地WAS环境还是grails内嵌Tomcat? 我怀疑你已经看过记忆角度了,但我在记忆压力下也遇到过类似的怪事。这里有一个冗长的,可能相关的讨论:grails.1312388.n4.nabble.com/… 特别是 Graeme 在 2013 年 3 月 5 日的回复;上午 5 点 48 分 我确实尝试过 dd。 @dmahapatro 它是在 grails 中嵌入 Tomcat。 【参考方案1】:

我同意您对编译时间的怀疑。也许您的 grails.gsp.view.dir 很慢 - 也许是网络文件系统?

不幸的是,真正的答案是不要在生产中启用 GSP 重新加载。 这显然是为了方便开发,而不是为了在生产中表现良好。

【讨论】:

不幸的是,我们别无选择,因为要求是允许人们随时更改它。 听起来你需要一个 CMS 您可以尝试使用相同的启用重新加载但只使用 tomcat 运行吗?我猜这是与 WAS 相关的问题 我们实际上正在使用 CMS。它的工作方式(这不是我们的设计)是当有人在 CMS 中发布更改时,它会替换 GSP,因此需要重新加载。 GSP 上有可以使用的标记库。 @JavaDev 有 3 个独立的 AIX 环境,其中一个实际上速度很快,并且具有相同的 WAS 设置和配置,因此肯定与环境有关。【参考方案2】:

确保站点网格正在被预处理

grails.views.gsp.sitemesh.preprocess=true

我也怀疑这是锁定问题而不是编译问题。

为了至少减少这个问题,请设置以下配置

grails.gsp.reload.interval= time in milliseconds.

取决于您的舒适度。也许每小时?

如果您的文件更改上次修改时间过快,您需要将粒度降低

grails.gsp.reload.granularity= Time in milliseconds. 

限制被重新加载的类的数量

grails.reload.excludes 

grails.reload.includes

还要记住视图路径必须以斜线结尾。我在您提供的示例中没有看到。

【讨论】:

【参考方案3】:

虽然我无法告诉您问题的原因是什么,但我可以为您指出一个可以帮助您调查性能问题的工具。

Grails Miniprofiler 插件是一个出色的工具,用于检查端到端的性能,一直到视图(这是您认为问题所在)。

在我的一个项目的一些 GSP 上,我惊讶地发现某些视图在 SQL 调用方面变得如此沉重(通过延迟加载)。

您可能怀疑问题出在哪里,并且您可能在该特定平台上遇到了一个晦涩难懂的错误,但是用硬数字指出瓶颈非常有用。

不管怎样,我在我的任何操作系统/环境中都没有看到您描述的问题。但我确实记得在尝试部署到 JBoss 6.1 时遇到了严重的痛苦(自已解决),所以我对 Grails 在某些环境中可能出现问题的想法很敏感。

祝你好运……

Grails Miniprofiler plugin

【讨论】:

【参考方案4】:

我们在尝试在 Gsp 页面上呈现 Birt 报告的应用程序上遇到了同样的问题(在产品服务器上需要 5 分钟,我们使用了 Tomcat 和 mysql),没有回答,但建议您可能需要使用grails缓存插件,可以根据你的需求缓存gsp页面。

grails.org/plugin/cache‎

【讨论】:

【参考方案5】:

原来问题是https://plugins.grails.org/plugin/sergiomichels/grails-melody-plugin。谁知道!

【讨论】:

以上是关于AIX 上生产环境中缓慢的动态 GSP 重新加载的主要内容,如果未能解决你的问题,请参考以下文章

线上生产环境部署Djngao+Nginx+Uwsgi

42 线上生产环境的RocketMQ集群进行消息轨迹的追踪

线上生产环境同步时间服务器时报错the NTP socket is in use, exiting

TFS线上生成环境发布历程

git开发部署流程

一次JVM FullGC的背后,竟隐藏着惊心动魄的线上生产事故!石杉的架构笔记