如何充分利用多个处理器?

时间:2012-08-19 05:26:11

标签: java multithreading web-crawler multiprocessing

我正在使用Java在具有32个虚拟处理器的服务器上进行Web爬网。我怎样才能充分利用这些处理器?我已经看到了一些关于多线程编程的建议,但我想知道如何确保所有处理器都能被利用,因为我们也可以在单处理器机器上进行多线程编程。

3 个答案:

答案 0 :(得分:5)

对此没有简单的答案......除了确保使用所有处理器的方法是以正确的方式使用多线程 。 (注意:这是循环答案!)

基本上,有效使用多个处理器的方法是:

  • 确保可以并行完成工作,
  • 减少/消除强制一个线程等待而另一个线程执行某些操作的争用点。

当你进行简单的计算时,这很难。对于Web爬网程序,您遇到了线程将争夺网络并(可能)删除服务器带宽的其他问题,并且他们通常会尝试将其结果放入共享数据结构或数据库中。

这就是在这个普遍性水平上可以说的一切......


正如@veer正确指出的那样,你无法“确保”它。


  

...但是使用大量线程肯定会更快,因为所有可怜的网络延迟都会并行发生......

实际上,如果你过度使用,由于争用,一大堆线程可以减少吞吐量。只是在这个问题上抛出很多线程很少是个好主意。

答案 1 :(得分:0)

计算机或程序的速度与处理链中最慢的链接一样快。仅仅增加CPU容量并不能确保性能急剧上升。撇开其他问题,如缓存大小,RAM等,有两种基本类型的方法可以解决如何利用所有处理器的问题:

[1]使用Jit / just-in-time编译器/解释器技术,如Java / .NET。我对Java知之甚少,但.NET抖动绝对是为了利用mahcine上所有可用的处理器。实际上,这个特性使得抖动能够与其他静态语言编译器(如C / C ++)脱颖而出,因为抖动“知道”它位于32个处理器上,它比利用程序更好地利用它们。在任何其他机器上静态编译。 (如果你为它编写了一个强大的多线程代码!)

[2]用C / C ++编程。这是经典的方法。如果在具有32个CPU的同一台机器上编译代码,并在程序中采取适当的谨慎,如内存管理,处理指针等,C / C ++程序将是最优的,并且性能将优于其CLR / JVM对应的(因为它运行时没有垃圾收集器或VM的额外开销)。

但请记住,在.NET / Java中编写健壮的代码要比C / C ++容易得多。所以,如果你不是一个“硬核”程序员,我会建议采用前一种方法。还要记住小心处理多个线程,例如在多个线程尝试更改相同变量时锁定变量。但是,如果变量出现异常行为,过度锁定可能会导致代码挂起。

答案 2 :(得分:0)

处理器管理是通过您正在使用的虚拟机(即JVM)以本机方式实现的。如果您使用的是Java Hotspot VM,可以在此处查看Java Hotspot VM Options以优化您的计算机。如果您使用的是第三方虚拟机,则您的提供商可能会帮助您根据您的要求进行调整。

设计中的应用程序性能实际上取决于您。 如果您希望监视线程和内存使用情况以优化应用程序,则可以使用迄今为止可用的任何VM监视工具。 Java虚拟机(JVM)具有内置检测功能,使您可以使用JMX监视和管理它。 有关详细信息,请查看Platform Monitoring and management using JMX。对于第三方虚拟机,您必须联系供应商。