【问题标题】:cpu not fully utilized in multi-threadingcpu 未在多线程中充分利用
【发布时间】:2013-10-25 22:47:57
【问题描述】:

我正在为推荐引擎编写代码,该引擎使用并行线程进行计算。在运行时,我在 8 核 CPU 上获得了 265-300% 的最大 CPU 使用率(使用 top 命令)。我没有得到的是为什么即使将近 50% 的 cpu 处于空闲状态,它也没有使用完整的 CPU。使用并行的伪代码部分是:

getRecoFromCandidates(){
    t=new Thread(new KNN(uid,profile,candidates));// does knn using closest neighbors
    rec=RecommendationsFromSet(NB_RECOMMENDATIONS,uid,candidatesI,val);// finds recommendations
    return rec;
}



RecommendationsFromSet() {
      Thread worker = new Thread(new storiesClickProcess(nbRec,candidatesI,likedSet));
      worker.start();
      threads.add(worker);
    }
    int running = 0;
    do {
      running = 0;
      for (Thread thread : threads) {
        if (thread.isAlive()) {
          running++;
        }
      }
    } while (running > 0);

    if(val==1){
    List<Story> list1 = new ArrayList<Story>();
    for(Integer sid: storiesClicks.keySet()){
        list1.add(new Story(sid,storiesClicks.get(sid)));
    }
    Collections.sort(list1,new StoriesList());
    for(i=0;i<nbRec;i++){
        rec.add(list1.get(i).getSid());
    }
    }



    return rec;
}


   parGetClosestNeighbor() {
      Thread worker = new Thread(new formNetworkProcess(nbFriends,networkScore[i],profile,candidatesI,candidatesISet) );
      worker.start();
      threads.add(worker);
    }
    int running = 0;
    do {
      running = 0;
      for (Thread thread : threads) {
        if (thread.isAlive()) {
          running++;
        }
      }
    } while (running > 0);

    List<Network> list = new ArrayList<Network>();

    for(i=0;i<TASK_NUM;i++){
     for(Integer sid: networkScore[i].keySet()){
        list.add(new Network(sid,networkScore[i].get(sid)));

    }
    }

    Collections.sort(list,new NetworkList());
    for(i=0;i<nbFriends;i++){
        friends.add(list.get(i).getUid());
    }

    synchronized(network.get(uid)) {
        network.get(uid).clear();
        for( i=0;i<friends.size();i++){
            network.get(uid).add(friends.get(i));
        }

    }


    return friends;
}

【问题讨论】:

  • 网络/内存有多忙?您可能在 I/O 请求上达到最大值,并且线程在此期间等待它完成而不使用 CPU。
  • 不,这两个函数中的线程进程是完全独立的,并且没有 i/o 请求。它们传递了用于计算的参数

标签: java


【解决方案1】:

如果你有一个多核 CPU,top 不是检查 CPU 使用率的最佳命令。使用 sar

sar -P ALL 1 1000

这将每 1 秒打印 1000 次所有内核的使用情况

此外,我确实在您的代码中看到了同步关键字。这可能会引起争论。您可以使用 vmstat 或通过此命令进行验证

cat /proc/PID/状态

【讨论】:

  • 您好,我确认在这种情况下同步不会引起任何争用。此外,线程独立工作,但仍然没有使用 max cpu
  • 你能像我上面提到的那样转储 sar 命令的输出吗?您还运行了多少应用程序线程?您是否有足够的线程来占用所有内核?还要记住,即使在线程上下文切换中也会丢失 cpu 时钟周期。每个上下文切换都涉及在处理器缓存中读取完整的线程上下文。
  • 嗨,我正在为 8 个内核运行 8 个线程。另外,由于我使用的是 Macbook,所以上面的 sar 命令不起作用。使用 Sar 1 1000 平均可提供 45-50% 的总 CPU 使用率
  • 你能尝试在 Linux/Windows 机器上运行它吗?我只是想知道 OSX 是否会执行一些逻辑并阻止任何线程占用 100% 的 CPU 以保持机器的活跃度
  • 我目前没有linux,但会在一些服务器上尝试。正如您所说,OSX 可能会进行一些线程管理以防止完全使用。将验证它
猜你喜欢
  • 1970-01-01
  • 2011-01-17
  • 2013-11-13
  • 1970-01-01
  • 2017-03-30
  • 1970-01-01
  • 1970-01-01
  • 2015-12-17
  • 2023-03-27
相关资源
最近更新 更多