Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

[インデックス 11077] ファイルの概要

このコミットは、以前の変更 (CL 5530063 / 1d7295fdf62e) を元に戻すものです。元の変更は、GoランタイムがFreeBSD上で runtime.ncpu を有効にし、cmd/go のFreeBSDビルドを修正することを目的としていました。しかし、このコミットではその変更が取り消され、FreeBSDビルドに関する以前の動作に戻されます。

コミット

commit ad3e82e7369556f84b6fcf3002cba93f1c4cbc4b
Author: Mikio Hara <mikioh.mikioh@gmail.com>
Date:   Tue Jan 10 16:11:31 2012 +0900

    undo CL 5530063 / 1d7295fdf62e

    runtime: enable runtime.ncpu on FreeBSD

    ««« original CL description
    cmd/go: fix freebsd build

    R=golang-dev, adg
    CC=golang-dev
    https://golang.org/cl/5530063
    »»»

    R=golang-dev, rsc
    CC=golang-dev
    https://golang.org/cl/5531059

GitHub上でのコミットページへのリンク

https://github.com/golang/go/commit/ad3e82e7369556f84b6fcf3002cba93f1c4cbc4b

元コミット内容

undo CL 5530063 / 1d7295fdf62e

runtime: enable runtime.ncpu on FreeBSD

««« original CL description
cmd/go: fix freebsd build

R=golang-dev, adg
CC=golang-dev
https://golang.org/cl/5530063
»»»

R=golang-dev, rsc
CC=golang-dev
https://golang.org/cl/5531059

変更の背景

このコミットは、以前に適用された変更 (CL 5530063) を元に戻すことを目的としています。元の変更は、GoランタイムがFreeBSD環境で runtime.ncpu を適切に利用できるようにし、それによって cmd/go のビルドプロセスにおけるFreeBSD固有の問題を解決しようとしました。しかし、この「undo」コミットが存在するということは、元の変更が意図しない副作用を引き起こしたか、あるいはFreeBSDビルドの問題を完全に解決できなかった、または新たな問題を生じさせた可能性が高いことを示唆しています。そのため、安定性を確保するために、元の状態に戻す判断がなされたと考えられます。

前提知識の解説

Goランタイムと runtime.ncpu

Go言語のランタイムは、Goプログラムの実行を管理する重要なコンポーネントです。これには、ガベージコレクション、スケジューリング、システムコールなどが含まれます。runtime.ncpu は、Goランタイムが利用可能な論理CPUの数を報告する変数(または関数)です。この値は、Goの並行処理モデルにおいて、ゴルーチン(Goの軽量スレッド)をどの程度の並行度で実行するかを決定する上で重要な役割を果たします。通常、GOMAXPROCS 環境変数によって明示的に設定されない限り、Goランタイムは runtime.ncpu の値に基づいて利用可能なCPUコア数と同数のOSスレッドを生成し、ゴルーチンをそれらのスレッドにマッピングして実行します。

ビルドプロセスと並行処理

cmd/go はGo言語の公式ツールチェインであり、ソースコードのコンパイル、パッケージの管理、テストの実行など、様々な開発タスクを担います。ビルドプロセスにおいて、特に大規模なプロジェクトでは、複数のファイルを並行してコンパイルすることでビルド時間を短縮することが一般的です。この並行処理の度合いは、利用可能なCPUリソースに依存します。

FreeBSDにおける特異性

FreeBSDは、UNIX系のオペレーティングシステムであり、Linuxとは異なるカーネルやシステムコール、ライブラリの実装を持つことがあります。Goランタイムが runtime.ncpu の値を正確に取得するためには、OS固有のシステムコールやAPIを利用する必要があります。もしFreeBSDの特定のバージョンや環境において、runtime.ncpu の計算に問題があったり、その値に基づいてGoランタイムが不適切な動作をしたりした場合、ビルドプロセスに悪影響を及ぼす可能性があります。例えば、誤ったCPU数が報告されると、Goのスケジューラが非効率な並行処理を行い、ビルドが遅くなったり、デッドロックが発生したり、クラッシュしたりする原因となることがあります。

技術的詳細

