実際の分散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