[インデックス 18224] ファイルの概要
このコミットは、Go言語のランタイムプロファイリングツールであるpprof
に関連する変更です。具体的には、src/pkg/runtime/pprof/pprof.go
とsrc/pkg/runtime/pprof/pprof_test.go
の2つのファイルが変更されています。
コミット
commit 073bd0ba245395fdb9b2837fa365fb4a23eebb7a
Author: Joel Sing <jsing@google.com>
Date: Mon Jan 13 11:24:08 2014 +1100
runtime/pprof: enable profiling test on openbsd
Profiling of multithreaded applications works correctly on OpenBSD
5.4-current, so enable the profiling test.
R=golang-codereviews, minux.ma
CC=golang-codereviews
https://golang.org/cl/50940043
GitHub上でのコミットページへのリンク
https://github.com/golang/go/commit/073bd0ba245395fdb9b2837fa365fb4a23eebb7a
元コミット内容
runtime/pprof: enable profiling test on openbsd
Profiling of multithreaded applications works correctly on OpenBSD
5.4-current, so enable the profiling test.
R=golang-codereviews, minux.ma
CC=golang-codereviews
https://golang.org/cl/50940043
変更の背景
このコミットの背景には、Go言語のpprof
ツールが特定のOS(NetBSD, OpenBSD, OS X)上でマルチスレッドアプリケーションのプロファイリングを正確に行えないという既知の問題(Go issue 6047)がありました。この問題は、これらのOSがマルチスレッド環境でのプロファイリングシグナルを適切に処理しないことに起因していました。
以前のGoのバージョンでは、OpenBSDもこの問題の影響を受けるOSとして認識されており、pprof
のテストが意図的に無効化されていました。しかし、OpenBSD 5.4-currentにおいて、マルチスレッドアプリケーションのプロファイリングが正しく機能するようになったため、このコミットではOpenBSDに対するプロファイリングテストの無効化を解除し、テストを有効にする変更が行われました。これにより、OpenBSD環境でのpprof
の信頼性が向上したことを反映しています。
前提知識の解説
Go言語のpprof
pprof
はGo言語に組み込まれているプロファイリングツールです。CPU使用率、メモリ割り当て、ゴルーチン(goroutine)のブロック、ミューテックスの競合など、様々な種類のプロファイルデータを収集し、アプリケーションのパフォーマンスボトルネックを特定するのに役立ちます。pprof
は、実行中のGoプログラムからプロファイルデータを取得し、それを可視化するためのツール(例えば、Webインターフェースやグラフ生成ツール)と連携して使用されます。
マルチスレッドプロファイリング
マルチスレッドアプリケーションのプロファイリングは、単一スレッドのプロファイリングよりも複雑です。複数のスレッドが同時に実行されるため、各スレッドのCPU使用率やメモリ割り当てを正確に追跡し、それらを統合して全体的なパフォーマンス像を把握する必要があります。OSのカーネルは、プロファイリングツールが各スレッドの実行状況を監視するために必要なシグナルや情報をどのように提供するかに大きな影響を与えます。
シグナルハンドリングとプロファイリング
多くのプロファイリングツールは、OSのシグナル(例えば、SIGPROF
)を利用して、一定の間隔でプログラムの実行状態(スタックトレースなど)をサンプリングします。マルチスレッド環境では、これらのシグナルがどのスレッドに配信されるか、そしてそのシグナルハンドラがどのように動作するかが、プロファイリングの正確性に直結します。特定のOSでは、シグナルが正しく配信されなかったり、シグナルハンドラがすべてのスレッドのコンテキストを正確に取得できなかったりする問題が発生することがあります。これが、Go issue 6047で言及されている「不正確なプロファイル」の原因でした。
OpenBSD
OpenBSDは、セキュリティとコードの品質に重点を置いたUnix系オペレーティングシステムです。カーネルレベルでの変更が、Goのようなランタイムの動作に影響を与えることがあります。このコミットでは、OpenBSDの特定のバージョン(5.4-current)で、以前は問題があったマルチスレッドプロファイリングの挙動が改善されたことが示唆されています。
技術的詳細
このコミットの技術的な核心は、Goランタイムのpprof
パッケージが、特定のOS環境下でのマルチスレッドプロファイリングの正確性に関する既知の制約を解除した点にあります。
Go issue 6047では、NetBSD、OpenBSD、OS XといったOSにおいて、マルチスレッドアプリケーションのCPUプロファイルが不正確になる問題が報告されていました。これは、これらのOSがプロファイリングシグナル(SIGPROF
など)をマルチスレッド環境で適切に処理しないことに起因していました。具体的には、シグナルが特定のGoルーチン(OSスレッドにマッピングされる)にのみ配信され、他のGoルーチンの活動がプロファイルに反映されない、あるいはスタックトレースの取得が不完全になるなどの問題がありました。
このコミット以前は、pprof.go
内のコメントでOpenBSDが「不完全で不正確なプロファイル」を生成するOSとして明示的にリストアップされており、pprof_test.go
ではbadOS
マップに"openbsd": true
が設定され、OpenBSD上でのプロファイリングテストがスキップされるようになっていました。
しかし、OpenBSD 5.4-currentの改善により、この問題が解消されたと判断されました。このコミットは、その改善をGoランタイムに反映させるものです。具体的には、pprof.go
からOpenBSDに関するBUG
コメントを削除し、pprof_test.go
からbadOS
マップの"openbsd": true
のエントリを削除することで、OpenBSD上でのプロファイリングテストが再び実行されるようにしました。これにより、OpenBSD環境でのGoアプリケーションのプロファイリングが期待通りに機能することを確認できるようになります。
この変更は、GoランタイムがOSの進化に合わせてその動作を調整し、より多くのプラットフォームで正確なプロファイリング機能を提供しようとする継続的な取り組みの一部です。
コアとなるコードの変更箇所
このコミットでは、以下の2つのファイルが変更されています。
src/pkg/runtime/pprof/pprof.go
src/pkg/runtime/pprof/pprof_test.go
それぞれの変更点は以下の通りです。
src/pkg/runtime/pprof/pprof.go
--- a/src/pkg/runtime/pprof/pprof.go
+++ b/src/pkg/runtime/pprof/pprof.go
@@ -20,7 +20,7 @@ import (
"text/tabwriter"
)
-// BUG(rsc): Profiles are incomplete and inaccuate on NetBSD, OpenBSD, and OS X.
+// BUG(rsc): Profiles are incomplete and inaccuate on NetBSD and OS X.
// See http://golang.org/issue/6047 for details.
// A Profile is a collection of stack traces showing the call sequences
src/pkg/runtime/pprof/pprof_test.go
--- a/src/pkg/runtime/pprof/pprof_test.go
+++ b/src/pkg/runtime/pprof/pprof_test.go
@@ -272,9 +272,8 @@ func TestMathBigDivide(t *testing.T) {
// Operating systems that are expected to fail the tests. See issue 6047.
var badOS = map[string]bool{
- "darwin": true,
- "netbsd": true,
- "openbsd": true,
+ "darwin": true,
+ "netbsd": true,
}
func TestBlockProfile(t *testing.T) {
コアとなるコードの解説
src/pkg/runtime/pprof/pprof.go
の変更
元のコードでは、pprof.go
の冒頭に以下のコメントがありました。
// BUG(rsc): Profiles are incomplete and inaccuate on NetBSD, OpenBSD, and OS X.
// See http://golang.org/issue/6047 for details.
このコメントは、Go issue 6047で報告された問題、すなわちNetBSD、OpenBSD、OS Xの各OS上でpprof
によるプロファイルが不完全または不正確であるという既知のバグを開発者に注意喚起するためのものでした。
今回のコミットでは、このコメントからOpenBSD
が削除されました。
// BUG(rsc): Profiles are incomplete and inaccuate on NetBSD and OS X.
// See http://golang.org/issue/6047 for details.
この変更は、OpenBSD 5.4-currentにおいてマルチスレッドプロファイリングの問題が解決されたことを示しています。これにより、Go開発者はOpenBSD上でのpprof
の動作について、以前のような懸念を持つ必要がなくなったことを意味します。これは、Goランタイムが特定のOSの進化に合わせてそのサポートを更新したことを示す、重要なドキュメンテーションの変更です。
src/pkg/runtime/pprof/pprof_test.go
の変更
元のコードでは、pprof_test.go
内にbadOS
というマップが定義されており、プロファイリングテストが失敗すると予想されるOSをリストアップしていました。
var badOS = map[string]bool{
"darwin": true,
"netbsd": true,
"openbsd": true,
}
このマップは、TestBlockProfile
などのプロファイリングテストの冒頭で参照され、もし現在のOSがbadOS
に含まれていれば、テストをスキップするロジックが実装されていました。これにより、既知の問題があるOS上でのテスト失敗を回避していました。
今回のコミットでは、このbadOS
マップから"openbsd": true,
のエントリが削除されました。
var badOS = map[string]bool{
"darwin": true,
"netbsd": true,
}
この変更により、OpenBSD上でのプロファイリングテストがスキップされなくなり、通常のテストスイートの一部として実行されるようになります。これは、OpenBSD 5.4-currentでマルチスレッドプロファイリングが正しく機能するようになったという判断に基づいています。テストを有効にすることで、OpenBSD環境でのpprof
の機能が期待通りに動作することを継続的に検証できるようになります。
関連リンク
- Go issue 6047: https://github.com/golang/go/issues/6047
- Go CL 50940043: https://golang.org/cl/50940043