2016-10-28 24 views
0

我意识到我的第一个Golang应用程序,我有使用GoRoutines,我真的不知道为什么在使用MAX CPU & Cores一些问题。够程不使用最大CPU和核心

当使用工具如htopCPU不是在其最大功率使用,并且仅1..4 threads处于活动状态的时间。此外,所有cores都处于活动状态,但它们的使用率大约为25%-40%

我用:

func MaxParallelism() int { 
    maxProcs := runtime.GOMAXPROCS(0) 
    numCPU := runtime.NumCPU() 
    if maxProcs < numCPU { 
     return maxProcs 
    } 
    return numCPU 
} 

为了获得goroutines数被实例化。

下面是我如何设置应用程序:

//Common Channel for the goroutines 
tasks := make(chan *exec.Cmd, 64) 

    //Spawning Max Cores Number goroutines (8) 
    var wg sync.WaitGroup 
    cores := MaxParallelism() 
    for i := 0; i < cores; i++ { 
     wg.Add(1) 
     go func(num int, w *sync.WaitGroup) { 
      defer w.Done() 
      var (
       out []byte 
       err error 
      ) 
      for cmd := range tasks { 
       out, err = cmd.Output() 
       if err != nil { 
        fmt.Printf("Can't get stdout:", err) 
       } 
       . . . 
      } 
     }(i, &wg) 
    } 

    //Generate Tasks 
    for i := 0; i < 100000; i++ { 
     tasks <- exec.Command(cmd1, args...) 
     tasks <- exec.Command(cmd2, args...) 
    } 

close(tasks) 
// wait for the workers to finish 
wg.Wait() 

我分享htop两张截图在执行应用程序

enter image description here enter image description here

我不知道如果它可以帮助,但我通过Intellij Idea启动它。

如何正确使用Max CPU和Cores?

在此先感谢。

+0

是什么让你觉得它没有使用足够的CPU核心?你期望什么行为,你观察到什么行为? – Flimzy

+0

我在执行应用程序时共享一个'htop'屏幕,这样你就能理解它。基本上,一次只有'1个活动线程,所有内核的使用率都在25%左右。 – AndreaM16

+0

你说你正在产卵4套房屋。你怎么知道你得到4? – user2357112

回答

1

Goroutines和线程是不一样的。你不应该指望任何CPU亲和力。有关详细信息,请参阅http://tleyden.github.io/blog/2014/10/30/goroutines-vs-threads/

下面是一些够程的线程上的优势:

  • 你能比你的线程典型的系统上运行更多的够程。
  • Goroutines有可生长的分段堆栈。
  • Goroutines的启动时间比线程快。
  • Goroutines带有内置原语,可以在自己(渠道)之间安全地进行通信。
  • Goroutines允许您避免在共享数据结构时不得不求助于互斥锁。
  • Goroutines被复用到少量OS线程上,而不是1:1的映射。
  • 您可以编写大规模并发服务器,而无需求助于编程。

编辑: 答案在评论你的问题。没有确切的答案。正如其他人所说,这取决于你的代码的作用。例如,如果你的I/O速度很慢,你可能永远不会使用100%的CPU。所以无论你开始多少个例程,I/O都很慢。相反,如果你的goroutine有一个非常紧密的循环来做一些计算,那么很可能8个goroutine会完全消耗你的8个CPU。

+1

谢谢你的回答。正如我所说,我对Go总的来说很新,而且我从几天以来就使用它,所以我不知道很多事情。那么,基本上,我应该用4个内核和一个坚实的I7来实例化Hoe的许多goroutines?我只想尽可能利用我的资源。 – AndreaM16

0

经过阅读,得到一些提示和尝试一些东西后,它的代码写得很好,并没有真正的问题造成的。

从本质上讲,Go的比例相当不错,并且您生成的更多tasks使用的资源越多。

例如,在for上设置较高的范围,例如, 1.000.000,使Go使用所有cores可用在他们的可能性~55%

我希望它能帮助别人。