2

我在这里有一个关于在 XPages 中提高我的 30gb 工作流应用程序性能的问题。有很多建议,但大多数都涉及回收、改进代码等,而实际上解决速度问题的方法却很少被谈论 - 应用程序属性中的高级选项卡(请参阅我的上一篇文章)

现在我有一个运行得很好的应用程序,它速度很快,人们很高兴,但服务器仍然会定期崩溃。或者我应该说,HTTP 变得无响应并且在极端情况下运行 100% CPU,因此 Domino 也很缓慢但仍在运行。

我一直在监视 HTTP 线程

告诉 http 显示线程状态

在大多数情况下,我看到 80 个空闲的 http 线程,或者正在做某事但很快就释放了。自从上次更新应用程序以来,我们更专注于回收 SSJS 中的笔记对象,我认为我们会看到挂起的 http 线程结束,但它仍然存在。

我几乎可以肯定,这不是导致此问题的无限循环,因为我与最终用户确认的 2 个案例完全不同,据我所知没有循环。

  1. 用户正在编辑文档,按下工作流按钮以批准并将其发送给下一个用户。他们正在使用 Chrome。chrome 选项卡上的旋转圆圈开始,然后服务器应该运行工作流代理,发送电子邮件,然后关闭浏览器上的页面。我注意到一个小时后有 2 或 3 个挂起的 http 线程尚未释放,所以我联系了用户,她告诉我页面没有刷新,但旋转的圆圈仍在 chrome 中旋转,表明服务器正在做某事. 我检查了日志,工作流代理已运行,电子邮件已发送,文档已更新。她刷新了页面,现在可以看到它已更新,但无论出于何种原因,Chrome 都耐心地坐在那里等待,从未收到 LS 代理已运行的消息。我使用notesAgent。runOnServer 并返回结果整数以确认代理是否已运行。如果它返回 1(我认为)那么页面应该关闭,否则它应该显示一条消息。该页面从未刷新,因此它没有显示任何内容,但代理确实完成了。

  2. 一个用户在晚上结束了大约 15 个挂起的 http 线程。在日志中,我可以看到她多次尝试重新加载页面。然后搜索她想要的文档,然后尝试打开它。当我检查她说她搜索了文档时,搜索页面显示了结果(在重复控件中),每次她单击文档打开它时都没有发生任何事情。所以她甚至没有进入文件,但每次尝试后线程都挂了。我从笔记日志中获取了 URL 并尝试了它,文档打开正常。我进行了相同的搜索,文档打开正常。我直接向她发送了一个指向该文档的链接,它对她来说打开得很好。诡异的!!

有什么方法可以诊断这种行为,因为现在我必须让 domino 管理员打开运行 tell http show.... 命令整天密切关注它以确保线程没有挂起。通常到了午餐时间,服务器需要重新启动,这很垃圾。

请帮助我的理智:-)

4

3 回答 3

1

我使用了一些 Java 转储来分析它们是否存在内存泄漏,虽然我在那里发现了大量信息,但不知道我在寻找什么意味着我没有找到任何结论。

纯粹是偶然的,我需要处理系统中随机导致这些线程锁定的文档,并且我手动运行了在处理这些文档时调用的 Workflow 代理。我花了一分钟才意识到发生了什么,但代理在尝试根据文档内容生成 mime 电子邮件时似乎陷入了循环。

当计划的代理在 Domino 中陷入无限循环时,只需查看 Admin Client 中的代理管理器即可轻松发现。你会看到它不断地消耗 CPU 并且永远不会完成。

但是,当 XPage 调用一个卡住的代理时,没有任何线索(至少在我的情况下)代理管理器正在运行,并且 HTTP 服务器任务没有显示它正在做任何不寻常的事情。这就是为什么我最初认为没有无限循环,但我完全错了!

我添加了一些代码来计算在 mime 电子邮件生成器例程中已达到的循环数,并在它达到某个任意高的值时添加一个中断,表明它被困在一个循环中。瞧!不再挂起 http 线程!

这是检查整个系统并修复其中的一些旧(不良)代码并整理所有内容的好借口。最终,尽管是代理而不是导致问题的 xpage。不过还是谢谢大家的建议。

于 2015-01-06T15:07:43.443 回答
1

寻找锁定的线程。正如我之前所说,获取更多信息 - 在您的情况下 javadumps 会有所帮助。发出服务器命令tell http dump java core(当 http 被冻结时,浏览器中的按钮将无济于事:-))。这会生成 javacore 文件并使用IBM Thread and Monitor Dump Analyzer for Java查看每个线程的状态。

您将(可能)发现的是线程等待一些 Notes API 调用。请发布挂起线程的示例堆栈跟踪。

于 2014-05-28T11:14:29.900 回答
0

我强烈推荐两个操作:

  • 将您的代理转换为 Java 库。这比听起来的工作要少,并且可以使您免于每次都启动代理运行时(挂起的潜在来源)
  • 如果这还不够,请使用线程,因为您需要重新考虑通知机制,所以工作量更大

并使用 Frantisek 的见解

于 2014-05-29T00:27:44.223 回答