偶尔使用WSO2 BPS 3.6.0我们遇到了OutOfMemoryError并且服务器已停止。在堆分析之后我们怀疑:
我们有一些流程会定期查找某些信息(使用Web服务),直到业务项状态未更改为止。一段时间后,一些流程实例可能有很多事件(数千,大约10k)。当试图在碳控制台中查看实例信息时,加载的数据(实例活动)能够导致OutOfMemoryError并丢弃服务器(具有6GB RAM):(
作为解决方法 - 我们使用数据库查找:
select ode_event.event_id, ode_event.detail, ode_event.tstamp, ode_event.type,
ode_event.instance_id, ode_event.process_id,
ode_scope.scope_name
from ode_event, ode_scope where ode_event.instance_id=18204 and
(ode_event.scope_id = ode_scope.scope_id);
虽然我们考虑让任何业务用户(甚至进程所有者)直接访问数据库的想法非常糟糕。
是否有(更好的)方式/查询来查看活动?哪个是正确的github项目来放置改进/功能(加载分页的活动)?
编辑:
看到源代码这个“行为”继承自Apache-ODE实现(急切地将整个范围和事件列表加载到内存中)
答案 0 :(得分:0)
这是当前的行为。我们可以通过添加分页来改进它。但这就是原因,没有优先考虑。
如果检查单个数据库表大小,您将看到事件表占用了大部分空间。这是因为,默认情况下启用了流程调试级别事件,它会生成大量事件。这些事件在开发时很有用,但是在生产时,您必须禁用它们。否则,您将浪费生产资源(CPS,内存,数据库空间)。它会影响整个BPS引擎的性能。
以下是一些一般性建议。
如果您有更大和更长的运行过程,建议仅为您需要监视的选定范围启用事件。 (如果你没有,那就更好。:))
此外,您还需要不断清理数据库中的旧数据。 (只是谷歌BPS文档的脚本)否则你的DBA会抱怨DB没有足够的空间在不久的将来运行。 :)
流程执行不需要事件。所以你可以清理它。在您的方案中,清除活动BPEL流程的OLD事件是否可以?例如:清洁事件超过1/2/7 ..天。 ?。这将在一定程度上解决您的问题。