いい感じにスピードアップコンテスト、略してisuconの第十回目の予選に参加してました。 実は初参加でした。メンバーは私と、上司の@kazuhisa1976の2名です。
もう全然惜しくもないし、点数も800点くらいだったので全然ダメでした。あぁ~、技術力のないエンジニアであることが露呈したんじゃ~😭
とりあえずやっていたことと、反省点を上げていこうと思います。(敢えて、まだ他のブログとか見てません!自分が思いつく反省点を上げるため)
やったこと
いきなり修正するのはまず止めよう、問題点を一旦洗い出そうと話していたので、気になる点をtrelloに書いていきました。
- まずはRubyの実装に変更(デフォルトがgolangのため)
- サーバの構成の調査(cat /proc/cpuinfoと/proc/meminfo)。全部1コア2GB。
- インデックスの状態を調査(primary keyのみindexあり)
- コードを読んでインデックスが貼れそうなところに目星を付ける
- nginxにリバースプロキシを仕込んでラウンドロビンにする
- 3台目のDBに接続させるようにして、1,2のDBを落とす
- 3台目のDBのスキーマファイルを修正して検索条件に使われるものにインデックスを貼るよう設定
- csvのインサートが1件ずつなのをバルクインサートにする
- MySQLのバージョンが5.7だったので、8.0にする。その際に、2台目で作業。
- MySQL8.0のサーバに接続するように書き換え。
- mysqld.cnfを雑に書き換えたら、めちゃくちゃスコアが下がったのでデフォルトに戻す。
- なぞっての処理でN+1が発生しているので、位置に入っているか直接見られるようにするためにestateテーブルにgeometry型のカラムを追加
- カラムを追加したせいでレスポンスが変わってしまい、
select *
できなくなり(大失態)クエリのselectを書き換えていく - 2台目をDB専用にして、mysqld.cnfを修正して調整…。
- unicornのワーカー数を調整
これくらいだろうか…。600点台からなかなか抜け出せなくて、途中で700点台でまた止まって、ぎりぎり800点台に到達して終わった感じだったけれど、本戦参加者は2500とかいってたから全然あかんかったなぁと思う。
反省点
1. botを弾いてなかった
終わった後で気づいた。Bot弾いてない。Discordの会話を見る限りでは、nginxで弾けそうだった。
2. 直接サーバで作業しすぎた
各サーバのコードの同期をとるのが大変で、毎回そこで時間食ってたと思う。同期をとる仕組みを先に作るべきだった。
3. MySQLに詳しくなさ過ぎた
普段PostgreSQLを使っているので全然わからんかった…。めっちゃググった。
4. MySQL8.0にしたけれどよかったのか?
過去のやつでミドルウェアのバージョンアップで性能が向上するという話を見かけていたのでやったのだが、効果が今一つわからなかった(ベンチマークが不安定過ぎて5.7の状態で取れなかったため)。ベンチマークが取れるようになるまで待つという選択肢もあったが、時間がもったいないからエイヤでやってしまった。8.0からカラムにgeometry型が使えるとあったのでやったのだが、カラムを追加する必要はなかったかも…。
5. 位置情報は関数インデックスでよかったのではないか?
後で思ったこと。カラムを追加して位置情報で検索させることでN+1はなくなったのだが、カラムを追加したせいでレスポンスの形が変わってしまい、エラーになりつづけて結構時間をロスした。追加じゃなくて関数インデックスで位置情報を保持しておけば、5.7のままでもよかったかもしれないし、カラムを追加していないのでjsonのレスポンスの形も変わらず、エラーでハマることはなかっただろう…(多分)
6. viに慣れてなさすぎ
vi滅多に使わないので修正に時間がかかった。まぁ2で言ってることと被るけど。
7. New Relic使えるの知らなかった
使えたんかい!?😖事前情報のチェックをしてなさ過ぎた。始まる前から終わっていた感ある…。 パフォーマンスチューニングなのに運営のベンチマークの値に頼り過ぎていた。何をやればいいかが手探りすぎてダメだった。New Relic見れていたらだいぶ違っただろうなぁ…。
8. アプリをブラウザで動かしてなさ過ぎた
もっと自分の手でブラウザから動かして、実際に遅そうなところを見ればよかった。ブラウザで動かさずにコードのほうばかりに注目しすぎた。chromeのdevtoolを見ても遅いところはわかるし、ちゃんとアプリに向き合えてなかったと思う。
これから
もうほんまにダメダメだったので、他の人のブログを読みながら試していけそうなところとかを勉強させてもらおうと思います。あといつもPaaSのHerokuを使っているからミドルウェアの設定に弱すぎて個人的にダメだった。やはり何か自分でウェブアプリを運用してみるしかない。最近やってないからな…。Conohaでなんか作るかなぁ~。