isucon練習記 isucon8(本選)
vagrant-isuconを参考にして適当なVagrantfileを用意
ベンチマーカー、webapp、blackboxで三台を用意
開発環境の準備
docker, docker-composeをインストール
VSCodeでVMに接続
READMEに従ってサービス立ち上げ
と思ったらなんか開始に失敗して無限ループしてた
E: Package 'mysql-client' has no installation candidate
つまり、 mysql-client はなくなり、 mariadb-client に統合されたことで、インストールができなくなった模様。
webapp/go/Dockerfileのmysql-clientをmariadb-clientに変更して解決
goのインストール
code:console
sudo rm -rf /usr/local/go && sudo tar -C /usr/local -xzf go1.10.8.linux-amd64.tar.gz
export PATH=$PATH:/usr/local/go/bin
ベンチマーカーのビルド
READMEに従う
make buildでgccが要るらしいのでいれる
ベンチマーカー回してみる
証明書が全部失効しているらしくエラーが出た
自己証明書の作成が必要らしい
自己証明書の作成
基本的にはこの記事の通りやった
Common Nameはドメイン名に合わせろとのことだったので適当に*.example.comにした
作成したCA証明書はこの記事を見てベンチマーカー用VMにインストールした
ベンチマーカー用VMの/etc/hostsをいじってwebapp.example.comをwebapp用VM、blackbox.example.comをblackbox用VMのIPにそれぞれ割り当てたら、とりあえずcurlは通った
isubank立ち上がってない問題
ベンチマーカーがエラーになったときisubankが落ちてた
code:console
isubank_1 | # github.com/go-sql-driver/mysql
isubank_1 | ../github.com/go-sql-driver/mysql/nulltime.go:36:15: undefined: sql.NullTime
blackbox_isubank_1 exited with code 2
isubankのgoを1.13にしたら解決した
isucoinのエラー
またベンチマーカーを回すとbank user not foundで落ちた
isucoin側にもCA証明書のインストールが必要だった
isucoinのDockerfileにCA証明書をインストールする処理を追加
code:Dockerfile
COPY ./ca.crt .
RUN mkdir /usr/share/ca-certificates/mylocal \
&& cp ca.crt /usr/share/ca-certificates/mylocal/ \
&& echo "mylocal/ca.crt" >> /etc/ca-certificates.conf \
&& update-ca-certificates
Docker内のドメインの解決は/etc/hostsではなく、docker-compose.ymlに追記した
code:yml
extra_hosts:
- "blackbox.example.com:192.168.33.11"
やっとベンチマークが通って初期値は276点だった
プロファイリングする
kataribe
code:console
TOP 37 Slow Requests
1 15.001 GET /orders HTTP/1.1
2 12.671 GET /info?cursor=0 HTTP/1.1
3 11.379 GET /info?cursor=0 HTTP/1.1
4 11.310 GET /info?cursor=0 HTTP/1.1
5 11.188 GET /info?cursor=0 HTTP/1.1
6 11.101 GET /info?cursor=0 HTTP/1.1
7 10.953 GET /info?cursor=0 HTTP/1.1
8 10.930 GET /info?cursor=0 HTTP/1.1
9 10.662 GET /info?cursor=0 HTTP/1.1
10 8.394 GET /info?cursor=0 HTTP/1.1
11 7.950 GET /orders HTTP/1.1
12 7.840 POST /orders HTTP/1.1
13 7.735 GET /info?cursor=0 HTTP/1.1
14 7.434 GET /info?cursor=0 HTTP/1.1
15 6.705 POST /orders HTTP/1.1
pprof
flamegraphを見た感じ
model.GetLatestTrade
model.scanTrade
model.scanTrades
が時間かかってる
model.GetLatestTradeをLIMIT 1に
スコアは1981点になった
このへんで3台のVMのCPU数とメモリ数が適当だったことが気になってREADMEを読んで揃えた
スコアは2927点になった
再度kataribe
code:console
TOP 37 Slow Requests
1 12.120 POST /orders HTTP/1.1
2 11.450 GET /info?cursor=0 HTTP/1.1
3 10.423 POST /orders HTTP/1.1
4 9.021 POST /orders HTTP/1.1
5 8.897 POST /orders HTTP/1.1
6 8.623 GET /orders HTTP/1.1
7 8.618 POST /orders HTTP/1.1
8 8.426 POST /orders HTTP/1.1
9 7.058 POST /orders HTTP/1.1
10 7.056 POST /orders HTTP/1.1
11 7.041 POST /orders HTTP/1.1
12 6.983 POST /orders HTTP/1.1
13 6.728 POST /orders HTTP/1.1
14 6.675 POST /orders HTTP/1.1
15 6.378 POST /orders HTTP/1.1
GetLatestTradeが使われてた/infoが減った
h.AddOrders見る
model.GetUserByIDも同じ感じでLIMIT 1追加
3335点
handler.goのここ何?
code:go
err = h.txScope(func(tx *sql.Tx) (err error) {
order, err = model.AddOrder(tx, r.FormValue("type"), user.ID, amount, price)
return
})