isucon練習記 isucon10(予選)
動けばいいのでとりあえず t2.small でアプリ/ベンチを作成
マニュアル
初期スコアは 450点くらい(Go: 460, Node: 426)
htopで見た感じmysqldがまず重そう
Nodeで挑戦してみる
pt, kataribe整備
ptを見る
10621回呼ばれてるクエリを見る
code:sql
SELECT * FROM estate WHERE id = 17459 AND ST_Contains(ST_PolygonFromText('POLYGON((35.03925760783139 139.31138654385074,35.31743061399948 139.2977886128761,35.6162854409782 139.38621195693946,35.74723181653074 139.47195532541735,35.632586297120355 139.5901967550367,35.12927784274019 139.39568793583013,35.03925760783139 139.31138654385074))'), ST_GeomFromText('POINT(35.047413440581906 139.36647265136793)'))\G
コードを見るとN+1
修正がだいぶ困難だったので答えをチラ見しながら解いた
呼び出し回数が208回になった
score: 558
インデックスを貼ろうとしたらMySQLは逆順インデックスに対応していないらしい
Mariadbをいれてみる
インデックスが効くようになった
score: 602
インデックス追加してみる
/api/chair/low_priced
priceにインデックス
/api/estate/low_priced
rendにインデックス
複数でORDER BYしてるから?かインデックスが使われないのでFORCE INDEXつける
score: 620
/api/chair/search
populaliry DESCにインデックス
score: 626
estate, chairをメモリに載せる
高速化はできてるように見えるけど、スコアは落ちた
score: 476
一旦戻す
2代目3代目を使ってみる
code:bash
$ sudo hostnamectl set-hostname isu2
$ sudo mkdir -p /home/isucon/.ssh &&\
sudo cp ~/.ssh/authorized_keys /home/isucon/.ssh &&\
sudo chown -R isucon:isucon /home/isucon/.ssh
$ mv webapp webapp.bak
$ ssh-keygen -t rsa
$ cat ~/.ssh/id_rsa.pub
自動更新プロセスを止める
sudo dpkg-reconfigure -plow unattended-upgrades
mysqlを外部接続可能に
mysql(mariadb)のbind-address を0.0.0.0に変える
code:sql
grant all privileges on *.* to isucon@"%" identified by 'isucon' with grant option;
isu2(app) isu1(db)でまず試す
DBは100%、アプリは余裕ありそう
score: 801
isu2(app) isu1(db) isu3(db)を目指す
各dbにchair, estateを分ける
score: 1268
もう一度メモリに乗せてみる
score; 620
アプリの負荷が上がってDBの負荷が半分以下になっているように見える
負荷レベルは上がってないのでメモリに乗せることが負荷になっている?謎
slow-query消す
score: 1273
botのリクエストを弾く
score: 1534
gzip有効化
score: 1571
お手上げ感出てきたので解説を読む
generated columns!そういうのもあるのか
降順インデックスが使えないmysql5.7のために、カラム生成で負の値を生成してそれを使ってインデックスを貼る
数値はマイナスをつければ逆順に出来る
「estate と chair で DB を別サーバに分ける」これやった!嬉しい~
検索周りの改善ぜんぜんやってないな
答えに乗ってたインデックス貼ってみる
score: :1629
反省
最期までアプリを全然触らなかったので各エンドポイントが何をしているのか分かっていない
最初にアプリを触りながらマニュアルを読む時間を設けるべき
アクセスログを全然見ていなかったのでベンチマーカーの動きを見れていない
次回見てみる