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

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

このコミットは、Go言語のランタイムプロファイリングツールであるpprofに関連する変更です。具体的には、src/pkg/runtime/pprof/pprof.gosrc/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つのファイルが変更されています。

  1. src/pkg/runtime/pprof/pprof.go
  2. 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の機能が期待通りに動作することを継続的に検証できるようになります。

関連リンク

参考にした情報源リンク