【问题标题】:What is the ideal corePoolSize for ScheduledThreadPoolExecutor?ScheduledThreadPoolExecutor 的理想 corePoolSize 是多少?
【发布时间】:2021-11-18 04:40:48
【问题描述】:

在我的 Java Web 应用程序中,我使用 ScheduledThreadPoolExecutor 定期检查数据库连接状态。这适用于每个经过身份验证的用户(每个身份验证)。

ScheduledThreadPoolExecutor executor = new ScheduledThreadPoolExecutor(0);

Runnable task = new Runnable() {
     public void run() {
          //check the status of the database connection, and log the result
     }
};

        
executor.scheduleWithFixedDelay(task, 0, 10, TimeUnit.MINUTES);

但是,当 corePoolSize = 0 时,ScheduledThreadPoolExecutor 会消耗 100% CPU。设置 corePoolSize = 1,可以解决问题。

ScheduledThreadPoolExecutor executor = new ScheduledThreadPoolExecutor(1);

在生产中,我们将拥有数百名用户。 我的问题是,在这种情况下,corePoolSize 的理想值是多少?

【问题讨论】:

    标签: java linux tomcat threadpool threadpoolexecutor


    【解决方案1】:

    定期检查数据库连接状态

    此轮询是作为健康检查还是您在滚动您自己的数据库连接池?

    但是,当 corePoolSize = 0 时,ScheduledThreadPoolExecutor 会消耗 100% CPU。设置 corePoolSize = 1,可以解决问题。

    您是如何确定这一点的?您可以检查 VisualVM 中的线程视图,但即使所有这些线程都在运行,JVM 也从未超过 3% 的 CPU 使用率。值得注意的是,线程池线程大多处于停放状态。

    在生产中,我们将拥有数百名用户。我的问题是,在这种情况下,corePoolSize 的理想值是多少?

    您正在启动多少个线程池?每个身份验证一个是非常低效的。与连接相同。就像我之前提到的,您通常希望将它们汇集在一起​​。您如何在“身份验证”的整个生命周期中保持连接打开?您是否将连接存储在HttpSession 中,即request.getSession()?这是一个坏主意,因为与连接相关的开销很大,而且很容易出现清理问题。

    您是否有共享池并且您没有停止旧任务?这可能会占用 CPU。

    综上所述,线程池的一般规则是threads=qps*latency,所以如果你每10s检查一次连接,检查连接需要1s,你有60个连接,你需要6个线程+净空。阅读您的示例,这似乎不是您的问题。听起来您正在启动太多线程池并可能泄漏它们。

    【讨论】:

    • 感谢您的回复。是的,这是一种使用 java.​sql.​Connection.isValid(0) 方法的健康检查。我使用 Linux 的 htop 命令确定了 CPU 使用率。我正在为每个身份验证创建一个线程池。但是,当用户注销或关闭浏览器窗口时,我将停止 ScheduledThreadPoolExecutor(使用关闭方法)。我通过定期(比如每 10 分钟)调用 java.​sql.​Connection.isValid(0) 方法,在身份验证的整个生命周期中保持连接打开。
    • 如果我为 ScheduledThreadPoolExecutor 使用静态变量,以便在用户/身份验证之间共享它的单个实例,怎么样?这样会更有效率吗?
    • "当用户注销或关闭浏览器窗口时。"那些钩子不是很好。人们总是让窗口保持打开状态并且永远不会注销,回调钩子并不总是触发。特别是如果它只是一个 SQL 连接,最好将它们汇集在一起​​。
    猜你喜欢
    • 2013-02-13
    • 1970-01-01
    • 2011-02-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-01
    相关资源
    最近更新 更多