日志警告:检测到线程饥饿或时钟跳跃(管家delta=springHikariConnectionPool)

问题描述 投票:0回答:8

我正在使用 HikariCP 2.4.6,在 Tomcat 8 启动时,我收到一条警告消息:

01-Aug-2016 11:18:01.599 INFO [RMI TCP Connection(4)-127.0.0.1] org.apache.catalina.core.ApplicationContext.log Initializing Spring FrameworkServlet 'Spring MVC Dispatcher Servlet'
[2016-08-01 11:18:01,654] Artifact blueberry:war exploded: Artifact is deployed successfully
[2016-08-01 11:18:01,655] Artifact blueberry:war exploded: Deploy took 33,985 milliseconds
Aug 01 2016 11:26:52.802 AM [DEV] (HikariPool.java:614)
WARN : com.zaxxer.hikari.pool.HikariPool - 9m13s102ms - Thread starvation or clock leap detected (housekeeper delta=springHikariConnectionPool).

我没有看到任何其他错误或从数据库读取/写入的问题。这有什么值得担心的吗?我试着四处寻找,但没有运气。

我们还在 MySQL 5 上使用 Hibernate 4.3.8.Final 和 Spring 4.1.0.RELEASE 的 MySQL 5.1.39 连接器。我们正在努力升级到 Hibernate 5,看看这是否会消失,但不知道这是否重要。

hikaricp
8个回答
126
投票

另一个原因是,如果您在本地运行该应用程序并且计算机进入睡眠状态,就会发生这种情况。在这种情况下,您不需要做任何明智的配置。


96
投票

有一个很好的rundown为什么时钟跳跃检测可能合法发生。引用 Brett Woolridge 的外部链接:

这在管家线程上运行,每 30 秒执行一次。如果您使用的是 Mac OS X,则 clockSource 是 System.currentTimeMillis(),时钟源所在的任何其他平台 系统.nanoTime()。理论上两者都是单调递增的,但是 各种各样的事情都会影响它,例如 NTP 服务器。大多数操作系统是 旨在处理向后的 NTP 时间调整以保持 时间向前流动的错觉。

这段代码是说,如果时间倒退(现在< previous), or if time has "jumped forward" more than two housekeeping periods (more than 60 seconds), then something strange is likely going on.

可能会发生几件事:

  1. 您可能在虚拟容器(VMWare、AWS 等)中运行,由于某种原因,该容器在维护方面做得特别差 时间向前流动的错觉。

  2. 因为在管家线程中发生了其他事情——具体来说,关闭空闲连接——有可能对于一些 关闭连接的原因是阻塞管家线程更多 超过两个管理周期(60 秒)。

  3. 服务器太忙了,所有 CPU 都挂了,线程饥饿正在发生,这阻止了管家线程运行 超过两个管家期。

考虑到这些,也许你可以提供额外的上下文。

编辑:请注意,这是基于 HikariCP 2.4.1 代码。确保你 正在运行可用的最新版本。

(貌似在最新代码的警告声明中更新了参数。)


10
投票

发生这种情况的另一个原因是由于过多的垃圾收集,当垃圾收集在管家线程的两次执行中运行了更长的时间,试图释放一些内存(例如,恰好在应用程序线程正在运行“选择”查询)。由于 GC 阻塞了所有应用程序线程,包括管家线程,因此我怀疑时钟因此而“跳跃”。


7
投票

我在 AWS T2 micro 1GB RAM 实例中的 Spring Boot MySQL 工作中遇到了这个问题。经过一个小时的努力,没有任何进展,观察到 CPU 使用率接近 100%。然后我制作了具有 4 GB RAM 和 2 个 vCPU 的实例 T2 介质。之后我就没问题了


5
投票

我遇到这个问题是因为实体的

hashCode
方法中存在无限循环。

两个实体有

OneToMany
关系,我正在使用lombok
@Data
注释,它通过为每个导致无限循环的属性调用
equals
方法来生成
hashcode
hashCode()
实现本身。


4
投票

当我在 Linux 机器上运行带有微服务的 spring boot 应用程序时,我遇到了同样的问题。经过一番调查发现,服务器只有8GB内存。将内存 (RAM) 增加到 16GB 解决了我的问题。


0
投票

如果这发生在你的 spring-boot 应用程序开始时

org.springframework.data.repository.config.RepositoryConfigurationDelegate : 
Bootstrapping Spring Data JPA repositories in DEFERRED mode.

然后使用以下程序参数运行您的应用程序

--spring.data.jpa.repositories.bootstrap_mode=default

0
投票

我停止所有服务并重新启动也解决了问题。

© www.soinside.com 2019 - 2024. All rights reserved.