morisolog

ソフトウェア関連の技術書まとめ:新卒3年目エンジニア

ISUCON12に参加してきました

ISUCON12に参加してきました。

チーム名:otemoto

結果:5444 otemoto 3回の再現スコア計測で85%以下のスコアしかでなかったため失格

理由はツイートの通り、競技終了後にインスタンスを停止、削除していたからでした。

何やってるんだと自分自身に落胆してますが、マニュアルを読んでいなかったせいです。

失敗して気づく学びもありますが、失敗しないに越したことはないです。無念…

ISUCON 初挑戦 かつ 一人での参戦ということで 出来たことにかなり限りがありましたが、「手を施したことでスコアが上がる」という体験はとても心地よかったです。

ISUCON運営の皆様本当にありがとうございました。

以下、競技中にやったことを軽く書き連ねておきます。

競技中にやったこと

午前中はアプリケーションをブラウザで確認したり、各種計測ツール(alp, pt-query-digest)の導入、slow-queryの設定、 nginxのアクセスログ設定などをおこなっていました。

nginxのアクセスログフォーマットをltsvに変更するのに嵌ったのが痛手でした。

log_format ltsv "time:$time_local"
                "\thost:$remote_addr"
                "\tforwardedfor:$http_x_forwarded_for"
                "\treq:$request"
                "\tstatus:$status"
                "\tmethod:$request_method"
                "\turi:$request_uri"
                "\tsize:$body_bytes_sent"
                "\treferer:$http_referer"
                "\tua:$http_user_agent"
                "\treqtime:$request_time"
                "\tcache:$upstream_http_x_cache"
                "\truntime:$upstream_http_x_runtime"
                "\tapptime:$upstream_response_time"
                "\tvhost:$host";
access_log  /var/log/nginx/access.log  ltsv; #<-ここにltsv指定するの忘れてた

午後からはスロークエリを見たり、alpから重いエンドポイントを調査したりしました。具体的には

  • 一意なID生成でDBアクセスしてたのでGo上でUUID生成
    • スコアが3,200から4,800に上がった
  • MySQL visit_history テーブルへのインデックス追加、SQLite3へのインデックス追加
    • スコアは4,800から5,600に

などを行いました。

課題

SQLiteの扱いに慣れていなかった

前提として、ISUCONでは「できることをやる」時間しかない。

SQLiteを組み込んだ経験がなく、改善にどのくらい時間がかかるのか想像できなかったので改善には着手できなかった。

サーバー分割ができなかった

せめてAPIサーバーとMySQLは別々のサーバーで動かしたかったが、方法が分からず断念した。

参戦時のリポジトリはこちらです GitHub - moritasoshi/isucon12q