isucon練習記 isucon8(予選)
isucon8-qualifier をやってみる
$ vagrant upしてみるもウェブからアクセス出来ず
以下の設定をVagrantfileに追加して解決。http://192.168.33.10からアクセス出来るようになった
code:ruby
config.vm.define "webapp" do |webapp|
webapp.vm.network "private_network", ip: "192.168.33.10"
webapp.vm.network "forwarded_port", guest: 80, host: 8080, host_ip: "127.0.0.1"
# 中略
config.vm.define "bench" do |bench|
bench.vm.network "private_network", ip: "192.168.33.11"
次にVSCodeで開けるようにする
$ vagrant sshして.ssh/authorized_keysを/home/isucon下にコピー
$ sudo chown -R isucon:isucon /home/isucon して同じ鍵からSSH出来るように
$ vagrant ssh-configを端末の.ssh/configに書き込み、ユーザー名をisuconにしておく
VSCodeからRemote Development出来るようになった
文章にすると短いけどもうすでにかなり時間が経っている気がする
実行環境をPythonに変える
code:console
$ sudo systemctl stop torb.perl
$ sudo systemctl disable torb.perl
$ sudo systemctl start torb.python
$ sudo systemctl enable torb.python
とにかくベンチマークを回してみる
だいたい600点くらいが出た
やっと始められる~~
まず、どう見てもループでクエリをたくさん発行していそうな get_event(event_id, login_user_id=None)関数を読む
ループの中でSELECT * FROM reservationsがシート番号ごとに呼び出されていたので、ループ前に一回だけ全部取得するようにした
これで予約されていない席でクエリを発行していた無駄がなくなったはず
スコアは700点くらいになってた
なんとなくもう一度図ってみたら1000点くらいだった。よく分からない
db/schema.sqlを見て、インデックスを追加しておくべき要素が無いか探す
reservations.user_idにインデックスを貼ってみるが効果なし?
ベンチなどを回しているうちにそろそろログが見たくなったので、ひとまずgunicornのログを出力するようにする
gunicorn.conf.pyを作成するらしいので作る
code:gunicorn.conf.py
accesslog = "/home/isucon/torb/webapp/log/access.log"
errorlog = "/home/isucon/torb/webapp/log/error.log"
workers = 2
一応workersも指定してみたけどこういうパフォーマンスの上げ方はアリなのだろうか
現状の点数は1100点くらい
ベンチ結果でタイムアウトの多い/api/actions/loginを確認
2つあるcur.executeを一つにまとめる
SHA256をPythonで計算するようにする
末尾のuser = get_login_user()を削除
など試したが、エラーの数、点数にほぼ変化なし
結局get_event(s)をもっと改善しなければいけないというところまで察してきたもののひとまずここで終了
スコアは一番いいやつで1500点くらいだった