Goランタイム(スケジューラー、ガベージコレクターなど)はいくつのスレッドを使用できますか?たとえば、GOMAXPROCS
が_10
_の場合、ランタイムで使用されるカーネルスレッドはいくつですか。
Go1.5でGOMAXPROCS
をruntime.NumCPU()
に変更するための 理論的根拠 を読んでいました。 「ランタイム、特にガベージコレクターの並列処理により、GOMAXPROCS
を上げることで、単一のゴルーチンプログラムのパフォーマンスを向上させることができる」という文がありました。
私の本当の質問は、CPUクォータを持つDockerコンテナで単一のゴルーチンプログラムを実行している場合、最大のパフォーマンスを得るために必要な論理プロセッサの最小数はいくつですか。
直接的な相関関係はありません。アプリで使用されるスレッドは、10未満、10以上の場合があります。
runtime
のパッケージドキュメントからの引用:
GOMAXPROCS変数は、ユーザーレベルのGoコードを同時に実行できるオペレーティングシステムスレッドの数を制限します。実行できるスレッドの数に制限はありません。 Goコードに代わってシステムコールでブロックされました。それらはGOMAXPROCSの制限にはカウントされません。このパッケージのGOMAXPROCS関数は、制限を照会して変更します。
したがって、アプリケーションが新しいgoroutineを開始しない場合、スレッド数は10未満になります。
アプリが多くのゴルーチン(> 10)を開始し、ブロックしているものがない場合(システムコールなど)、10個のオペレーティングシステムスレッドがゴルーチンを同時に実行します。
アプリが多くのゴルーチンを開始し、システムコールで多く(> 10)がブロックされると、10を超えるOSスレッドが生成されます(ただし、ユーザーレベルのGoコードを実行するのは最大で10のみです)。
例と詳細については、この質問を参照してください。 golangでファイルを書き込む際に多くのゴルーチンがブロックされているのに、なぜ多くのスレッドが作成されないのですか?
編集(編集に応じて):
GOMAXPROCS
のデフォルト値は、論理CPUの数であると思います。これは、一般的に、最高のパフォーマンスを提供するためです。そのままにしておいてもかまいません。一般に、ゴルーチンが1つしかなく、コードがそれ以上生成されないことが確実な場合は、GOMAXPROCS=1
で十分ですが、テストする必要があり、Wordを使用しないでください。