LoginSignup
5
3

More than 3 years have passed since last update.

isucon8の問題をGo言語で練習する

Posted at

前提としては下記、既にVirtualBoxやVargrantがインストールされてること。

  • macOS 10.14
  • VirtualBox 5.2
  • Vargrant 2.1.5

環境構築はmatsuuさんが公開しているものの1台構成の奴を利用させていただきました。
https://github.com/matsuu/vagrant-isucon/tree/master/isucon8-qualifier-standalone

$ git clone git@github.com:matsuu/vagrant-isucon.git
$ cd vagrant-isucon/isucon8-qualifier-standalone

今回はブラウザからも確認したいので先にコメントアウトを外してIPアドレスを割り振る。

  config.vm.network "private_network", ip: "192.168.33.10" # 外す
  # config.vm.network "private_network", type: "dhcp" # コメントアウトする

仮想マシン(CentOS7)を起動する。

# 起動
$ vagrant up
# Provisioningが完了したらログインできる
$ vagrant ssh

ベンチマークの初期設定

ビルド

$ sudo -i -u isucon
$ cd torb/bench
$ make deps
$ make

初期データ生成

$ ./bin/gen-initial-dataset   # ../db/isucon8q-initial-dataset.sql.gz ができる

データベースの初期化

$ mysql -uroot
mysql> CREATE USER isucon@'%' IDENTIFIED BY 'isucon';
mysql> GRANT ALL on torb.* TO isucon@'%';
mysql> CREATE USER isucon@'localhost' IDENTIFIED BY 'isucon'; # 既にできてるため失敗する?JJ
mysql> GRANT ALL on torb.* TO isucon@'localhost';
$ ./db/init.sh

参照実装をPerlからGoに切り替える

$ sudo systemctl stop    torb.perl
$ sudo systemctl disable torb.perl
$ sudo systemctl start   torb.go
$ sudo systemctl enable  torb.go

Perl → Go に切り変わったかは下記のコマンドで確認できる

$ ps -aux | grep torb

ブラウザでアプリケーションが起動しているかを確認するためにVagrantファイルで設定したIPアドレスを開く
http://192.168.33.10

 2019-08-04 15.58.24.png

試しにテンプレートを修正してみる

$ cd ~/torb/webapp/go
views/index.tmpl
-          <h3>開催中のイベント</h3>
+          <h3>MY 開催中のイベント</h3>

ファイルを変更したらビルドとサービスをリスタートする

$ make
$ sudo systemctl restart torb.go

 2019-08-04 15.56.09.png

ベンチマークを動かす

