我正在编写类似于“守护进程”的软件,它使用多线程在循环中做一些事情(登录到某个地方,做一些事情然后注销)。 我的应用程序运行大约 1000-2000 个线程,这个线程可以正常工作。 所以这是我最初 ~10 分钟的 htop 日志:
因此您可以在上面的屏幕截图中看到一些线程正在运行(按绿色 R 状态排序)
但一段时间后会发生这种情况:
如您所见,只有一三个线程在周期性运行(看起来系统会减慢线程速度或使其 hibernate )。 应用程序为小型作业运行线程(大约 10 秒到 1 分钟),线程死后,固定线程池执行器创建新线程来完成相同的工作。 因此,据我了解,线程执行的速度应该始终相同。但它在约 10-20 分钟后变慢。通常在 htop 中每次运行最多 ~500-200-300-100 个线程和最多 ~3-30-60 个线程。但是在这 10-20 分钟之后,只有线程在执行。那么您能告诉我发生了什么以及如何解决这个问题吗?
最佳答案
线程是否正在访问mysql?我看到它以 100% 的速度运行......如果一个线程正在等待 I/O,内核会让它 hibernate 直到数据准备好。如果它在磁盘上等待,您可能会看到它反射(reflect)在平均负载中,因此它可能正在等待网络数据(您的套接字等是否正确关闭?您是否被远程连接到的任何服务器阻止?是您的远程服务挂了?)或者mysql的数据(是不是你的连接池太小了?是mysql的负载不够了吗?)。
关于Java 线程在 Linux 中进入 hibernate 状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8752086/