---
# System prepended metadata

title: ISUCON 練習 (ISUCON7)

---

ISUCON 練習 (ISUCON7)
====

## Docs
- http://isucon.net/archives/50697356.html
- https://github.com/isucon/isucon7-qualify

## Get started
アプリケーション: http://35.194.106.73:5000/
サーバ: isucon@35.194.106.73 + 公開鍵
リポジトリ: https://github.com/ktr0731/isucon7-2019

## Operations
やるタスクは上記に追加していく。完了したらチェックつけ、途中で別なタスクに切り替えた場合は ``[WIP]`` をつける。

## TODO
@ktr
- [x] いいスコア出たら Git リポジトリにタグ打って管理しておきたい

## Initial Roles
@ktr: 
- [x] sudo でパスワード聞かれないようにする (visudo で `isucon ALL=NOPASSWD: ALL` を末尾に追加)
- [x] Ansible 実行
- [x] ssh 公開鍵
- [x] 初期ベンチ測る
- [x] デプロイスクリプト書く
    - [x] ローカルでビルドしたバイナリを scp するタイプ
    - [x] リポジトリバックアップタスクがブロッカー
    - [x] デプロイスクリプト書くときにベンチと組み合わせる
- [x] 画像を DB から取り出す
- [x] NGINX での画像静的ファイル配信
    - [x] /etc/nginx/sites-available 以下にシンボリックリンクを貼る
    - [ ] mysql にはシンボリックリンクをはらない
    - [x] service ファイルの場合、 `systemctl enable <file>` のファイルはシンボリックリンクではだめで、実ファイルを指定する必要がある
    - [x] アイコンが追加されたときに icons に書き出す
- [x] /message が遅いことがベンチマークから分かる
    - [x] dstat で見ると disk write が多い
- [ ] getHistory ボトルネック解析


@acomagu:
- [x] Git リポジトリへのバックアップ <
    - ~~[ ] ssh 鍵をつくって自分のものとして事前に登録しておく~~
        - ~~[ ] 始まったらVMに鍵をいれとく~~
    - [ ] 中をみて必要そうなのをみます <
        - [ ] du -h | sort -h するのいいかもしれん
    - [ ] **設定ファイル類** nginx とか
        - [ ] デプロイスクリプトに場所追記?
- [x] あと圧縮してローカルに落とした
    - [ ] 圧縮中に permission denied するとしんどいので su?
    - [ ] `sudo tar zcvf home.tar.gz .`
    - [ ] 自動化できる?
- [x] プロファイリング
    - [ ] アプリケーション(Go)
    - [x] (pprofの結果から)"jsonifyMessage()" 内のN+1を確かめる
        - [x] queryHaveRead の N+1修正
- [x] redis セットアップ
    - [ ] https://gist.github.com/hackedunit/a53f0b5376b3772d278078f686b04d38
    - [ ] usr/local/bin/redis-server -> usr/bin/redis-server
    - [ ] 自動化したい
    - [ ] `[Service] Type=forking`
- [ ] ~~初期データとredisを同期(fetchUnread)~~
- [ ] prepare

@natumn:
- [x] データベースのバックアップ(サイズみて大丈夫そうだったらリポジトリに入れる)
    - [x] 動いてるかチェック
- [x] MySQL、NGINX

## スコア推移

``` go
<in VM>
$ cd ~/isubata/bench
$ ./bin/bench -remotes=127.0.0.1 -output result.json
```

ログ観るやつ
``` bash
$ sudo journalctl -u isubata
```

管理コマンド系
``` bash
$ ls /etc/systemd/system # systemd で管理されてるやつらの設定ファイル
$ sudo systemctl status isubata.service # ステータス
$ sudo service isubata restart # 再起動
```

### 1回目の練習
| 気づいたこと | やったこと | スコア |
|:-|:-|:-|
| - | 初期 | 3789 |
| pt-query-digest でボトルネッククエリを見つけた | message tableのchannel_idにindexはる | 47806 |
| pt-query-digest でボトルネッククエリを見つけた | 画像書き出し | 58146 |
| fetchUnreads でN+1をみつけた | 一部は修正できなかったが一部のクエリを減らす | 71651 |

### 2回目の練習
| 気づいたこと | やったこと | スコア |
|:-|:-|:-|
| - | 初期 | 3283 |

## ボトルネック
fetchUnread -> sqlx.DB.Get (N+1かも？)

## 昔自分が解説読みながらやったやつ
https://esa-pages.io/p/sharing/7723/posts/107/c5aec50b75ac5daa6d87.html