Hatena::ブログ(Diary)

Dマイナー志向 このページをアンテナに追加 RSSフィード

2015-09-27

ISUCON5で予選敗退しましたがアクセスログ解析ツールkataribeは充実しました

「チームSELinuxはEnforcing」としてishikawa84g、matsuu、netmarkjpの3人でISUCON5に参加したものの、スコアが伸びず予選敗退となりました。

最終スコアは3886。構成はVarnish+Python+MySQLでした。

ちなみにUbuntuだったためSELinuxはインストールしておらずEnforcingにしてません。すみません。でもAppArmorは有効にしたままだよ!

当初はGo言語で実装する予定だったものの、運営からGo言語の実装にはバグがあるとの事前通知があったため、バグ解消に時間をとられるのを嫌ってPythonを選択しました。しかしPythonの知見が乏しくツラい感じでした。選択ミスった…。

やったことはMySQLのチューニング、nginx→Varnishの差し替え、SQLのチューニングなどです。

VarnishにしたのはESIで部分キャッシュを実装するためでしたが、結局部分キャッシュを実装するところまで至りませんでした。

そのあたりもあって焦りが先に来てしまいなかなかスコアを伸ばせず撃沈となりました。

アクセスログ解析ツールkataribeについて

ISUCON5の事前準備として、前回のISUCON4参加時で作ったアクセスログ解析ツールkataribeを充実させました。

元々はgoのソースコードを直接書き換えて都度go buildする仕様でしたが、TOML形式の設定ファイルでカスタマイズできるようにしました。いくつかのチームは実際にISUCON5予選で使って頂いたようで、私として嬉しい限りです。俺の屍を越えてゆけ的な。

kataribeの特徴は、正規表現で複数のリクエストを束ねられることです。

例えばISUCON5予選では、以下のように設定しました。

(一部省略)
[bundles]
  [bundles.get_profile]
  name = "GET /profile/*"
  regexp = '^GET /profile/.*'
  [bundles.post_profile]
  name = "POST /profile/*"
  regexp = '^POST /profile/.*'
  [bundles.diary_entries]
  name = "GET /diary/entries/*"
  regexp = '^GET /diary/entries/.*'
  [bundles.diary_entry]
  name = "GET /diary/entry/*"
  regexp = '^GET /diary/entry/.*'
  [bundles.post_diary_comment]
  name = "POST /diary/comment/*"
  regexp = '^POST /diary/comment/.*'
  [bundles.post_friends]
  name = "POST /friends/*"
  regexp = '^POST /friends/.*'
  [bundles.css]
  name = "GET /css/*"
  regexp = '^GET /css/.*'
  [bundles.fonts]
  name = "GET /fonts/*"
  regexp = '^GET /fonts/.*'
  [bundles.js]
  name = "GET /js/*"
  regexp = '^GET /js/.*'

すると以下のような出力が得られます。

便利!

まだまだ至らない部分もあるツールですが、今後も徐々に改善していこうと思います。まる。