昨天,我们注意到我们的一台多处理器服务器上的 Java/Web Logic 出现了一种特殊行为,因此想了解一下您的想法。
出于某种原因,Web Logic/Java 仅使用可用的两个处理器中的一个处理器。当我们运行一些重负载时,我可以看到一个处理器的 CPU 几乎达到 100%,而另一个处理器完全空闲。这是否是虚拟机是否重要(..但这不是虚拟机)
有趣的是,任何其他操作系统活动都表明两者上的处理器活动。
问候,_UB
昨天,我们注意到我们的一台多处理器服务器上的 Java/Web Logic 出现了一种特殊行为,因此想了解一下您的想法。
出于某种原因,Web Logic/Java 仅使用可用的两个处理器中的一个处理器。当我们运行一些重负载时,我可以看到一个处理器的 CPU 几乎达到 100%,而另一个处理器完全空闲。这是否是虚拟机是否重要(..但这不是虚拟机)
有趣的是,任何其他操作系统活动都表明两者上的处理器活动。
问候,_UB
在常见情况下,WebLogic(以及 Java)应该能够使用运行它的服务器中的所有可用处理器。WebLogic 有一个请求处理线程池,当请求同时到达时,它们会被同时处理。如果服务器有多个处理器,那么这些处理器应该由 Java 线程使用。
如果在 WebLogic 中运行的 Java Web 应用程序在其 servlet 中使用SingleThreadModel,则没有两个线程可以同时执行 servlet,因此您只能看到一个 CPU 在那里工作。不推荐使用此模型,我想反正用的不多。
我听说有些人抱怨说,在运行 VMWare 等虚拟机操作系统时,他们无法让 Java 应用服务器使用超过 1 个 CPU,即使他们为 VM 使用了多个 CPU。我不知道当时这种奇怪行为的原因是什么。
也许您应该尝试使用并发请求访问一些非常简单的 JSP 页面,看看是否使用了超过 1 个 CPU。如果这有效,则问题出在您的应用程序中。
WebLogic 文档就如何为多处理器机器进行配置提供了建议。您最终会得到一个集群环境。
运行这个 Java 程序来测试 Java 是否利用了所有可用的 CPU(在我的例子中是 8 个):
public class MultiThreadCPUEater implements Runnable {
public static void main(String[] args) {
for (int i = 0; i < 8; i++) {
MultiThreadCPUEater multiThreadCPUEater = new MultiThreadCPUEater();
Thread thread = new Thread(multiThreadCPUEater);
thread.start();
}
}
@Override
public void run() {
for (;;) {
}
}
}