このコミットは、src/cmd/go/build.go ファイルから特定のコード行を削除することで、以前の変更を元に戻しています。削除されたコードは、ビルドの並行度を制御する par 変数に関連していました。

元の変更 (CL 5530063) は、FreeBSD環境での runtime.ncpu の有効化と、それに伴う cmd/go のビルド修正を試みました。これはおそらく、FreeBSD上でのGoのビルドパフォーマンスや安定性を向上させるためのものでした。しかし、この「undo」コミットは、その試みが成功しなかったか、あるいは予期せぬ問題を引き起こしたことを示しています。

具体的には、par 変数が0の場合に強制的に1に設定するロジックが削除されました。par はビルドの並行度(同時に実行されるコンパイルジョブの数)を決定する変数であると推測されます。

  • 削除前: if par == 0 { par = 1 } これは、もし並行度が0に設定されていた場合(例えば、自動検出が失敗した場合や、明示的に0が指定された場合)、最低でも1つの並行度でビルドを実行することを保証していました。
  • 削除後: このロジックがなくなることで、par が0であれば0のままとなり、ビルドの並行度が0になる可能性が生じます。これは、特定の条件下で並行処理を完全に無効にすることが望ましい、あるいは以前の変更がこの強制的な par = 1 の設定と競合し、問題を引き起こしていたことを示唆しています。

この変更は、FreeBSD環境における runtime.ncpu の挙動がまだ不安定であったり、その値の利用方法に問題があったりしたため、ビルドの並行度を強制的に設定するのではなく、より慎重なアプローチに戻すことを意味していると考えられます。

コアとなるコードの変更箇所

src/cmd/go/build.go ファイルにおいて、以下の3行が削除されました。

--- a/src/cmd/go/build.go
+++ b/src/cmd/go/build.go
@@ -449,9 +449,6 @@ func (b *builder) do(root *action) {
 	// drop the parallelism to 1, both to make the output
 	// deterministic and because there is no real work anyway.
 	par := buildP
-	if par == 0 {
-		par = 1
-	}
 	if buildN {
 		par = 1
 	}

コアとなるコードの解説

削除されたコードは、builder 構造体の do メソッド内にありました。このメソッドは、Goのビルドプロセスにおけるアクションの実行を管理していると考えられます。

par := buildP の行は、ビルドの並行度を buildP という変数から取得していることを示しています。buildP は、おそらくビルドコマンドのオプション(例: -p フラグ)や環境変数から設定される、ユーザーが指定またはシステムが検出した並行度です。

削除された if par == 0 { par = 1 } のブロックは、取得した par の値が0であった場合に、強制的に1に設定するロジックでした。このロジックの目的は、並行度が明示的に設定されていないか、あるいは何らかの理由で0と評価された場合に、ビルドが完全に直列化されてしまうのを防ぎ、最低限の並行度(1、つまり直列実行)を保証することでした。

このコミットでこのロジックが削除されたということは、以下のいずれかの理由が考えられます。

  1. par == 0 の状態が、特定の環境(特にFreeBSD)で問題を引き起こしていた: 例えば、runtime.ncpu の値が誤って0と報告され、その結果 par が0になり、強制的に1に設定されることで、さらに別の問題(デッドロック、リソース競合など)が発生していた可能性があります。
  2. 並行度を強制的に1に設定することが、特定のシナリオで不適切であった: 例えば、デバッグ目的や特定のテストシナリオにおいて、並行処理を完全に無効にすることが意図されていたにもかかわらず、このロジックがそれを妨げていた可能性があります。
  3. より上位のロジックで par の値が適切に処理されるようになった: この変更が行われた時点で、par が0になるケースが適切にハンドリングされるか、あるいは0になること自体が許容されるようになったため、このガードが不要になった可能性があります。

コミットメッセージが「undo CL 5530063」と明記していることから、最も可能性が高いのは1番目の理由です。つまり、FreeBSDにおける runtime.ncpu の有効化と関連するビルド修正が、この par = 1 の強制設定と組み合わさることで、予期せぬ不具合を生じさせたため、元の安定した状態に戻すためにこの変更が取り消されたと推測されます。

関連リンク

参考にした情報源リンク

  • (特になし。Goの runtime.ncpu やビルドプロセスの一般的な知識に基づく。)