kavo’s diary

備忘録

ISUCON10本選 練習環境構築 ベンチマーカーを動作させる

ISUCON10本選に挑戦してみたくてまずは環境構築したメモ。

とりあえずベンチ実行してスコアが出てアプリが見えるところまでやった。

ISUCON10 本選当日マニュアルは以下。

isucon10-final/manual.md at master · isucon/isucon10-final · GitHub

インスタンス起動、SSH接続

「ISUCONの過去問にチャレンジするためのシンプルな環境構築」を使う(ISUCON9予選) - kavo’s diary と同様にami-0f7362c1bbc7e30ecを使ってインスタンスを立ち上げ、SSH接続。

isuconユーザに切り替え。

$ sudo -i -u isucon

サービス起動

立ち上げた直後は起動していないので、起動する。 参考実装の切り替え方法

sudo systemctl enable --now xsuportal-web-golang.service
sudo systemctl enable --now xsuportal-api-golang.service

仮想ポータルアクセス

どこから仮想ポータルを見られるのかは当日マニュアルとアプリケーションマニュアルをざっと見ただけだと分からなかった。が、xsuportal-api-golang.serviceのログで9292で受けてるっぽいことに気づく。

$ sudo systemctl status xsuportal-api-golang.service
...
 http server started on [::]:9292

curlしてみると弾かれる。ポート開けてなかった。

$ curl localhost:9292

AWSコンソールで9292を開けたらcurlでhtmlが返ってきた。

$ curl localhost:9292
<!doctype html><html lang="ja" class="has-background-grey-lighter"><head><title>XSUCON Portal</title><meta name="viewport" content="width=device-width,initial-scale=1"/><meta name="xsu:api-base-url" content="/"/><link href="/packs/vendor.css" rel="stylesheet"></head><body><div id="app"></div><script src="/packs/vendor.js"></script><script src="/packs/audience.js"></script></body></html>i

ブラウザでhttp://x.x.x.x:9292/ を開くとタイトルだけ出て中身はカラのページが見えた。

f:id:kavohtn:20210617042044p:plain

ベンチマーク実行

ポータルの中身はカラに見えるのは以下の理由のよう。

なお、初期状態ではアプリケーションの動作に必要なデータが不足しているため、アプリケーションをブラウザから動作確認するためには、一度負荷走行を実行してください (後述)。

Running a benchmarker locallyのコマンドを参考に実行してみる。そのままだと下記エラーになる。3000番ポートで待ってなさそうだし、本番と同じ構成になってなさそう。

dial tcp [::1]:3000: connect: connection refused

$ sudo lsof -i:3000
$

試しにtargetのポートをapiが受けてる9292に変更し実行してみる。

$ ./bin/benchmarker     -exit-status     -target app.t.isucon.dev:9292     -host-advertise local.t.isucon.dev     -tls-cert ../secrets/cert.pem     -tls-key ../secrets/key.pem 
16:56:17.000277 ISUCON10 benchmarker e858b2588a199f9c7407baacf48b53126b8aeed6+dirty
16:56:17.001955 ===> PREPARE
16:56:26.754919 Language: go
16:56:26.754936 HTTP: http://app.t.isucon.dev:9292/(tls=false)
16:56:26.754942 gRPC: localhost:50051
16:56:26.755009 ===> LOAD
16:56:26.755049 LOAD INFO
  Registration Open at: 2021-06-16 16:56:27 +0000 UTC
  Contest Start at: 2021-06-16 16:56:37 +0000 UTC
  Contest Freeze at: 2021-06-16 16:57:17 +0000 UTC
  Contest Ends at: 2021-06-16 16:57:27 +0000 UTC
16:57:36.762065 ===> VALIDATION
16:57:47.793989 ERR: validation: critical: http: Get "http://app.t.isucon.dev:9292/api/contestant/dashboard": context canceled
16:57:47.794491 ERR: validation: timeout: critical: timeout: http: timeout: Get "http://app.t.isucon.dev:9292/api/contestant/dashboard": context deadline exceeded
16:57:47.794515 ERR: validation: timeout: critical: timeout: http: timeout: Get "http://app.t.isucon.dev:9292/api/contestant/dashboard": context deadline exceeded
16:57:47.794636 ERR: validation: critical: http: Post "http://app.t.isucon.dev:9292/api/login": context canceled
16:57:47.794724 ERR: validation: critical: http: Get "http://app.t.isucon.dev:9292/api/contestant/dashboard": context canceled
16:57:47.794820 ERR: validation: critical: http: Get "http://app.t.isucon.dev:9292/api/contestant/dashboard": context canceled
16:57:47.794877 ERR: validation: critical: http: Get "http://app.t.isucon.dev:9292/api/contestant/dashboard": context canceled
16:57:47.794933 ERR: validation: critical: http: Get "http://app.t.isucon.dev:9292/api/contestant/dashboard": context canceled
16:57:47.794989 ERR: validation: critical: http: Get "http://app.t.isucon.dev:9292/api/contestant/dashboard": context canceled
16:57:47.795089 ERR: validation: critical: http: Get "http://app.t.isucon.dev:9292/api/contestant/dashboard": context canceled
16:57:47.805110 ===> SCORE
Count: 
  admin-answer-clarification: 8
  admin-get-clarification: 8
  admin-get-clarifications: 73
  audience-get-dashboard: 370
  create-team: 10
  enqueue-benchmark: 118
  finish-benchmark: 109
  get-clarification: 8
  get-dashboard: 60
  join-member: 20
  list-notifications: 1491
  post-clarification: 8
  resolve-clarification: 8
(1290 * 1.0) + 37 - 400(err: 0, timeout: 405)
Pass: false / score: 927 (1327 - 400)
Fail reason: Critical error

Pass: falseとあるが、一応スコアは出ている。

ポータルサイトもタイムラインチャートやリーダーボードが見えるようになった。

f:id:kavohtn:20210617035556p:plain

ユーザとしてログインして管理者・競技者のページも見えた。

XSUCON Admin f:id:kavohtn:20210617044914p:plain

XSUCON Contestant f:id:kavohtn:20210617045059p:plain

最低限ベンチ動作とアプリが見えるようになった。