以下エントリでも書いた通り、今年はRustで参加した。1130点くらいだった。
社内で "Rustで爆死したい人" と募ったら、id:Krouton, id:stefafafan 2名の仲間が集ってくれた。 私とKroutonは趣味でRustを書いていたけどRustでWebサービスは一切書いたことがない、stefafafanはRustが初めて、という布陣。
感想
- すごく楽しかった。来年もRustで出たい
- Rustのcompile速度をなんとかせねば
事前準備
当初はRustで参考実装が出るとは思っていなかったので、とにかく準備が大切だということで毎週3人で集まっては次にやることを決めて、1週間そこで出た宿題をやって、また集まるということを繰り返していた。
また、3人で休日1日潰してリハーサルを行った。 準備の詳細は以下チームメイトのエントリにある通り stefafafan.hatenablog.com
当日やったこと
- ローカルPCで動くものを準備していて、それをコピペしつつ当日1時間くらい時間をかけたがうまくローカルでブラウザから動作確認できず不発だった
- 今みたら docker-compose の port の bind の設定が間違ってた
- 初回compileにめちゃくちゃ時間がかかるのでtry & errorがやりづらかった
- popularityでsortしつつwhereで絞り込んで25件取得している部分は実はwhereでほとんど絞り込めてないのではないかという仮説のもと、まずpopularityでsortして上から100件を取得し、そこからアプリケーションでfilterして25件に満たなかったらwhere句も付けるようにフォールバックしたら点数上がった
- テーブルが2つかないしpt-query-digest見てもそれぞれのtableの負荷が高いクエリが同じくらいの数あるしテーブル間でjoinもしとらんなということでDBをサーバ毎に分割した
- initializeで、他のサーバのinitializeを叩いてDBの初期化をするようにした
- 最後にメモリキャッシュしようとしたがうまくいかなかった
- diff Cache estates のキャッシュ by dekokun · Pull Request #17 · dekokun/ISUCON-2020-qualify · GitHub
- そもそもどの範囲でデータが共有されるのかよく分かってない。多分私達の実装ではthread毎にキャッシュ構造体をcopyしているので、CSV入稿でキャッシュを飛ばしている部分、1thread分しかキャッシュが飛ばない気がした
- この変更はデプロイしたがエラーが起きるようになって諦めた、人類に、30分でキャッシュ実装を自前で持つのは早すぎると思われた。次回は大人しくserialize/deserializeしつつRedisを活用するということをしたい
ISUCON後にやったこと
- 3人で振り返りをした
- KPTで振り返った
- 本番で不発だったDockerでのローカル開発環境が動くようにした
- 以下、いい気付きもあった
Docker環境でRust開発する際にtarget下キャッシュしてるのになぜ毎回crateのDLが走るのか(compileは走らない)と思ってたけどcrateのDLはマシングローバルにキャッシュされるのね。言われてみれば。 / “Cargo seems to download the same crate at least once per package -…” https://t.co/jLLRNyiUXB
— でこくん (@dekokun) September 15, 2020
疑問
- Rustでcompile速度を上げたかったら、crate分割がいいんかなぁ。。。
- Rustのcompileに数分かかり、デプロイが結構きつかった
その他良かったこと
- チームの最初のキックオフでISUCONの意気込みの一つに "アウトプット" を掲げて参加した結果、stefafafanがブログを書いたり、Rustの勉強会のLT発表を申し込んだりして非常に良かった
- RustのLT会 Shinjuku.rs #12 @オンライン - connpass に皆も参加だ!
- キックオフのときの意気込みは以下の通り。Kroutonもブログを書いたら(書くって言ってた)、3つの意気込みのうち2つが達成されたということになるので、まずまずなのではないか
- 初期実装がなくてもRustを貫徹する。Rustを信じろ!
- 予選突破
- アウトプット
チームメイトの書いたエントリがめっちゃ味があってよかった。
これまでのISUCONの記録
2013年
PHPで予選突破し決勝進出。 dekokun.github.io
2014年
PHPで予選突破し決勝進出 dekokun.github.io
予選のエントリはなかった。
2015年
PHPで予選落ち dekotech.dekokun.info
2016年, 2017年, 2018年, 2019年
ISUCONに毎年参加してるのだがエントリがない… 確かPerlとかGolangとか使いつつ予選落ち