【问题标题】:running more than 8 threads in quad core processor在四核处理器中运行超过 8 个线程
【发布时间】:2013-01-10 14:26:59
【问题描述】:

我有一个带有 10 个线程和大量文本数据要处理的线程池,我正在并行运行这些线程,但我无法利用核心 i7 vPro 处理器的完整 cpu 资源,有人帮我解决这个问题。我想要最大的 CPU 利用率。

【问题讨论】:

  • 一点代码将有助于回答这个问题。
  • 为什么为什么为什么???一个 100 行字的文本文件不需要 8 个线程来处理。你在浪费资源,做傻事。 STAHP
  • 将100个句子翻译成6种不同的语言并对文本进行字数统计操作
  • 我在 Windows Intel 双核工作站上编写并运行了一个 20 线程进程,我能得到的最好结果是两个内核的利用率为 50%。您的操作系统以及 JRE 决定了线程的处理方式。
  • @DunAnt 您实际上是如何翻译这些句子的?如果您将它们输入到外部服务(如 Google 翻译)中,那么对您的应用程序进行多线程处理就没有任何意义。网络通信产生的开销比实际所需的计算时间大数量级。即使是您自己的翻译引擎,本地字典查找也可能非常昂贵,以至于 I/O 无法满足 8 个线程。

标签: java multithreading jvm threadpool cpu-usage


【解决方案1】:

在许多情况下,不是在每个线程中做同样的事情来做单独的工作并使用同步队列进行通信会产生更好的结果。尝试拆分应用程序,以便所有读取操作都从单个线程完成,然后将数据提供给工作线程进行处理,另一个线程进行后处理(如果有的话)。您可能会发现这样的模型使用更多的处理能力并且工作速度明显更快。

【讨论】:

    【解决方案2】:

    您的开销很可能比 CPU 利用率高。

    • 这可能是因为读取文件并将其分解成句子需要时间。由于您没有看到 100% CPU,这是我的猜测。
    • 启动任务并将任务添加到其他线程的开销大于每个任务所做的工作量。您会期望看到接近 100% 的 CPU 利用率,但速度远低于您的预期。它甚至可能比使用一个线程慢。

    除非您的 JVM 已预热,否则您可能会发现这比使用多线程有更大的不同。 (100个句子文件是不够的)

    【讨论】:

    • 我什至有一个 500 个句子的文件,情况也是如此,整个过程涉及将文本翻译成 6 种不同的语言
    • 在这种情况下,我会为每个线程翻译一种语言,一个线程将阅读成句子。那应该是足够密集的CPU。我假设您正在使用 Java 进行翻译,而不是使用任何外部资源或服务。
    【解决方案3】:

    如果每个线程除了处理它之外还应该从文件中读取句子,那么我怀疑磁盘是这种情况下的瓶颈。从单个磁盘并行读取通常会导致相对于单个顺序读取的性能下降。

    在我看来,您应该将所有内容留给单个线程,或者至少使用单个生产者-多消费者模式序列化读取并仅并行化句子处理。

    【讨论】:

      【解决方案4】:

      多线程会带来一些开销,包括将任务细分为作业,将作业提供给作业队列,然后让ThreadPoolExecutor 执行作业,也许在完成时合并结果。即使没有由于磁盘访问或其他共享资源而导致的争用,我发现将作业细分为小于 1 毫秒也不值得开销。在具有多个套接字的大型机器上运行时,由于缓存一致性开销增加,该阈值甚至更高。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-09-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-05-06
        • 2010-11-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多