JTA 上下文中 Hibernate(Flush?)的缩放问题
Scaling issue with Hibernate (Flush?) in JTA Context
我们的应用程序(在数据库方面)由三部分组成。遗留部分使用 EJB,当前应用程序使用 hibernate/spring,第三方库使用 Mybatis。一个会话中的数据库操作由 JTA 协调。该应用程序配备了基本的 APM。
我们最近看到了一个非常奇怪的行为,但还无法重现和分析它:我们的应用程序通常在休眠模式下执行正常,但在这种情况下,应用程序所有部分的其他会话都有一些负载。在此事件期间,APM 报告在 EJB/Spring 部分执行事务的时间增加了十倍。我们看到那些执行 EJB/Spring 事务的线程大量使用 CPU,即使在事务中执行的实际代码很少。
经过分析我们了解到,这些监控的时间包括我们的业务代码以及Hibernate-Flush花费的时间。我们还看到了 entitymanager 中的元素数量与完成交易所花费的时间之间的相关性。
我们目前的怀疑是,出于某种原因,flush 是 运行 狂暴的。
有没有人见过这样的事情或者知道可能是什么原因?
答案完全在别处。我们偶然发现了 JDK7/CodeCache 错误,一旦 CodeCache 填满,它会导致 JIT 编译器完全停止编译任何内容。这导致大量代码在解释模式下执行,因此比预期慢很多。
这使得冲洗变慢并且看起来像作恶者。
如果您的应用程序出现奇怪的速度下降并且仍然是 运行 JDK7,请查看您的 CodeCache 内存区域。如果它已填充到 100%,然后突然下降到 ~50-66& 并且不再增长,那么你遇到了那个错误。
提示: 可以在此处找到更冗长的解释:
我们的应用程序(在数据库方面)由三部分组成。遗留部分使用 EJB,当前应用程序使用 hibernate/spring,第三方库使用 Mybatis。一个会话中的数据库操作由 JTA 协调。该应用程序配备了基本的 APM。
我们最近看到了一个非常奇怪的行为,但还无法重现和分析它:我们的应用程序通常在休眠模式下执行正常,但在这种情况下,应用程序所有部分的其他会话都有一些负载。在此事件期间,APM 报告在 EJB/Spring 部分执行事务的时间增加了十倍。我们看到那些执行 EJB/Spring 事务的线程大量使用 CPU,即使在事务中执行的实际代码很少。
经过分析我们了解到,这些监控的时间包括我们的业务代码以及Hibernate-Flush花费的时间。我们还看到了 entitymanager 中的元素数量与完成交易所花费的时间之间的相关性。
我们目前的怀疑是,出于某种原因,flush 是 运行 狂暴的。
有没有人见过这样的事情或者知道可能是什么原因?
答案完全在别处。我们偶然发现了 JDK7/CodeCache 错误,一旦 CodeCache 填满,它会导致 JIT 编译器完全停止编译任何内容。这导致大量代码在解释模式下执行,因此比预期慢很多。
这使得冲洗变慢并且看起来像作恶者。
如果您的应用程序出现奇怪的速度下降并且仍然是 运行 JDK7,请查看您的 CodeCache 内存区域。如果它已填充到 100%,然后突然下降到 ~50-66& 并且不再增长,那么你遇到了那个错误。
提示: 可以在此处找到更冗长的解释: