如何指出是什么让线程在 threadump 文件中处于 WAITING 状态
How to point out what's putting a thread in a WAITING state in a threadump file
我有一个 linux trusty on aws m4.xlarge 所以 4 CPU,16 GB 内存。它是 运行 java 在 tomcat7 和 oracle java 8 上的应用程序。
应用程序经常会挂起并且不接受任何其他连接。由于响应超时,Status cake 将报告它已关闭。 Datadog 将显示线程已用尽。但是 CPU 并没有增加(只有 10% 的使用率)。 RAM 使用率在此期间保持不变。
只有 tomcat 重新启动才能暂时解决问题(大约 12 小时)。所以我做了一个线程转储,看到有这么多线程处于等待状态。因为这对我来说很新,所以即使有数据我也是盲目的。
我希望我能在这里得到帮助并最终掌握加密线程转储文件的技巧。我把它附在这里,我也把它上传到 fastthread.io and it says there is no problem. I have also uploaded the full threadump on zerobin
如果这里的任何人都可以对此有所了解,我将不胜感激,我希望它能帮助处于相同情况的其他人。提前致谢。
很多线程处于 WAITING 状态,这对它们来说绝对没问题。例如,有些线程具有以下堆栈跟踪:
...
at java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:442)
at org.apache.tomcat.util.threads.TaskQueue.take(TaskQueue.java:104)
at org.apache.tomcat.util.threads.TaskQueue.take(TaskQueue.java:32)
...
这仅表示线程正在等待任何任务执行。
不过,其他堆栈看起来不太好。
java.lang.Thread.State: WAITING (on object monitor)
at java.lang.Object.wait(Native Method)
at com.mchange.v2.resourcepool.BasicResourcePool.**awaitAvailable**(BasicResourcePool.java:1414)
at com.mchange.v2.resourcepool.BasicResourcePool.prelimCheckoutResource(BasicResourcePool.java:606)
- locked <0x000000055c2d3ce0> (a com.mchange.v2.resourcepool.BasicResourcePool)
at
com.mchange.v2.resourcepool.BasicResourcePool.checkoutResource(BasicResourcePool.java:526)
at com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool.checkoutAndMarkConnectionInUse(C3P0PooledConnectionPool.java:755)
这些线程正在等待池中的连接空闲。 C3P0 是一个数据库连接池。它们不是每次都创建一个新连接,而是缓存在池中。关闭时,连接本身并没有关闭,只是返回到池中。因此,如果由于某种原因(或其他用户)休眠在释放连接后不关闭连接,那么池可能会耗尽。
为了解决问题,您必须找出为什么某些连接在使用后没有关闭。尝试查看您的代码来执行此操作。
另一种选择是暂时不使用 C3P0(池化)。这不是永远的,但至少你可以检查这个猜测是否正确。
我有一个 linux trusty on aws m4.xlarge 所以 4 CPU,16 GB 内存。它是 运行 java 在 tomcat7 和 oracle java 8 上的应用程序。
应用程序经常会挂起并且不接受任何其他连接。由于响应超时,Status cake 将报告它已关闭。 Datadog 将显示线程已用尽。但是 CPU 并没有增加(只有 10% 的使用率)。 RAM 使用率在此期间保持不变。
只有 tomcat 重新启动才能暂时解决问题(大约 12 小时)。所以我做了一个线程转储,看到有这么多线程处于等待状态。因为这对我来说很新,所以即使有数据我也是盲目的。
我希望我能在这里得到帮助并最终掌握加密线程转储文件的技巧。我把它附在这里,我也把它上传到 fastthread.io and it says there is no problem. I have also uploaded the full threadump on zerobin
如果这里的任何人都可以对此有所了解,我将不胜感激,我希望它能帮助处于相同情况的其他人。提前致谢。
很多线程处于 WAITING 状态,这对它们来说绝对没问题。例如,有些线程具有以下堆栈跟踪:
...
at java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:442)
at org.apache.tomcat.util.threads.TaskQueue.take(TaskQueue.java:104)
at org.apache.tomcat.util.threads.TaskQueue.take(TaskQueue.java:32)
...
这仅表示线程正在等待任何任务执行。
不过,其他堆栈看起来不太好。
java.lang.Thread.State: WAITING (on object monitor)
at java.lang.Object.wait(Native Method)
at com.mchange.v2.resourcepool.BasicResourcePool.**awaitAvailable**(BasicResourcePool.java:1414)
at com.mchange.v2.resourcepool.BasicResourcePool.prelimCheckoutResource(BasicResourcePool.java:606)
- locked <0x000000055c2d3ce0> (a com.mchange.v2.resourcepool.BasicResourcePool)
at
com.mchange.v2.resourcepool.BasicResourcePool.checkoutResource(BasicResourcePool.java:526)
at com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool.checkoutAndMarkConnectionInUse(C3P0PooledConnectionPool.java:755)
这些线程正在等待池中的连接空闲。 C3P0 是一个数据库连接池。它们不是每次都创建一个新连接,而是缓存在池中。关闭时,连接本身并没有关闭,只是返回到池中。因此,如果由于某种原因(或其他用户)休眠在释放连接后不关闭连接,那么池可能会耗尽。
为了解决问题,您必须找出为什么某些连接在使用后没有关闭。尝试查看您的代码来执行此操作。
另一种选择是暂时不使用 C3P0(池化)。这不是永远的,但至少你可以检查这个猜测是否正确。