見習いの見習いプログラマ

まだまだ先は長い

ISUCON4予選で撃沈してきた話

てごわい

isucon4予選してきました。結論からいうと撃沈。13000くらいでした。

「み(ぃお)た(け)ら(れれ)団子」ってことで「みたらし団子」で参加してたのでした。

たけ氏には、確実に倒せそうなテンプレ周りとかunixソケット化とか色々お願いしてたとおもう。られれさんにはnata2とかいれてもらったり雑用たんまりお願いしたりとか。

どんな問題?

いすこん銀行、IPアドレス同一で10連続、パスワードとかまちがえて3回連続で制限ふっかけるとかそういう感じの部分をなんとかしてくださいってことらしい。

オンラインバンクなのに金額出ないし振り込めないし、なんかやばそうな銀行なので預けてはいけません。

コードリーディングした結果の方針

  • DBロックしてないから結構甘い
  • login_log が結構な量になるから多分重たい
  • というか、取得SQLがアレっぽいなー
  • もうこれ、RedisかMemcacheに全部載せてしまえば?上位層絶対これやってるしょー、下手したらweb側でなんかしてそうー

とかいう結論にいたり、Memcacheに仕様にそってデータをいれてみる。

後々のことも考えてuser_1_totalとかip_127.1.1.1 とかみたいなキーを作ってえっさこっさする

今見てもじつにひどい実装

https://github.com/miio/isucon4/blob/master/helpers.js#L116

不一致で死にまくり夕方までFail祭り。

初期データのキャッシュ温めしてないことに気付き制作。しかし、どうみてもこれstringifyでやらかしてるんですがねぇー

https://github.com/miio/isucon4/blob/master/memcache_init.js#L12

抽出SQLつらいわーとか言ってたら、たけ氏がレポート提出用のパクって作ればいいんじゃね?とか言ってきたので量産されるコピペメソッド。たけ氏天才か?w

https://github.com/miio/isucon4/blob/master/helpers.js#L273

ヒットしないキャッシュたち

キャッシュを全部温めたので理論上キャッシュfailはしないはず(消してもいなくて更新しかしてないから)なのになんかヒットしないパターンが多数あって、その結果重たいSQL直撃してたらしい

未だに原因不明なので原因見つけたらまとめたいなぁ。

まぁSQL直撃なのでインデックスだけ。

echo "ALTER TABLE login_log ADD INDEX idx1(user_id,succeeded);" | mysql -h ${myhost} -P ${myport} -u ${myuser} ${mydb}

こんなのおいときゃまぁ上がるっしょーってことで5分くらいで見つけてこれいれたら3000くらいあがったんだっけ。デスヨネーとしか。

感想

まぁ冒険しすぎたけど、今回は母数も増えすぎてたし、冒険しないと頭打ちにはなるだろうなーとは思っていました。はい。memcacheでヒットしない件は温めスクリプト改造したので検証したら、ヒットしないケースがあったのでちょっと詳しく調べたいところ。

というか、Redis力あればRedisにいれたほうが確実だった可能性もあるらしくてつらいなー。MySQLガチチューニングしとけばよかったかしら?

そんなわけでソースだけあっぷ

miio/isucon4 · GitHub

鳩さんありがとう。Node.js使ったよー