おおざっぱなWebサービスの感じを掴むクエリをPrestoで投げてみる


あんまりTreasureData固有のtipsじゃないよね!っていうのはさておき4日目です。
今日はおおざっぱにWebサービスの感じ(どこがおそいのかー、とか)をしらべるクエリを共有しておこうと思います。

前提条件

各種ページの情報(下記参照)をTreasureDataに出力している

ページ名と処理時間、logが記録された時間を作っておきます。

action: ページのアクション名(例えばhomeとか)
elapsed: 処理時間
time: イベント時間

elapsedのpercentileを求め、大雑把な傾向を掴む

そもそもpercentileってなんぞ?って話もあるかもしれませんが特定の値を順番に並べていって何番目らへんか、っていうのがpercentileです。0.50ならmedian(中央値)となりますのでだいたい平均的な値。

select 
    action, 
    count(action) as pv,
    MAX(elapsed) AS max_elapsed, 
    approx_percentile(elapsed, 0.98) as elapsed_98, 
    approx_percentile(elapsed, 0.80) as elapsed_80, 
    approx_percentile(elapsed, 0.70) as elapsed_70, 
    approx_percentile(elapsed, 0.60) as elapsed_60, 
    approx_percentile(elapsed, 0.5) as elapsed_50, 
    approx_percentile(elapsed, 0.3) as elapsed_30 
from 
    access_log
where 
    TD_TIME_RANGE(time, '2014-12-01 00:00', '2014-12-01 23:59:59', 'JST')
group by action

すごく単純なクエリですがこういうクエリの結果をソートしたりすると
どこが重要か、重要ではないけれど問題があるのかというのがわかります。

実際問題としてはずれ値(外部起因の障害などがあった)やアプリケーションの傾向(特定時間に行われるイベントによる影響)なども考慮しなければいけないのでこれだけを見て考察を深めるのは良くないですが、なんとなく感じをつかめるようになると色々便利です。

参考までに考え方

・elapsed_50と他の値がそんなに剥離していない、かつ早く終わっている
→お行儀の良いページ(優秀!)

・elapsed_70, 80〜あたりの処理時間がmedianから離れている
→特定のユーザー・条件等で重たくなるような動作がある(行動ログ溜まりすぎてクソクエリ投げてる、とか。特定条件でクソループに入ってる、とか)

・elapsed_30は速いけどその他は遅め
→キャッシュが特定の部分だけ効いてるけど全般的に効いていない、とか。

ここらへんの考察は実際にアプリケーション組んでないと想像しがたいところがありますが、問題をみつけたら原因をしらべてみることでだんだんと引き出しが増えていきます。

それでは!