2013年5月5日日曜日

LogParser でIIS解析



ご参考までに、個人的に解析するのは以下です。
なお、システムの特性次第ですが、サンプル数などを加味すると
週単位での解析くらいがベターだと思います。


なお、コマンドプロンプトなどからの実行する場合、
対象のログは1ファイルにまとめておいて、コマンドを1行で実行してください。



①日別アクセス数

継続的にアクセス数が伸びているか?特定日、曜日にアクセス数が集中傾向にあるか?など
システムの特性をつかむ上で取得する情報。


LogParser -stats:OFF -i:iisw3c -o:CSV
  "SELECT
    TO_DATE(TO_LOCALTIME(TO_TIMESTAMP( date , time ))) AS "日付",
    COUNT(cs-uri-stem) AS "アクセス数"
  FROM IIS.log
  GROUP BY TO_DATE(TO_LOCALTIME(TO_TIMESTAMP( date , time ))) "


動かすプログラムの品質が安定していれば、
アクセス数に基づいたサーバのスケールアウトなども考えやすいが・・・
実態はそうでもないシステムも多い。


②実行時間の長いリクエストTop100

実行時間が長いプログラムの特定を行う。

動かすプログラムの品質が安定していれば、
ほとんどの処理は各システムで定義した規定時間に収まっているはずなので、
検索対象の件数が増えるオプションが指定可能だったり、
想定外のロジックを通っていたり、NW負荷が思いのほか上昇しているプログラムを
特定してシステムとしての品質改善を目指す。


LogParser -stats:OFF -i:iisw3c -o:CSV
  "SELECT
    TOP 100 TO_DATE(TO_LOCALTIME(TO_TIMESTAMP( date , time ))) AS "日付",
    TO_LOCALTIME(time) AS "時刻" ,
    REVERSEDNS(s-ip) AS Server,
    REVERSEDNS(c-ip) AS Client,
    sc-status, cs-uri-stem, time-taken,
    sc-bytes,  cs-bytes
  FROM IIS.log
  ORDER BY time-taken DESC "

ただし、請け負ったシステムでそんな安定しているところは見たことがありません。。。
日々格闘です。



③ソース毎の最大値、平均値

対象となるプログラム毎に実行時間、送信/受信などの特性をつかむために実施する。


②とあわせで改善する優先順位を決めることに用いる。
  • 平均値がシステムとしての規定値を超える場合、プログラムとしてのロジックを見直す。
  • IISで設定しているタイムアウト値を超えたり、NW負荷が上昇している場合、原因となるプログラムとオプションを特定して対策を行う。

LogParser -stats:OFF -i:iisw3c -o:CSV
  "SELECT cs-uri-stem, count(cs-uri-stem),
    max(time-taken) AS "最大実行時間",
    max(sc-bytes) AS "サーバーが送信した最大バイト数",
    max(cs-bytes) AS "サーバーが受信した最大バイト数",
    avg(time-taken) AS "平均実行時間",
    avg(sc-bytes) AS "サーバーが送信した平均バイト数",
    avg(cs-bytes) AS "サーバーが受信した平均バイト数"
  FROM IIS.log GROUP BY cs-uri-stem "

うーん・・・どれも悪すぎて改修する優先順位が決まらん。


④HTTPステータスコードサマリ

HTTPステータスコードが「404」や「500」などの発生状況を確認する。

LogParser -stats:OFF -i:iisw3c -o:CSV
  "SELECT
sc-status,cs-uri-stem,count(*) as "実行数"
    FROM 本番IIS.log
    GROUP BY sc-status,cs-uri-stem WITH ROLLUP order by sc-status"


HTTPステータスの30%が「200」以外で返ってくるミラクルなシステムもありました。。。


⑤1分毎のアクセス数

サーバ負荷の分析、ピーク時間を可視化するために使用。
秒間だと傾向が埋もれてみれなかったりするので、分単位にしています。

LogParser -stats:OFF -i:iisw3c
"SELECT
TO_STRING(TO_LOCALTIME(TO_TIMESTAMP(date,time)), 'hh:mm') AS "時刻",
count(to_string(TO_LOCALTIME(TO_TIMESTAMP( date , time )),'ddd')) AS "時間別アクセス数(分単位)"
INTO 1分毎のアクセス数.gif
FROM IIS.log
GROUP BY "時刻"
ORDER BY "時刻"
ASC "
-chartType:LineStacked -groupSize:1024x768



サンプル:


働いている時間が同じだから集中しても仕方ない。。。

⑥1秒毎のアクセス数

⑤とほぼ同じ考え方だが、サーバのスケールアウトなどを考えるための分析。

LogParser -stats:OFF -i:iisw3c
"SELECT
TO_STRING(TO_LOCALTIME(TO_TIMESTAMP(date,time)), 'hh:mm:ss') AS "時刻",
count(to_string(TO_LOCALTIME(TO_TIMESTAMP( date , time )),'ddd')) AS "時間別アクセス数(秒単位)"
INTO 1秒毎のアクセス数.gif
FROM IIS.log
GROUP BY "時刻"
ORDER BY "時刻"
ASC "
 -chartType:LineStacked -groupSize:1024x768



まとめ


上記をバッチファイルで自動分析し、出力結果をHTML形式にまとめることで
レポート出力を自動化することもできる。

但し、レポートを出力することが目的ではなく、
自動化して蓄積したデータからシステムの特性を分析し、運用に役立てることが重要。

なお、所詮IISのログ分析なので、詳細を追っていくとなると
パフォーマンスモニタなどを仕込む必要がある。


でも、分かっている人は少ない。。。

0 件のコメント:

コメントを投稿