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

前提としては下記、既に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アドレスを割り振る。

```Vagrantfile
  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](http://192.168.33.10)

![ 2019-08-04 15.58.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132235/09d6ffb3-a087-36a3-2192-c7ada8aedda0.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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132235/d3e74865-1a8e-d0c5-6baa-25bd8b15f25c.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 予選問題](https://github.com/isucon/isucon8-qualify)
[ISUCON予選突破の鍵は過去問を解くことなので無料で試せるようにした(Vagrant+Ansible)
](https://tmatsuu.hatenadiary.org/entry/20150815/1439643715)