Golang は、ネットワーク サービス、クラウド コンピューティング、データ分析などの分野で広く使用されている最新の高性能プログラミング言語です。 Golang は優れた同時実行パフォーマンスを備えたクロスプラットフォーム言語であり、そのデフォルトの同時実行メカニズムも非常に強力です。デフォルトでは、Golang は Goroutine コルーチンを使用して同時実行を実現し、数千の同時接続を簡単に処理できます。ただし、Golang プログラムをマルチコア CPU で実行する必要がある場合は、追加の設定を行う必要があります。
この記事では、Golang でマルチコアを設定してプログラムの同時実行パフォーマンスを向上させる方法を紹介します。
1. マルチコア設定とは何ですか?
マルチコア設定 (またはマルチプロセッサ設定) とは、マルチコア CPU 上で Golang プログラムを実行するときに、プログラムがマルチコアの処理能力を最大限に活用できるように、いくつかの動作パラメータを設定することを指します。 CPU を強化し、プログラムの同時実行パフォーマンスを向上させます。
デフォルトでは、Golang の同時実行メカニズムは 1 つのコアのみを使用します。これは、Golang が使用するスケジューラ (Scheduler) が協調スケジューリング (Cooperative Scheduling) に基づいているためです。つまり、現在のゴルーチンが積極的にプロセッサを放棄した場合にのみ、他のゴルーチンに切り替わり、ゴルーチンが 1 つだけ存在することが保証されます。同時に実行中です。このメカニズムはシンプルで効率的ですが、使用できるコアは 1 つだけであり、マルチコア CPU のパフォーマンス上の利点を十分に活用することはできません。
したがって、マルチコアをセットアップするときは、Golang のスケジューラーが複数のコアで Goroutine をスケジュールし、異なるコアの負荷を分散してプログラムの同時実行パフォーマンスを向上できるようにするための特別な設定が必要です。
2. マルチコアを設定するにはどうすればよいですか?
Golang のマルチコア設定ではシステム コールを使用する必要があります。システム コールには主に次の 3 つの関数が含まれます:
This この関数は、コードの実行時に使用される CPU コアの最大数を設定するために使用されます。デフォルト値は 1 で、単一のコアのみを使用します。 1 より大きい値に設定すると、Golang はマルチコア プロセッサ上で Goroutine を実行します。例:
runtime.GOMAXPROCS(4) //プログラムを実行するために 4 つのコアを使用します
この関数は現在の Goroutine は現在のスレッドにロックされ、スケジューラが他のスレッドで実行するように切り替えることができなくなり、スレッド切り替えのオーバーヘッドが軽減されます。例:
funcloop() {
runtime.LockOSThread() //锁定当前协程到当前线程 //进行一些处理
}
この関数は次の目的で使用されます。 Goroutine は現在のスレッドからロック解除され、スケジューラによって他のスレッドで実行するように切り替えることができます。例:
funcloop() {
//进行一些处理 runtime.UnlockOSThread() //解锁当前协程
}
UnlockOSThread 関数が呼び出されない場合、現在のコルーチンは現在のスレッドから切り替えることができません。 。
3. マルチコア設定の効果を評価するにはどうすればよいですか?
マルチコア設定を行う前に、マルチコア設定によってプログラムのパフォーマンスを向上させるために、シングルコア環境とマルチコア環境で現在のプログラムのパフォーマンスを評価する必要があります。
プログラムのパフォーマンスを評価するには、Go 独自のパフォーマンス分析ツール pprof を使用できます。 pprof は、プログラムの CPU とメモリの使用状況を分析して、コード内のパフォーマンスのボトルネックを見つけることができます。
まず、pprof をインストールする必要があります:
go get -u github.com/google/pprof
2. pprof を実行します。
pprof を使用してプログラムのパフォーマンスを分析するには、プログラムにプロファイリング コードを追加して有効にする必要があります。
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)
}
プログラムを実行すると、cpu.prof ファイルが次の場所に生成されます。現在のディレクトリ (プログラムの CPU 使用率を含む) 条件。分析には次のコマンドを使用できます。
pprof -http=:9999 cpu.prof
このコマンドは Web サーバーを起動します。Web サーバーは http:// を介してブラウザでアクセスできます。ローカルホスト:9999 /アクセス。 Web ページでは、プログラムの CPU 使用率、関数呼び出しの関係、呼び出し時間を表示して、パフォーマンスのボトルネックを特定できます。
3. シングルコアとマルチコアのパフォーマンスを比較する
pprof ツールを使用すると、シングルコア環境とマルチコア環境でプログラムを実行し、そのパフォーマンスを比較できます。
シングルコアとマルチコアのパフォーマンスを比較するには、プログラムの実行時に GOMAXPROCS パラメーターを設定する必要があります。
go run -race -p=1 main.go //Single- core Operation
go run -race -p=4 main.go //4 コアの実行
pprof を使用して、2 回実行されているプログラムのパフォーマンス分析を実行し、CPU 使用率と関数呼び出しの数を比較します。性能解析結果を比較することで、プログラムの性能ボトルネックを発見し、最適化することができます。
4. 概要
Golang はデフォルトでシングルコアで Goroutine を実行しますが、これではマルチコア CPU の処理能力を十分に活用できません。マルチコア CPU で Golang プログラムを実行するには、GOMAXPROCS パラメータの設定や LockOSThread 関数と UnlockOSThread 関数の使用など、マルチコア設定が必要です。
マルチコア設定の効果を評価するには、Go 独自のパフォーマンス分析ツール pprof を使用して、プログラム内のパフォーマンスのボトルネックを見つけて最適化します。
マルチコア設定により、マルチコアCPUの処理能力を最大限に活用することができ、プログラムの同時実行パフォーマンスが向上します。
以上がgolangのマルチコア設定の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。