2016-10-28 5 views
0

ich meine ersten Golang Anwendung zu realisieren, und ich habe einige Probleme mit MAX CPU & Cores über die Verwendung, wenn GoRoutines mit und ich weiß wirklich nicht, warum.Goroutines nicht Verwenden von Max CPU und Cores

Wenn ein Werkzeug wie htop verwendet wird, wird CPU nicht mit maximaler Leistung verwendet und nur 1..4 threads sind zur Zeit aktiv. Auch alle cores sind aktiv, aber sie sind um 25%-40% Auslastung.

I verwendet:

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

Um instanziiert die Anzahl der goroutines zu bekommen.

Hier ist, wie ich die Anwendung einrichten:

//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() 

Ich teile zwei Screenshots von htop während die Ausführung der Anwendung

enter image description here enter image description here

Ich weiß nicht, ob es helfen kann, aber Ich starte es durch Intellij Idea.

Wie verwende ich Max CPU richtig und Kerne?

Vielen Dank im Voraus.

+0

Warum glauben Sie, dass es nicht genügend CPU-Kerne verwendet? Welches Verhalten erwarten Sie und welches Verhalten beobachten Sie? – Flimzy

+0

Ich teile einen Bildschirm von 'htop' während der Ausführung der Anwendung, damit Sie es verstehen. Im Grunde gibt es nur "1 Thread aktiv" gleichzeitig und alle Kerne werden um 25% verwendet. – AndreaM16

+0

Sie sagen, dass Sie 4 Goroutines laichen. Woher weißt du, dass du 4 bekommst? – user2357112

Antwort

1

Goroutines und Threads sind nicht gleich. Ergo sollte man keine CPU-Affinität erwarten. Sehen Sie mehr für Details hier http://tleyden.github.io/blog/2014/10/30/goroutines-vs-threads/.

Hier sind einige der Vorteile von Goroutines über Gewinde:

  • Sie können mehr goroutines auf einem typischen System laufen, als Sie Threads können.
  • Goroutinen haben wachsende segmentierte Stapel.
  • Goroutines haben eine schnellere Startzeit als Threads.
  • Goroutines kommen mit eingebauten Primitiven, um sicher zwischen ihnen (Kanäle) zu kommunizieren.
  • Goroutines ermöglichen es Ihnen, beim Freigeben von Datenstrukturen nicht auf Mutex-Sperren zurückgreifen zu müssen.
  • Goroutines werden auf eine kleine Anzahl von OS-Threads anstatt auf eine 1: 1-Zuordnung gemultiplext.
  • Sie können massiv gleichzeitige Server schreiben, ohne auf die geradzahlige Programmierung zurückgreifen zu müssen.

EDIT: Antwort auf Ihre Frage in den Kommentaren. Es gibt keine definitive Antwort. Wie andere bereits erwähnt haben, hängt es davon ab, was dein Code tut. Es kann sein, dass Sie niemals 100% CPU verwenden, wenn Sie zum Beispiel I/O machen, was langsam ist. Egal wie viele Routinen Sie starten, I/O ist langsam. Im Gegensatz dazu, wenn Ihre Goroutine eine sehr enge Schleife hat, die nur einige Berechnungen durchführt, ist es wahrscheinlich, dass 8 Goroutines Ihre 8 CPUs komplett verbrauchen werden.

+1

Vielen Dank für die Antwort. Wie ich schon sagte, ich bin ziemlich neu im Allgemeinen und ich weiß nicht viele Dinge, da ich es seit einigen Tagen benutze. Also, im Grunde, Hoe viele goroutines sollte ich mit 4 Kernen und einem soliden I7 instanziieren? Ich möchte nur meine Ressourcen maximal nutzen. – AndreaM16

0

Nachdem ich gelesen, ein paar Tipps bekommen und ein paar Sachen ausprobiert hatte, stellte sich heraus, dass der Code gut geschrieben war und es keine wirklichen Probleme gab.

Im Wesentlichen Go Skalen ziemlich gut und je mehr tasks Sie generieren, desto mehr CPU Ressourcen verwendet werden.

Zum Beispiel, einen höheren Bereich auf der for, z. 1.000.000, macht Go verwenden alle cores verfügbar unter ~55% ihrer Möglichkeiten.

Ich hoffe, es wird jemandem helfen.

Verwandte Themen