JBoss EAP 6.1 的 Infinispan 超时异常

Posted

技术标签:

【中文标题】JBoss EAP 6.1 的 Infinispan 超时异常【英文标题】:Infinispan Timeout Exception with JBoss EAP 6.1 【发布时间】:2021-01-28 18:18:19 【问题描述】:

这个让我发疯。我正进入(状态 随机点出现这样的异常:

ISPN000136: Execution error: org.infinispan.util.concurrent.TimeoutException: Unable to acquire lock after [60 seconds] on key [com.acme.entity.EntityA#9073] for requestor [GlobalTransaction:<null>:9593:local]! Lock held by [GlobalTransaction:<null>:9580:local]

设置相当陈旧:JBoss EAP 6.1 和 Infinispan 5.2.6 用于二级缓存。 可以有多个 JBoss 服务器作为独立实例运行(未配置为集群),但它们使用 SQLProxy 和 percona mysql 集群。 (但是我们在同一台服务器上的一个数据库的单个 JBoss 实例上看到了同样的问题)。

standalone.xml中的配置目前是这样的:

  <subsystem xmlns="urn:jboss:domain:infinispan:1.5">
            <cache-container name="web" aliases="standard-session-cache" default-cache="local-web" module="org.jboss.as.clustering.web.infinispan">
                <local-cache name="local-web" batching="true">
                    <file-store passivation="false" purge="false"/>
                </local-cache>
            </cache-container>
            <cache-container name="hibernate" default-cache="local-query" module="org.jboss.as.jpa.hibernate:4">
                <local-cache name="entity">
                    <locking isolation="READ_COMMITTED" acquire-timeout="60000"/>
                    <transaction mode="NON_XA"/>
                    <eviction strategy="LRU" max-entries="10000"/>
                    <expiration max-idle="100000"/>
                </local-cache>
                <local-cache name="local-query">
                    <locking isolation="READ_COMMITTED" acquire-timeout="60000"/>
                    <transaction mode="NONE"/>
                    <eviction strategy="LRU" max-entries="10000"/>
                    <expiration max-idle="100000"/>
                </local-cache>
                <local-cache name="timestamps">
                    <transaction mode="NONE"/>
                    <eviction strategy="NONE"/>
                </local-cache>
            </cache-container>
        </subsystem>

我们尝试了不同的超时值,但均未成功。我们最近将隔离从默认的 REPEATABLE_READ(在 JBoss 6.1 中)更改为 READ_COMMITTED(这似乎是 Infinispan 5.2.6 的默认值,并在 WildFly 9 中更改为默认值)另见https://developer.jboss.org/thread/243458。 我希望这能解决问题,但我们仍然看到这些超时异常。

对于使用二级缓存的实体,我们在实体上使用它:

@Cache(usage = CacheConcurrencyStrategy.TRANSACTIONAL,region="cache.StandardEntity")
public class EntityA

在我们的 infinispan.xml 文件中,我们有:

 <namedCache name="Acme.cache.StandardEntity">
      <eviction strategy="LRU" maxEntries="1000"/>
      <expiration maxIdle="3600" lifespan="3600" wakeUpInterval="7200000"/>
   </namedCache>

infispan.xml 文件是几年前我们从 EH 缓存迁移时由一个工具创建的。 wakeUpInterval 看起来相当高。这会是个问题吗? 我实际上不确定 namedCache 是否配置正确。它是否需要以 Acme 为前缀(在这种情况下是应用程序的名称?)。我如何测试这些命名的缓存是否被实际使用。我对standalone.xml文件中需要配置什么以及infinispan.xml文件中需要配置什么感到有些困惑。

配置中是否还有我可以尝试解决此问题的内容?

如果不是,我怎么知道谁“锁了门”(获得了锁)。我可以看到线程试图打开门(试图获取锁)和抱怨(抛出异常),但我看不到谁首先锁定了它。如果我能看到谁拿着锁这么久,我也许可以修好它。

我可以在本地为此启用日志记录

 <logger category="org.infinispan.util.concurrent.locks">
                <level name="TRACE"/>
 </logger>

但我不能在生产中真正做到这一点(太多的日志记录)。但是在本地我无法复制它。还有其他想法如何找出哪个线程获得了锁吗?

感谢任何想法。

谢谢!

【问题讨论】:

【参考方案1】:

您的锁似乎有并发访问问题。我建议悲观锁定来避免这个问题,它增加了资源,但它有助于这些情况:

/subsystem=infinispan/cache-container=web/local-cache=persistent/transaction=TRANSACTION/:add(locking=PESSMISTIC)

关于infinispan.xml:此文件仅适用于 Red Hat Data GRid (JDG, RHDG) 嵌入式模式(或社区 Infinispan 版本)。对于 EAP 6.1,您需要使用 standalone-hastandalone-full-ha 配置文件来设置缓存属性。

【讨论】:

悲观锁定不会让情况变得更糟吗?它不会改变多个线程试图获取锁的事实,但如果我理解正确,吞吐量会更糟。那么你能解释一下为什么这会改善它吗?谢谢

以上是关于JBoss EAP 6.1 的 Infinispan 超时异常的主要内容,如果未能解决你的问题,请参考以下文章

JBoss EAP 6.1 的 Infinispan 超时异常

如何在 JBoss EAP 6.1 中设置 http 头文件

JBoss EAP 6.1 上的 Atmosphere 和 WebSocket

JBoss EAP 6.1+ 上的 JDBC 模块

无法将 Jvisual Vm 与 Jboss EAP 6.1 集成

jboss eap-6.1 无法处理部署“education.war”的阶段 POST_MODULE