Golang ist eine moderne, leistungsstarke Programmiersprache, die in Netzwerkdiensten, Cloud Computing, Datenanalyse und anderen Bereichen weit verbreitet ist. Golang ist eine plattformübergreifende Sprache mit hervorragender Parallelitätsleistung, und ihr Standard-Parallelitätsmechanismus ist ebenfalls sehr leistungsfähig. Standardmäßig verwendet Golang Goroutine-Coroutinen, um Parallelität zu erreichen, und kann problemlos Tausende gleichzeitiger Verbindungen verarbeiten. Wenn Sie Golang-Programme jedoch auf Multi-Core-CPUs ausführen müssen, müssen Sie einige zusätzliche Einstellungen vornehmen.
In diesem Artikel erfahren Sie, wie Sie Multicore in Golang einrichten, um die Parallelitätsleistung des Programms zu verbessern.
1. Was ist eine Multicore-Einstellung?
Multi-Core-Einstellung (oder Multi-Prozessor-Einstellung) bedeutet, dass beim Ausführen eines Golang-Programms auf einer Multi-Core-CPU durch Festlegen einiger Betriebsparameter das Programm die Rechenleistung der Multi-Core-CPU voll ausnutzen kann. Dadurch wird die Parallelitätsleistung des Programms verbessert.
Standardmäßig verwendet der Parallelitätsmechanismus von Golang nur einen einzigen Kern. Dies liegt daran, dass der von Golang verwendete Scheduler (Scheduler) auf kooperativer Planung (Cooperative Scheduling) basiert. Das heißt, nur wenn die aktuelle Goroutine den Prozessor aktiv aufgibt, wechselt sie zu einer anderen Goroutine und stellt so sicher, dass es nur eine Goroutine gibt Zur gleichen Zeit. Obwohl dieser Mechanismus einfach und effizient ist, kann er nur einen einzelnen Kern verwenden und die Leistungsvorteile von Mehrkern-CPUs nicht vollständig nutzen.
Daher sind bei einem Multi-Core-Setup einige spezielle Einstellungen erforderlich, damit Golangs Scheduler Goroutine auf mehreren Kernen planen und die Last auf verschiedene Kerne verteilen kann, wodurch die Parallelitätsleistung des Programms verbessert wird.
2. Wie richte ich Multicore-Einstellungen ein?
Multi-Core-Einstellungen in Golang erfordern die Verwendung von Systemaufrufen. Es gibt hauptsächlich drei Funktionen:
Diese Funktion wird verwendet, um die maximale Anzahl der beim Code verwendeten CPU-Kerne festzulegen läuft. Der Standardwert ist 1, wodurch nur ein einzelner Kern verwendet wird. Bei einem Wert größer als 1 führt Golang Goroutine auf Multi-Core-Prozessoren aus. Zum Beispiel:
runtime.GOMAXPROCS(4) //Verwenden Sie 4 Kerne, um das Programm auszuführen
Diese Funktion wird verwendet, um die aktuelle Goroutine an den aktuellen Thread zu sperren, um zu verhindern, dass der Scheduler wechselt Führen Sie es zu einem anderen Thread aus, wodurch der Aufwand für den Thread-Wechsel verringert wird. Zum Beispiel:
func loop() {
runtime.LockOSThread() //锁定当前协程到当前线程 //进行一些处理
}
Diese Funktion wird verwendet, um die aktuelle Goroutine vom aktuellen Thread zu entsperren, damit sie von dem auf andere Threads umgeschaltet werden kann Planer. Zum Beispiel:
func loop() {
//进行一些处理 runtime.UnlockOSThread() //解锁当前协程
}
Wenn die UnlockOSThread-Funktion nicht aufgerufen wird, kann die aktuelle Coroutine niemals aus dem aktuellen Thread wechseln.
3. Wie kann man die Wirkung von Multi-Core-Einstellungen bewerten?
Bevor Sie Multi-Core-Einstellungen vornehmen, müssen Sie die Leistung des aktuellen Programms in Single-Core- und Multi-Core-Umgebungen bewerten, damit Sie die Leistung des Programms durch Multi-Core-Einstellungen verbessern können.
Um die Leistung des Programms zu bewerten, können Sie Gos eigenes Leistungsanalysetool pprof verwenden. pprof kann die CPU- und Speichernutzung des Programms analysieren, um Leistungsengpässe im Code herauszufinden.
Zuerst müssen Sie pprof installieren:
get -u github.com/google/pprof
2. Führen Sie pprof aus
Verwenden Sie pprof, um die Leistung des Programms zu analysieren, das Sie hinzufügen müssen Profilieren Sie den Code für das Programm und aktivieren Sie ihn:
package main
import (
"math/rand" "os" "runtime/pprof" "time"
)
func main() {
pprofFile, err := os.Create("cpu.prof") if err != nil { panic(err) } pprof.StartCPUProfile(pprofFile) defer pprof.StopCPUProfile() rand.Seed(time.Now().UnixNano()) for i := 0; i < 10; i++ { go func() { for { num := rand.Intn(1000000000) _ = num * num } }() } time.Sleep(10 * time.Second)
}
Nachdem das Programm ausgeführt wurde, wird eine cpu.prof-Datei generiert im aktuellen Verzeichnis, das die CPU-Auslastung des Programms enthält. Zur Analyse können Sie den folgenden Befehl verwenden:
pprof -http=:9999 cpu.prof
Dieser Befehl startet einen Webserver, auf den über http://localhost:9999/ im Browser zugegriffen werden kann. Auf der Webseite können Sie die CPU-Auslastung des Programms, Funktionsaufrufbeziehungen und Aufrufzeiten anzeigen, um Leistungsengpässe zu identifizieren.
3. Vergleichen Sie die Single-Core- und Multi-Core-Leistung
Mit dem pprof-Tool können Sie Programme in Single-Core- und Multi-Core-Umgebungen ausführen und deren Leistung vergleichen.
Um die Single-Core- und Multi-Core-Leistung zu vergleichen, müssen Sie beim Ausführen des Programms den Parameter GOMAXPROCS festlegen:
go run -race -p=1 main.go //Single-Core-Running
go run -race - p=4 main.go //Vier Kernel laufen
Verwenden Sie pprof, um eine Leistungsanalyse für das Programm durchzuführen, das zweimal ausgeführt wird, und vergleichen Sie deren CPU-Auslastung und Anzahl der Funktionsaufrufe. Durch den Vergleich der Ergebnisse der Leistungsanalyse können Leistungsengpässe im Programm gefunden und optimiert werden.
4. Zusammenfassung
Golang führt Goroutine standardmäßig auf einem einzelnen Kern aus, wodurch die Rechenleistung von Mehrkern-CPUs nicht vollständig ausgenutzt werden kann. Das Ausführen von Golang-Programmen auf einer Multi-Core-CPU erfordert Multi-Core-Einstellungen, einschließlich der Einstellung von GOMAXPROCS-Parametern und der Verwendung der Funktionen LockOSThread und UnlockOSThread.
Um die Wirkung von Multi-Core-Einstellungen zu bewerten, können Sie mit dem Go-eigenen Performance-Analyse-Tool pprof die Performance-Engpässe im Programm herausfinden und optimieren.
Durch Multi-Core-Einstellungen können Sie die Rechenleistung von Multi-Core-CPUs voll ausnutzen und so die gleichzeitige Leistung des Programms verbessern.
Das obige ist der detaillierte Inhalt vonGolang Multi-Core-Einstellungen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!