$ cd ~/torb/bench
$ bin/bench -remotes=127.0.0.1 -output result.json
$ jq . < result.json
{
  "job_id": "",
  "ip_addrs": "127.0.0.1",
  "pass": false,
  "score": 0,
  "message": "負荷走行中のバリデーションに失敗しました。2019-08-04 07:04:05.514821172 +0000 UTC m=+39.621374291 [Fatal]レポートに予約id:148865の行が存在しません (GET /admin/api/reports/events/10/sales )",
  "error": [
    "2019-08-04 07:03:47.655257471 +0000 UTC m=+21.761810599 リクエストがタイムアウトしました (GET /api/users/1633 )",
    "2019-08-04 07:03:50.973739693 +0000 UTC m=+25.080292821 リクエストがタイムアウトしました (GET /api/users/1823 )",
    "2019-08-04 07:03:56.994053625 +0000 UTC m=+31.100606768 リクエストがタイムアウトしました (POST /admin/api/events/20/actions/edit )",
    "2019-08-04 07:03:57.547523616 +0000 UTC m=+31.654076758 リクエストがタイムアウトしました (GET /api/users/3235 )",
    "2019-08-04 07:04:05.514821172 +0000 UTC m=+39.621374291 [Fatal]レポートに予約id:148865の行が存在しません (GET /admin/api/reports/events/10/sales )"
  ],
  "log": [
    "08/04 07:03:38 レスポンスが遅いため負荷レベルを上げられませんでした。/api/users/1633",
    "08/04 07:03:39 レスポンスが遅いため負荷レベルを上げられませんでした。/api/events/10",
    "08/04 07:03:40 レスポンスが遅いため負荷レベルを上げられませんでした。/",
    "08/04 07:03:41 レスポンスが遅いため負荷レベルを上げられませんでした。/api/events/11/actions/reserve",
    "08/04 07:03:42 レスポンスが遅いため負荷レベルを上げられませんでした。/api/events/10",
    "08/04 07:03:43 レスポンスが遅いため負荷レベルを上げられませんでした。/",
    "08/04 07:03:44 レスポンスが遅いため負荷レベルを上げられませんでした。/",
    "08/04 07:03:45 レスポンスが遅いため負荷レベルを上げられませんでした。/",
    "08/04 07:03:46 レスポンスが遅いため負荷レベルを上げられませんでした。/",
    "08/04 07:03:47 エラーが発生したため負荷レベルを上げられませんでした。2019-08-04 07:03:47.655257471 +0000 UTC m=+21.761810599 リクエストがタイムアウトしました (GET /api/users/1633 )",
    "08/04 07:03:48 エラーが発生したため負荷レベルを上げられませんでした。2019-08-04 07:03:47.655257471 +0000 UTC m=+21.761810599 リクエストがタイムアウトしました (GET /api/users/1633 )",
    "08/04 07:03:49 エラーが発生したため負荷レベルを上げられませんでした。2019-08-04 07:03:47.655257471 +0000 UTC m=+21.761810599 リクエストがタイムアウトしました (GET /api/users/1633 )",
    "08/04 07:03:50 エラーが発生したため負荷レベルを上げられませんでした。2019-08-04 07:03:47.655257471 +0000 UTC m=+21.761810599 リクエストがタイムアウトしました (GET /api/users/1633 )",
    "08/04 07:03:51 エラーが発生したため負荷レベルを上げられませんでした。2019-08-04 07:03:50.973739693 +0000 UTC m=+25.080292821 リクエストがタイムアウトしました (GET /api/users/1823 )",
    "08/04 07:03:52 エラーが発生したため負荷レベルを上げられませんでした。2019-08-04 07:03:50.973739693 +0000 UTC m=+25.080292821 リクエストがタイムアウトしました (GET /api/users/1823 )",
    "08/04 07:03:53 エラーが発生したため負荷レベルを上げられませんでした。2019-08-04 07:03:50.973739693 +0000 UTC m=+25.080292821 リクエストがタイムアウトしました (GET /api/users/1823 )",
    "08/04 07:03:54 エラーが発生したため負荷レベルを上げられませんでした。2019-08-04 07:03:50.973739693 +0000 UTC m=+25.080292821 リクエストがタイムアウトしました (GET /api/users/1823 )",
    "08/04 07:03:55 エラーが発生したため負荷レベルを上げられませんでした。2019-08-04 07:03:50.973739693 +0000 UTC m=+25.080292821 リクエストがタイムアウトしました (GET /api/users/1823 )",
    "08/04 07:03:56 レスポンスが遅いため負荷レベルを上げられませんでした。/api/events/11/actions/reserve",
    "08/04 07:03:57 エラーが発生したため負荷レベルを上げられませんでした。2019-08-04 07:03:57.547523616 +0000 UTC m=+31.654076758 リクエストがタイムアウトしました (GET /api/users/3235 )",
    "08/04 07:03:58 エラーが発生したため負荷レベルを上げられませんでした。2019-08-04 07:03:57.547523616 +0000 UTC m=+31.654076758 リクエストがタイムアウトしました (GET /api/users/3235 )",
    "08/04 07:03:59 エラーが発生したため負荷レベルを上げられませんでした。2019-08-04 07:03:57.547523616 +0000 UTC m=+31.654076758 リクエストがタイムアウトしました (GET /api/users/3235 )",
    "08/04 07:04:00 エラーが発生したため負荷レベルを上げられませんでした。2019-08-04 07:03:57.547523616 +0000 UTC m=+31.654076758 リクエストがタイムアウトしました (GET /api/users/3235 )",
    "08/04 07:04:01 エラーが発生したため負荷レベルを上げられませんでした。2019-08-04 07:03:57.547523616 +0000 UTC m=+31.654076758 リクエストがタイムアウトしました (GET /api/users/3235 )",
    "08/04 07:04:02 レスポンスが遅いため負荷レベルを上げられませんでした。/api/events/10/sheets/B/170/reservation",
    "08/04 07:04:03 レスポンスが遅いため負荷レベルを上げられませんでした。/api/events/11/actions/reserve",
    "08/04 07:04:04 レスポンスが遅いため負荷レベルを上げられませんでした。/admin/api/reports/sales"
  ],
  "load_level": 0,
  "start_time": "2019-08-04T07:03:26.048397335Z",
  "end_time": "2019-08-04T07:04:05.514877674Z"
}

まとめ

とりあえずはwebapp/go配下のファイルを修正してビルド → サービスのりスタートをすれば修正出来ることを確認できた。
ローカルから修正できるようにマウントするなどの準備ができればもっと早く修正を加えることができるのでそこが課題。

(参考)
ISUCON8 予選問題
ISUCON予選突破の鍵は過去問を解くことなので無料で試せるようにした(Vagrant+Ansible)

5
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
3