我观察到当系统负载上升时,运行队列延迟约为 10000 微秒。该应用程序启动 8 个 JVM 实例,每个实例启动大量线程,平台为 Linux。
我想知道是否有关于为这种多线程应用程序调整运行队列延迟的一般想法?
我观察到当系统负载上升时,运行队列延迟约为 10000 微秒。该应用程序启动 8 个 JVM 实例,每个实例启动大量线程,平台为 Linux。
我想知道是否有关于为这种多线程应用程序调整运行队列延迟的一般想法?
10 毫秒的运行队列延迟并没有那么高。最简单的做法是减少您尝试运行的线程数量,或为系统提供更多硬件(或多于一个盒子) 理想情况下,您希望线程的繁忙程度低于您拥有的核心数量。如果您有很多想要高效运行的线程,Linux 只能做这么多。
运行队列延迟取决于可运行(准备运行)线程与可用 CPU 的比率。
当可运行线程多于可用 CPU 时,即当负载平均值高于 CPU 数量时,不可避免地一些线程将不得不等待直到 CPU 变得可用,即直到其他一些线程被阻塞或抢占。
因此,为了改善运行队列延迟,您要么需要增加可用 CPU 的数量,要么需要减少竞争 CPU 的线程数量。
如果应用程序是 CPU 密集型的,那么 CPU 的竞争将会更加激烈。您应该调查一下您的 JVM 是否没有花费太多时间进行垃圾收集。在 CPU 很少的机器上运行多个 JVM 时,您可以通过让多个 JVM 同时进行垃圾收集来轻松增加运行队列延迟的长尾。如果是这种情况,您可以尝试增加线程数并减少单独 JVM 的数量。