【问题标题】:java- how to determine the optimum number of threads for a specific type of processing, in different types of serversjava-如何确定不同类型服务器中特定类型处理的最佳线程数
【发布时间】:2012-08-17 16:29:13
【问题描述】:

我有一个 java 程序,它可以访问一些网站,将网站的 HTML 转换为 XML,然后在 XML 上运行一些 xquery 命令,最后将结果存储到 csv 中,然后将其上传到云文件存储(如 Amazon S3) .

现在,我想将工作分成多个线程,以便更快地完成 - 但我如何确定最适合我的工作的线程数?

我想为不同类型的 Amazon EC2 实例确定我应该允许的线程数...是否有库或框架可以帮助我解决这个问题?

或者,我是否必须在 Amazon EC2 实例上手动运行代码,并不断更改线程数,并测量所用时间?

具体来说,我想在处理所有线程所花费的总时间与允许同时运行的线程数之间保持平衡......如果我能清楚地看到具有不同 CPU/RAM 的不同服务器的这种相关性能力会很棒...任何建议/指导将不胜感激...

【问题讨论】:

  • 作为一般准则,机器上的线程数多于内核数无法加快处理速度,但也有一些例外情况,尤其是当线程正在等待其他任务完成且未完全完成时使用。

标签: java multithreading concurrency


【解决方案1】:

您所描述的工作类型几乎可以肯定是 I/O 限制的——大部分时间都花在等待下载或上传数据上。如果是这样,您的目标只是充分利用上传/下载带宽。

如果是这样,最佳线程数将超过机器上的物理内核数(这将是 CPU 密集型进程的正确起点)。

从这些信息中很难说最佳线程数是多少,因为这取决于您下载的数量以及链接的速度。尝试将线程数加倍,直到性能开始下降。

【讨论】:

    【解决方案2】:

    我认为您应该使用 JHAT、MAT 等使用单线程分析您的应用程序......然后根据您要运行的机器配置决定多少线程。它会让您大致了解线程的成本。然后,您可以运行负载测试(例如 10,000 个项目排队等待 10 个线程)来验证您提出的限制,并进行相应的调整。

    【讨论】:

      【解决方案3】:

      要查找可用的逻辑核心数,您可以使用:

      int processors = Runtime.getRuntime().availableProcessors();
      

      并创建一个ThreadPool 有这么多。另见:

      Finding Number of Cores in Java

      Java: How to scale threads according to cpu cores?

      【讨论】:

      • 我还有一个问题要问您 - 据我了解,Amazon EC2 实例(或任何其他 VPS 或基于云的虚拟机实例)具有分配给典型服务器的部分 CPU+内存它——上面的方法能在这样的虚拟机上正常工作吗?
      • 如果亚马逊的虚拟核心映射到您获得的实际核心(或超线程核心),我希望它能够工作(如果他们向您收取额外的虚拟核心但没有给您真实的核心)。
      猜你喜欢
      • 2011-07-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多