2013年10月7日月曜日

Isucon #3に出場してチームをお通夜にしてしまった話

俺の大ポカに巻き込まれたチームメイトの @studio3104 さんと @ayumu83s さんごめんなさい。
俺がしでかしたことをありのまま話すぜ。


  • 取り敢えず吊るしのベンチマークを取る。
  • 開始早々、MySQL 5.6.13をPercona Server 5.6.13に取替え。
    • この時、datadirは使い回しでバックアップを取らなかった。
  • my.cnfをチューニングしてibdata1とib_logfile*を再作成。
    • その間アプリ側ではTCP/IP接続をsocket接続に書き換えてもらったり、プロファイル仕込んでもらったり。
  • この時点からベンチマークが通らなくなる。
    • 原因はInnoDB memcachedを殺したからなんですがこの時点では判らず。
    • アプリ側のコードを切り戻したりPercona ServerをMySQLに戻したりしたけれど、ベンチマークは相変わらずFAILする。
  • すたじおさんの到着も遅れていたし、取り敢えずエラーは後で解析するとして判るところからチューニングを開始することに。
  • テーブルにINDEXをガスガス追加。INSERT, UPDATEのトラフィックは大したことがなさそうだったので、基本covering index狙いの長めのキー。covering indexが狙えないところはORDER BY狙いのキー。
  • Percona Serverだろうとオプティマイザーは残念な感じなので、片っ端からUSE INDEXを付けてインデックスを固定。あと、変なループがあるって教えてもらったのでJOINに書き換え。
    • このJOINも、最終的にはスコアが下がったっていって切り戻したんだけど(´・ω・`)
  • Apacheをnginxに入れ替えたりアプリをデバッグしてもらっても原因が見えないし、general logを眺めていたら"WHERE id=NULL"ってクエリーが㌧でいたので、データがおかしいのかなぁと思ってinit.sql.gzからデータを再投入したり、mysqldumpを吸い上げてリストアしてみたり。当然何も起こらない。
    • ええ、InnoDB memcachedにセッション情報保存してましたから、セッション情報が引き渡されないんですよね。
  • ピンポイントに打ってくるINSERT, UPDATEとSELECTはHandlerSocketかInnoDB memcachedでやっつけるかと思ってNet::HandlerSocketをmake。InnoDB memcached PluginもPercona Serverのバイナリーには入ってなかったのでソース落としてきてmake。
    • innodb_memcache.containersをごにょごにょして何度か再起動するものの、目的の用途に使うには向かないのでHandlerSocketの方が良さそうだと判断。
    • アプリ環境周りのセットアップが全く判っていないので、HandlerSocketのライブラリをmake installしてもパスが通っておらず結局使えない(´・ω・`)
  • SQLは「結果セットを変えない」ことを大前提にちょっと書き換えただけ。
    • 普段の仕事っぷりが見事に出るなぁ。。_| ̄|○
  • 残り1時間、ついにインスタンスを破棄して新しいインスタンスを立ち上げることを決意。
    • 勿論ベンチ通る。
  • Percona Serverに変える。
    • 通らなくなる。
    • ここかよ! だがデータストアが変わっただけで何が変わる?
  • ところでなんかエラーログのInnoDB memcachedのエラー(" InnoDB_Memcached: the value column c2 in table test/demo_test should be INTEGER, CHAR or VARCHAR.")がウザいので、UNINSTALL PLUGIN。
    • 通らなくなる。
    • Σ(゚д゚lll) うっそぉ!?
    • ま・さ・か…!
  • mysql> SELECT * FROM test.demo_test;
  • うわあああああ(AA略
  • Perconaに入れ替えてインデックス作ってSQLにヒント句追加して…ここまでで、時間切れ。


というわけで、@studio3104 さんと @ayumu83s さんに
 8 時 間 耐 久 デ バ ッ グ 祭 り
を強要した挙句、
 責 め る べ き は た だ 一 人
だけど、2人とも優しくて責めるに責められず、結果お通夜に。

MySQLしかいじれなかった結果の最終スコアは3440でした。
本当にごめんなさい。

0 件のコメント :

コメントを投稿