【问题标题】:Vertx thread blocked warningsVertx 线程阻塞警告
【发布时间】:2017-12-08 05:54:05
【问题描述】:

我在 ubuntu 服务器上运行一个 vert.x 应用程序。它有一个在端口 3000 上运行的 HTTPServer。应用程序运行良好,但有时我会看到以下警告:

Dec 08, 2017 1:23:43 AM io.vertx.core.impl.BlockedThreadChecker
WARNING: Thread Thread[vert.x-worker-thread-2,5,main] has been blocked for 138013 ms, time limit is 60000
io.vertx.core.VertxException: Thread blocked
    at java.io.FileInputStream.readBytes(Native Method)
    at java.io.FileInputStream.read(FileInputStream.java:255)
    at sun.security.provider.NativePRNG$RandomIO.readFully(NativePRNG.java:424)
    at sun.security.provider.NativePRNG$RandomIO.implGenerateSeed(NativePRNG.java:441)
    at sun.security.provider.NativePRNG$RandomIO.access$500(NativePRNG.java:331)
    at sun.security.provider.NativePRNG.engineGenerateSeed(NativePRNG.java:226)
    at java.security.SecureRandom.generateSeed(SecureRandom.java:533)
    at io.vertx.ext.auth.PRNG.lambda$null$0(PRNG.java:78)
    at io.vertx.ext.auth.PRNG$$Lambda$204/767088095.handle(Unknown Source)
    at io.vertx.core.impl.ContextImpl.lambda$executeBlocking$1(ContextImpl.java:271)
    at io.vertx.core.impl.ContextImpl$$Lambda$206/1202956360.run(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    at java.lang.Thread.run(Thread.java:748)

Dec 08, 2017 1:23:44 AM io.vertx.core.impl.BlockedThreadChecker
WARNING: Thread Thread[vert.x-worker-thread-2,5,main] has been blocked for 139014 ms, time limit is 60000
io.vertx.core.VertxException: Thread blocked
    at java.io.FileInputStream.readBytes(Native Method)
    at java.io.FileInputStream.read(FileInputStream.java:255)
    at sun.security.provider.NativePRNG$RandomIO.readFully(NativePRNG.java:424)
    at sun.security.provider.NativePRNG$RandomIO.implGenerateSeed(NativePRNG.java:441)
    at sun.security.provider.NativePRNG$RandomIO.access$500(NativePRNG.java:331)
    at sun.security.provider.NativePRNG.engineGenerateSeed(NativePRNG.java:226)
    at java.security.SecureRandom.generateSeed(SecureRandom.java:533)
    at io.vertx.ext.auth.PRNG.lambda$null$0(PRNG.java:78)
    at io.vertx.ext.auth.PRNG$$Lambda$204/767088095.handle(Unknown Source)
    at io.vertx.core.impl.ContextImpl.lambda$executeBlocking$1(ContextImpl.java:271)
    at io.vertx.core.impl.ContextImpl$$Lambda$206/1202956360.run(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    at java.lang.Thread.run(Thread.java:748)

Dec 08, 2017 1:23:45 AM io.vertx.core.impl.BlockedThreadChecker
WARNING: Thread Thread[vert.x-worker-thread-2,5,main] has been blocked for 140013 ms, time limit is 60000
io.vertx.core.VertxException: Thread blocked
    at java.io.FileInputStream.readBytes(Native Method)
    at java.io.FileInputStream.read(FileInputStream.java:255)
    at sun.security.provider.NativePRNG$RandomIO.readFully(NativePRNG.java:424)
    at sun.security.provider.NativePRNG$RandomIO.implGenerateSeed(NativePRNG.java:441)
    at sun.security.provider.NativePRNG$RandomIO.access$500(NativePRNG.java:331)
    at sun.security.provider.NativePRNG.engineGenerateSeed(NativePRNG.java:226)
    at java.security.SecureRandom.generateSeed(SecureRandom.java:533)
    at io.vertx.ext.auth.PRNG.lambda$null$0(PRNG.java:78)
    at io.vertx.ext.auth.PRNG$$Lambda$204/767088095.handle(Unknown Source)
    at io.vertx.core.impl.ContextImpl.lambda$executeBlocking$1(ContextImpl.java:271)
    at io.vertx.core.impl.ContextImpl$$Lambda$206/1202956360.run(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    at java.lang.Thread.run(Thread.java:748)

Dec 08, 2017 1:23:46 AM io.vertx.core.impl.BlockedThreadChecker
WARNING: Thread Thread[vert.x-worker-thread-2,5,main] has been blocked for 141013 ms, time limit is 60000
io.vertx.core.VertxException: Thread blocked
    at java.io.FileInputStream.readBytes(Native Method)
    at java.io.FileInputStream.read(FileInputStream.java:255)
    at sun.security.provider.NativePRNG$RandomIO.readFully(NativePRNG.java:424)
    at sun.security.provider.NativePRNG$RandomIO.implGenerateSeed(NativePRNG.java:441)
    at sun.security.provider.NativePRNG$RandomIO.access$500(NativePRNG.java:331)
    at sun.security.provider.NativePRNG.engineGenerateSeed(NativePRNG.java:226)
    at java.security.SecureRandom.generateSeed(SecureRandom.java:533)
    at io.vertx.ext.auth.PRNG.lambda$null$0(PRNG.java:78)
    at io.vertx.ext.auth.PRNG$$Lambda$204/767088095.handle(Unknown Source)
    at io.vertx.core.impl.ContextImpl.lambda$executeBlocking$1(ContextImpl.java:271)
    at io.vertx.core.impl.ContextImpl$$Lambda$206/1202956360.run(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    at java.lang.Thread.run(Thread.java:748)

Dec 08, 2017 1:23:47 AM io.vertx.core.impl.BlockedThreadChecker
WARNING: Thread Thread[vert.x-worker-thread-2,5,main] has been blocked for 142013 ms, time limit is 60000
io.vertx.core.VertxException: Thread blocked
    at java.io.FileInputStream.readBytes(Native Method)
    at java.io.FileInputStream.read(FileInputStream.java:255)
    at sun.security.provider.NativePRNG$RandomIO.readFully(NativePRNG.java:424)
    at sun.security.provider.NativePRNG$RandomIO.implGenerateSeed(NativePRNG.java:441)
    at sun.security.provider.NativePRNG$RandomIO.access$500(NativePRNG.java:331)
    at sun.security.provider.NativePRNG.engineGenerateSeed(NativePRNG.java:226)
    at java.security.SecureRandom.generateSeed(SecureRandom.java:533)
    at io.vertx.ext.auth.PRNG.lambda$null$0(PRNG.java:78)
    at io.vertx.ext.auth.PRNG$$Lambda$204/767088095.handle(Unknown Source)
    at io.vertx.core.impl.ContextImpl.lambda$executeBlocking$1(ContextImpl.java:271)
    at io.vertx.core.impl.ContextImpl$$Lambda$206/1202956360.run(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    at java.lang.Thread.run(Thread.java:748)

Dec 08, 2017 1:23:48 AM io.vertx.core.impl.BlockedThreadChecker
WARNING: Thread Thread[vert.x-worker-thread-2,5,main] has been blocked for 143013 ms, time limit is 60000
io.vertx.core.VertxException: Thread blocked
    at java.io.FileInputStream.readBytes(Native Method)
    at java.io.FileInputStream.read(FileInputStream.java:255)
    at sun.security.provider.NativePRNG$RandomIO.readFully(NativePRNG.java:424)
    at sun.security.provider.NativePRNG$RandomIO.implGenerateSeed(NativePRNG.java:441)
    at sun.security.provider.NativePRNG$RandomIO.access$500(NativePRNG.java:331)
    at sun.security.provider.NativePRNG.engineGenerateSeed(NativePRNG.java:226)
    at java.security.SecureRandom.generateSeed(SecureRandom.java:533)
    at io.vertx.ext.auth.PRNG.lambda$null$0(PRNG.java:78)
    at io.vertx.ext.auth.PRNG$$Lambda$204/767088095.handle(Unknown Source)
    at io.vertx.core.impl.ContextImpl.lambda$executeBlocking$1(ContextImpl.java:271)
    at io.vertx.core.impl.ContextImpl$$Lambda$206/1202956360.run(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    at java.lang.Thread.run(Thread.java:748)

Dec 08, 2017 1:23:49 AM io.vertx.core.impl.BlockedThreadChecker
WARNING: Thread Thread[vert.x-worker-thread-2,5,main] has been blocked for 144013 ms, time limit is 60000
io.vertx.core.VertxException: Thread blocked
    at java.io.FileInputStream.readBytes(Native Method)
    at java.io.FileInputStream.read(FileInputStream.java:255)
    at sun.security.provider.NativePRNG$RandomIO.readFully(NativePRNG.java:424)
    at sun.security.provider.NativePRNG$RandomIO.implGenerateSeed(NativePRNG.java:441)
    at sun.security.provider.NativePRNG$RandomIO.access$500(NativePRNG.java:331)
    at sun.security.provider.NativePRNG.engineGenerateSeed(NativePRNG.java:226)
    at java.security.SecureRandom.generateSeed(SecureRandom.java:533)
    at io.vertx.ext.auth.PRNG.lambda$null$0(PRNG.java:78)
    at io.vertx.ext.auth.PRNG$$Lambda$204/767088095.handle(Unknown Source)
    at io.vertx.core.impl.ContextImpl.lambda$executeBlocking$1(ContextImpl.java:271)
    at io.vertx.core.impl.ContextImpl$$Lambda$206/1202956360.run(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    at java.lang.Thread.run(Thread.java:748)

Dec 08, 2017 1:23:50 AM io.vertx.core.impl.BlockedThreadChecker
WARNING: Thread Thread[vert.x-worker-thread-2,5,main] has been blocked for 145013 ms, time limit is 60000
io.vertx.core.VertxException: Thread blocked
    at java.io.FileInputStream.readBytes(Native Method)
    at java.io.FileInputStream.read(FileInputStream.java:255)
    at sun.security.provider.NativePRNG$RandomIO.readFully(NativePRNG.java:424)
    at sun.security.provider.NativePRNG$RandomIO.implGenerateSeed(NativePRNG.java:441)
    at sun.security.provider.NativePRNG$RandomIO.access$500(NativePRNG.java:331)
    at sun.security.provider.NativePRNG.engineGenerateSeed(NativePRNG.java:226)
    at java.security.SecureRandom.generateSeed(SecureRandom.java:533)
    at io.vertx.ext.auth.PRNG.lambda$null$0(PRNG.java:78)
    at io.vertx.ext.auth.PRNG$$Lambda$204/767088095.handle(Unknown Source)
    at io.vertx.core.impl.ContextImpl.lambda$executeBlocking$1(ContextImpl.java:271)
    at io.vertx.core.impl.ContextImpl$$Lambda$206/1202956360.run(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    at java.lang.Thread.run(Thread.java:748)

我无法理解导致这些警告出现的原因。在发出警告时,服务器处于空闲状态,应用程序的流量为 0。另外,我正在运行一个使用 vertx 周期性的调度程序,它每 15 秒对 mongo 进行一次查询。

vertx.setPeriodic(15000, r -> someService.check()); // Every 15 seconds

【问题讨论】:

  • 请在 .check() 中显示代码。其中的某些东西可能会阻塞。例如,在我的情况下,我正在执行导致警告的大型 json 序列化。

标签: vert.x


【解决方案1】:

似乎没有足够的熵(服务器空闲)来提供 PRNG。因此,SecureRandom.generateSeed 方法不会快速返回,而是阻塞直到它获得足够的数据。

根据您的硬件,您可以使用rng-tools 加快处理速度。

【讨论】:

  • 是1GB的droplet机,是内存问题吗?还以 15 秒的间隔运行 periodic mongo 查询,可以吗?
  • 是的,定期查询没问题。不,这不是内存问题。如果您在云机器上,那么您将无能为力。忽略警告(它是无害的)。
【解决方案2】:

您是否正在使用 vertx.executeBlocking() 执行阻塞 api 调用?在我看来,您的 someService.check() 或其他任何地方可能有阻塞 API 调用

【讨论】:

  • 不,没有阻塞 API 调用。 service.check() 仅使用 vertx-mongo-client 对 mongo DB 进行查询。
猜你喜欢
  • 2021-09-22
  • 1970-01-01
  • 1970-01-01
  • 2018-12-14
  • 2020-11-02
  • 2015-12-04
  • 2016-01-27
  • 1970-01-01
  • 2018-02-16
相关资源
最近更新 更多