実際の分散Webアプリケーションの解析
(3)
例として、
この問題をチューニングするには、
完全な問題、https://で公開されています。本稿における改変を含めたリポジトリは、https://で公開しています。
単体アプリケーションへの組込み
まず競技者がチューニングを行う対象であるWebアプリケーションのPerl実装に、
X-Ray daemonを起動する
ISUCON8の初期実装はDocker Composeで提供されています。リポジトリ内のwebapp/に、
services:
  isucoin:
    environment:
      (省略)
      AWS_XRAY_DAEMON_ADDRESS: 'xray:2000'
    links:
      - mysql
      - xray
  xray:
    image: amazon/aws-xray-daemon:latest
    command:
      - --local-mode
    environment:
      AWS_REGION: ap-northeast-1
      AWS_ACCESS_KEY_ID: 123456789012
      AWS_SECRET_ACCESS_KEY: xxxxxxxxxxx競技者がチューニングするWebアプリケーションはisucoinと呼ばれ、xray:2000を指定します。
X-Ray daemonからAWSにトレースを送信するために、
コードにAWS::XRayを組み込む
アプリケーションが起動するエントリポイントであるwebapp/ファイルに、useして、enableしているだけです。太字が追加箇所です。
use Isucoin::Web;
use Devel::KYTProf;
use Devel::KYTProf::Logger::XRay;
use AWS::XRay;
Devel::KYTProf->logger("Devel::KYTProf::Logger::XRay");
my $root_dir = File::Basename::dirname(__FILE__);
my $app = Isucoin::Web->psgi($root_dir);
builder {
  enable 'XRay',
    name => 'isucoin';モジュールのインストールを行うために、cpanfileにrequiresを追加します。
requires 'Devel::KYTProf', '0.9992';
requires 'AWS::XRay', '0.08';
requires 'Plack::Middleware::XRay', '0.06';
requires 'Devel::KYTProf::Logger::XRay', '0.04';これでAWS::XRayの組込みと、
競技アプリケーションを起動し、
xray_1     | 2019-04-16T15:16:58Z [Info] Initializing AWS
X-Ray daemon 3.0.0
xray_1     | 2019-04-16T15:18:24Z [Info] Successfully sent
batch of 7 segments (1.432 seconds)実際の競技時におけるアプリケーションのパフォーマンスを解析するために、
X-Ray console による解析
ベンチマークを実行後にX-Ray consoleを見ると、
 
この画面にはX-Ray daemonが送信したトレースが可視化されています。個々の丸いノードがセグメントで、
処理の絞り込み
isucoinをクリックすると、
 
ここでレイテンシが3秒以上の遅い処理を選択して/info?cursor=0を選択し
 
セグメントの詳細を確認する
トレースの詳細画面では、
 
 
セグメントが持っている情報として、
 
メタデータのrowsは、
 
つまり、LIMIT 1を追加するだけでアプリケーションの仕様を変えずにパフォーマンスを向上できるのではないか、
パフォーマンスの改善
実際にクエリの最後にLIMIT 1を追加して、/info?cursor=0が、
 
分散アプリケーションへの組込み
ここまでは、
ISUCON8での競技中は、
外部へのHTTPリクエストにトレースIDを送信する
外部APIに対するHTTPリクエストヘッダに呼び出しもとのID を設定するため、webapp/に手を入れて、X-Amzn-Trace-Idに$seg->trace_の値を渡します。差分を次に示します。
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 {
(省略)
  };誌面の都合で詳しくは説明しませんが、
分散アプリケーションの解析
ブラックボックス側にもトレースを組込み、
 
isucoinからブラックボックス側のisubank、
図10のトレースの詳細では、
 
まとめ
本稿では、
AWS X-Rayのほかにも多数の事業者やOSSが製品を提供しています。みなさんの環境に合ったトレーシングシステムを組み込んで、
さて、
本誌最新号をチェック!
WEB+DB PRESS Vol.130
2022年8月24日発売
B5判/
定価1,628円
ISBN978-4-297-13000-8
- 特集1
 イミュータブルデータモデルで始める
 実践データモデリング
 業務の複雑さをシンプルに表現!
- 特集2
 いまはじめるFlutter
 iOS/Android両対応アプリを開発してみよう 
- 特集3
 作って学ぶWeb3
 ブロックチェーン、スマートコントラクト、 NFT 


