ホームページ > バックエンド開発 > Golang > Go パフォーマンス最適化ガイド: Go pprof をマスターする

Go パフォーマンス最適化ガイド: Go pprof をマスターする

WBOY
リリース: 2024-04-07 10:30:02
オリジナル
500 人が閲覧しました

Go パフォーマンス最適化ガイド: マスター Go pprof Go 言語には pprof パフォーマンス分析ツールが用意されており、次の手順で最適化できます。 Go pprof ツールをインストールします: go install golang.org/x/perf/cmd/pprof@パフォーマンス分析を生成する最新のファイル: pprof -seconds=5 http-server.exe 分析 パフォーマンス プロファイリング ファイル: pprof http-server.exe、コマンド ライン ツールの top、flamegraph、callgraph、および web コマンドを使用して、メモリ、CPU、および時間。実際のケース: *http.Handler インスタンスを解放するようにコードを最適化することでメモリ リークを修正し、プログラムの効率を大幅に向上させます。

Go 性能优化指南:掌握 Go pprof

Go パフォーマンス最適化ガイド: Go pprof をマスターする

はじめに

Go 言語は、開発者に役立つ強力なパフォーマンス分析ツール pprof を提供します。プログラムのパフォーマンスのボトルネックを特定して最適化します。この記事では、パフォーマンス分析に pprof を使用する方法を紹介し、実際のケースを通じて Go コードを最適化する方法を示します。

pprof のインストールと使用

  1. Go pprof ツールのインストール:
go install golang.org/x/perf/cmd/pprof@latest
ログイン後にコピー
  1. パフォーマンス プロファイリング ファイルの生成:
pprof -seconds=5 http-server.exe
ログイン後にコピー

パフォーマンス プロファイリング ファイルの分析

pprof によって生成されたファイルは、対話型コマンド ライン ツールを使用して表示および分析できます。

pprof http-server.exe
ログイン後にコピー
ログイン後にコピー

共通コマンド

  • top: 時間、CPU、メモリを最も消費する関数を表示します。
  • flamegraph: フレーム グラフを生成して、関数呼び出しの時間分布を視覚化します。
  • callgraph: 関数間の呼び出し関係を示すコール グラフを生成します。
  • web: すべての分析機能を提供する対話型 Web インターフェイスを起動します。

実践的なケース: メモリの最適化

次は、メモリ リークの問題が発生する単純化された Go コードの例です:

package main

import (
    "fmt"
    "runtime"

    "github.com/gorilla/mux"
)

func main() {
    router := mux.NewRouter()
    router.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {})

    // 在处理请求中创建大量的空结构体
    for i := 0; i < 10000; i++ {
        router.HandleFunc(fmt.Sprintf("/%d", i), func(w http.ResponseWriter, r *http.Request) {})
    }
}
ログイン後にコピー

pprof を使用してメモリ リークを分析する

  1. プログラムを実行し、メモリ プロファイリング ファイルを生成します:
pprof -allocspace=1024 http-server.exe
ログイン後にコピー
  1. 対話型コマンド ライン ツールを使用してファイルを分析します:
pprof http-server.exe
ログイン後にコピー
ログイン後にコピー
  1. 最も多く割り当てられたメモリを表示するには、次のコマンドを入力します。
top -sort=inuse
ログイン後にコピー

出力には、次のような最も多く割り当てられたオブジェクト タイプが表示されます。

Flat profile: alloc space = 1.05 GiB
   Node count   Node alloc bytes
               1       1.05 GiB       <nil>
ログイン後にコピー

これは、プログラムは大量の *http.Handler インスタンスを生成しますが、これらのインスタンスはリクエストの処理後に解放されることはありません。

コードを最適化する

メモリ リークを修正するには、コードを変更し、不要になったときに手動で解放します。*http.Handler 例:

for i := 0; i < 10000; i++ {
    path := fmt.Sprintf("/%d", i)
    router.Handle(path, http.HandlerFunc(myHandler)).Methods(http.MethodGet)
    runtime.SetFinalizer(&router.Handlers[path], func(h http.Handler) {
        h.ServeHTTP(nil, nil)
        router.Remove(path)
    })
}
ログイン後にコピー

最適化の結果

最適化されたコードを使用してプログラムを再実行し、メモリ プロファイリング ファイルを生成すると、メモリ リークが解決されたことがわかります:

Flat profile: alloc space = 20 MiB
   Node count   Node alloc bytes
               1        20 MiB       <nil>
ログイン後にコピー

結論

pprof は、開発者が Go コードのパフォーマンスを特定して最適化するのに役立つ強力なツールです。 pprof プロファイリング ファイルの生成および分析方法を理解することで、開発者はパフォーマンスの問題を迅速に特定して解決し、プログラムの効率を大幅に向上させることができます。

以上がGo パフォーマンス最適化ガイド: Go pprof をマスターするの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート