Perl Hackers Hub

第56回 AWS X-Rayによる分散トレーシング―マイクロサービスのボトルネック,障害箇所の特定(3)

この記事を読むのに必要な時間:およそ 3 分

セグメントの詳細を確認する

トレースの詳細画面では,そのトレースに含まれるすべてのセグメントが時系列に沿って並んでいます図4⁠。全体の処理に要した3.5秒のうち,ひときわ大きく見える最初のDBI::st(DBIモジュールによるデータベースへのクエリ発行処理)のセグメントをクリックすると,セグメントの詳細が開きます図5⁠。

図4 /info?cursor=0のトレース詳細

図4 /infocurso

図5 DBI:stセグメント詳細

図5 DBI:stセグメント詳細

セグメントが持っている情報として,自身のID,親のID,開始時刻と終了時刻のほかにも各種タブが並んでいます。SQLのタブでは発行されたクエリが,メタデータのタブではクエリに付随する情報が閲覧できます図6⁠。

図6 発行されたSQL

図6 発行されたSQL

メタデータのrowsは,クエリによってデータベースから返却された行数です。図7では,23万行以上を読み取っていることがわかります。しかし,このクエリを発行しているアプリケーションのソースコード注6をよく読むと,実はこのクエリ結果は最初の1行しか使われていないことがわかります。

図7 メタデータ

図7 メタデータ

つまり,大量の行を読み取っているのは単に無駄な処理です。最初の1行のみが必要ならば,クエリの最後にLIMIT 1を追加するだけでアプリケーションの仕様を変えずにパフォーマンスを向上できるのではないか,と予想がつきます。

注6)
クエリにコメントで埋め込まれているIsucoin/Model.pmの414行目です。
パフォーマンスの改善

実際にクエリの最後にLIMIT 1を追加して,再度ベンチマークを実行したあとのURL別集計を図8に示します。初期状態では平均レイテンシが3.4秒だった/info?cursor=0が,平均1.0秒まで改善しました。

図8 レイテンシが1.0秒に改善

図8 レイテンシが1.0秒に改善

分散アプリケーションへの組込み

ここまでは,スタンドアローンのアプリケーションから発行されたデータベースへのクエリを可視化して解析しました。実際に競技でチューニングするアプリケーションは,外部へのHTTPS APIの呼び出しを多数行う分散アプリケーションです。

ISUCON8での競技中は,isucoinアプリケーションからHTTPを受信するアプリケーションは,運営が提供するサーバで動作するブラックボックスで改変は不可能でした。しかし,ここでは分散アプリケーションの可視化の例として,ブラックボックス側にもトレースを組込みます。

外部へのHTTPリクエストにトレースIDを送信する

外部APIに対するHTTPリクエストヘッダに呼び出しもとのID を設定するため,webapp/perl/lib/Isubank.pmに手を入れて,X-Amzn-Trace-Idに$seg->trace_headerの値を渡します。差分を次に示します。

Isubank.pm

sub _request {
  my ($self, $p, $v) = @_;
  my $body = encode_json $v;
  my $res;
  capture "Isubank::_request", sub {
    my $seg = shift;
    try {
      $res = $self->client->post(
        $self->endpoint . $p,
        [
          "Content-Type" => "application/json",
          "Authorization" => "Bearer ".$self->app_id,
          "X-Amzn-Trace-Id" => $seg->trace_header,
        ],
        $body,
      );
    } catch {
(省略)
  };

誌面の都合で詳しくは説明しませんが,外部APIのブラックボックス側にも競技アプリケーション同様X-Ray daemonを起動する設定を行い,SDKを組込みます。

分散アプリケーションの解析

ブラックボックス側にもトレースを組込み,アプリケーションからトレースIDを送信した状態でベンチマークを実行すると,X-Ray consoleのサービスマップは図9のようになりました。

図9 サービスマップ

図9 サービスマップ

isucoinからブラックボックス側のisubank,isuloggerノードに矢印が伸びて,呼び出しが伝わっていることがわかります。

図10のトレースの詳細では,別々のプロセスで動作しネットワークで通信しているisucoin,isubank,isuloggerの各アプリケーションが,一連の処理を行っている状況が時系列で把握できます。

図10 複数アプリケーションのトレースが統合されて見える

図10 複数アプリケーションのトレースが統合されて見える

まとめ

本稿では,分散トレーシングを活用して,多数のコンポーネントが連携して処理を行う分散アプリケーションの障害解析やパフォーマンスチューニングを容易にする方法を紹介しました。

AWS X-Rayのほかにも多数の事業者やOSSが製品を提供しています。みなさんの環境に合ったトレーシングシステムを組み込んで,よりよいシステム運用を行うきっかけになったら幸いです。

さて,次回の執筆者は門松宏明さんで,テーマは「自作ツールによる日常業務効率化」です。お楽しみに。

WEB+DB PRESS

本誌最新号をチェック!
WEB+DB PRESS Vol.125

2021年10月23日発売
B5判/168ページ
定価1,628円
(本体1,480円+税10%)
ISBN978-4-297-12435-9

  • 特集1
    作って学ぶプログラミング言語のしくみ
    インタプリタ,構文解析器,文法
  • 特集2
    GraphQL完全ガイド
    RESTの先へ! フロントエンドに最適化されたAPI
  • 特集3
    速習DynamoDB
    AWSフルマネージドNoSQLの探求

著者プロフィール

藤原俊一郎(ふじわらしゅんいちろう)

2011年より面白法人カヤック。技術部SREチームリーダー。ISUCON優勝3回,出題2回。最近の趣味はマネージドサービスの隙間を埋める隙間家具のようなツールをGoで作ってOSSにすること。著書に『みんなのGo言語[現場で使える実践テクニック]』(共著,技術評論社)。

URL:https://sfujiwara.hatenablog.com/