囲碁パフォーマンスチューニング|ユースキャンプノート

仲間ノート作成活動「第五回青少年合宿」参加10日目です。

序文

この記事では、主に実際の業務サービスのパフォーマンス最適化の事例と、比較的複雑なロジックを持つプログラムのパフォーマンス最適化を行う方法を紹介します。

最適化の種類は、ビジネス サービスの最適化、基本的なライブラリの最適化、および Go 言語の最適化に分けることができます。

ビジネス サービスの最適化

基本的な考え方

  • サービス: 独立して展開でき、特定の機能を実行できるプログラム
  • 依存性: ServiceA の関数実装は、ServiceA と呼ばれる ServiceB の応答結果に依存します ServiceB に依存します
  • 呼び出しリンク: インターフェース要求とそれらの相互依存関係をサポートできる一連の関連サービス
  • 基本ライブラリ: 公開ツールキット、ミドルウェア

画像.png

上の図は、システム デプロイメントの簡単な図です。クライアント リクエストは、ゲートウェイによって転送され、さまざまなビジネス サービスによって処理されます。ビジネス サービスは、他のサービスに依存する場合があり、ストレージやメッセージ キューなどのコンポーネントに依存する場合もあります。

次に、ビジネス サービスの最適化を例として、パフォーマンス チューニングのプロセスを説明します. 図の ServiceB は、ServiceA に依存し、ストレージと ServiceD にも依存しています。

プロセスを最適化する

  1. サービス性能評価手段の確立
  2. パフォーマンス データを分析し、パフォーマンスのボトルネックを特定する
  3. 主な最適化項目のレトロフィット
  4. 最適化効果検証

サービス性能評価手段の確立

  • サービス性能評価方法
    • 単一のベンチマークでは、複雑なロジック分析を満足させることはできません
    • 異なる負荷条件下でのパフォーマンスの違い
  • リクエストのトラフィック構造
    • 異なるリクエスト パラメータのオーバーライド ロジックが異なる
    • 実際のオンライン トラフィック
  • 圧力範囲
    • スタンドアロン圧力試験
    • クラスター圧力試験
  • 性能データ取得
    • スタンドアロンのパフォーマンス データ
    • クラスタ パフォーマンス データ

ロジックが複雑なため、リクエストパラメータが異なれば処理ロジックも異なり、対応するパフォーマンスも異なります.実際のパフォーマンスのボトルネックを分析するには、可能な限りオンラインで実際の状況をシミュレートする必要があります.

プレッシャー テストでは、オンライン リクエスト トラフィックを記録し、再生速度を制御してサービスをテストします. テスト スコープは、単一のインスタンスまたはクラスター全体にすることができます. 同様に、パフォーマンス コレクションも、単一のマシンとクラスターを区別します.

評価方法が確立された後、サービスパフォーマンス指標分析レポートが生成されます。

実際のストレス テスト レポートでは、ストレス テスト中のサービスのさまざまな監視指標 (qps、遅延など) がカウントされます。同時に、ストレス テスト プロセス中に、サービスの pprof データも収集され、パフォーマンスの問題が発生する可能性があります。前の方法で分析できます。

パフォーマンス データの分析

パフォーマンス データを分析し、パフォーマンスのボトルネックを特定する

サービス最適化前のパフォーマンス レポートといくつかのパフォーマンス サンプリング データを使用して、パフォーマンスのボトルネック分析を実行できます。

业务服务常见的性能问题可能是使用基础组件不规范

比如下面代码,每次使用配置时都会进行json解析,拿到配置项,实际组件内部提供了缓存机制,只有数据变更的时候才需要重新解析json。

画像.png

还有可能是:高并发场景优化不足

画像.png

画像.png

上边是服务高峰期的火焰图,下边是低峰期的火焰图,可以发现metrics,即监控组件的CPU资源占用变化较大,主要原因是监控数据上报是同步请求,在请求量上涨,监控打点数据量增加时,达到性能瓶颈,造成阻塞,影响业务逻辑的处理,后续是改成异步上报的机制提升了性能。

重点优化项改造

定位到性能瓶颈后,修改完后能直接发布上线吗?

  • 正确性是基础
  • 响应数据diff
    • 线上请求数据录制回放
    • 新旧逻辑接口数据diff

性能优化的前提是保证正确性,在变动较大的性能优化上线之前,还需要进行正确性验证,因为线上的场景和流程太多,所以要借助自动化手段来保证优化后程序的正确性。

线上请求的录制,要包含请求参数录制、返回内容录制,重放时对比优化前后返回内容进行正确性验证。

优化效果验证

  • 重复压测验证
  • 上线评估优化效果
    • 关注服务监控
    • 逐步放量
    • 收集性能数据

改造完成后,可以进行优化效果验证了。

验证分两部分,首先依然是用同样的数据对优化后的服务进行压测。

正式上线的时候会逐步放量,记录真正的优化效果。

压测并不能保证和线上表现完全一致,有时还要通过线上的表现再进行分析改进,是个长期的过程。

进一步优化

进一步优化,服务整体链路分析

  • 规范上游服务调用接口,明确场景需求
  • 分析链路,通过业务流程优化提升服务性能

基础库优化

基础库优化使用范围更广,在实际的业务服务中,为了评估某些功能上线后的效果,经常需要进行AB实验,看看不同策略对核心指标的影响,所以公司内部多数服务都会使用AB实验的SDK,如果能优化AB组件库的性能,所有用到的服务都会有性能提升。

ビジネス サービスの最適化プロセスと同様に、まず各サービスの AB コンポーネントのリソース使用量をカウントし、AB コンポーネントのどのロジックがより多くのリソースを消費しているかを確認し、重要な最適化のために共通の問題を抽出します。

SDK の最適化には主に次のものが含まれます。

  • 基本ライブラリのコア ロジックとパフォーマンスのボトルネックを分析する
    • 改修計画の設計と改善
    • オンデマンドのデータ
    • データシリアライゼーションプロトコルの最適化
  • 内圧試験検証
  • プロモーション事業サービス上陸確認

Go 言語の最適化

Go 自体の最適化は、コンパイラとランタイムのメモリ割り当て戦略を最適化し、より効率的な go リリース バージョンを構築します。

Go 言語の最適化は、主に次のようなコンパイラとランタイムの最適化です。

  • メモリ割り当て戦略を最適化する
  • コードのコンパイル プロセスを最適化して、より効率的なプログラムを生成する
  • 内圧試験検証
  • プロモーション事業サービス上陸確認

この最適化ソリューションは簡単にアクセスでき、エディターのコンパイル構成を調整するだけでよく、強力な汎用性を備えています。

要約する

  • パフォーマンス チューニングの原則
    • 当て推量ではなくデータに頼る
  • パフォーマンス分析ツール
    • pprof ツールを使用してパフォーマンスの問題をトラブルシューティングし、その基本原則を理解することに精通している
  • 性能調整
    • 正確性の保証
    • 主要なボトルネックの特定

引用

パフォーマンス チューニングの実際のケース

おすすめ

転載: juejin.im/post/7194236380300951609