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



我使用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,看看是否会消失,但不知道这是否重要。

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

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

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

这个代码是说,如果时间向后移动(现在<以前),或者如果时间已经"向前跳跃"了两个以上的内务管理周期(更多超过60秒),那么可能会发生一些奇怪的事情

可能会发生以下几件事:

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

  2. 因为管家线程中发生了其他事情,特别是关闭空闲连接,所以对于一些关闭连接阻塞管家线程的原因超过两个内务处理周期(60秒)。

  3. 服务器太忙了,所有的CPU都被固定住了,导致线程不足,这阻碍了管家线程的运行超过两个内务管理期。

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

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

(看起来参数也在最新代码中的警告语句中进行了更新。)

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

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

我遇到这个问题是因为实体的hashCode方法中有一个无限循环。

两个实体具有OneToMany关系,我使用lombok @Data注释,该注释通过为导致无限循环的每个属性调用hashCode()方法来生成equalshashcode实现本身。

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

如果这发生在春季启动应用程序的开始

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

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

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

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

最新更新