---
# System prepended metadata

title: ISUCON 2021準備

---

# ISUCON 2021準備

競技開始後やることの流れ：https://isucon.net/archives/50697356.html

移植コンテストになりそう。


## 参考

- 具体的にどのへんを見たら良いのか
  - https://matsuu.hatenablog.com/entry/2020/09/13/131145
  - https://engineer.recruit-lifestyle.co.jp/techblog/2020-09-25-isucon10-qualify/



## [ISUCON11 予選レギュレーション](https://isucon.net/archives/55854734.html)

### サーバー事項
> チームは AWS アカウントを各自で用意し、それを競技に利用する。選手は主催者より競技開始後に指定された AMI (Amazon Machine Image) を利用して Amazon EC2 上にサーバーを起動し、競技へ参加する。具体的なサーバー起動方法については当日マニュアルに記載される。

例年は主催者側がインスタンスを用意するらしいが、今年は自前で用意するらしい。インスタンスのリソース設定とかどうやって統一するんだろう。

例年の文言↓

> 選手は主催者が用意したインスタンスで Web アプリケーションを動作させ、競技へ参加する。インスタンスへの接続は踏み台サーバを経由したSSHで行う。

とりあえず、メンバーのSSH公開鍵を登録するスニペット

```bash
curl https://github.com/kateinoigakukun.keys https://github.com/giginet.keys https://github.com/freddi-kit.keys >> .ssh/authorized_keys
```

## 初手やること

### Swift固有のセットアップ

最近メンテされてないけど、swiftenvで入れるのがLinuxだと一番お手軽。
これを流し込むだけでOK

```bash
git clone https://github.com/kylef/swiftenv.git ~/.swiftenv
echo 'export SWIFTENV_ROOT="$HOME/.swiftenv"' >> ~/.bash_profile
echo 'export PATH="$SWIFTENV_ROOT/bin:$PATH"' >> ~/.bash_profile
echo 'eval "$(swiftenv init -)"' >> ~/.bash_profile
source ~/.bash_profile
swiftenv install https://swift.org/builds/swift-5.5-branch/ubuntu2004/swift-5.5-DEVELOPMENT-SNAPSHOT-2021-07-30-a/swift-5.5-DEVELOPMENT-SNAPSHOT-2021-07-30-a-ubuntu20.04.tar.gz
```


### プロファイリング設定

- [alp](https://github.com/tkuchiki/alp/): LTSV形式のアクセスログを分析して、遅いエンドポイントを探してくれるらしい。便利そう。
    - NginxをLTSV形式でログ出すように設定する必要あり。
    - Vapor側でもLTSV吐けるようにした
    - インストール : https://github.com/tkuchiki/alp/releases/download/v1.0.7/alp_linux_amd64.zip


- [netdata](https://www.netdata.cloud/): 可視化ツール
  - [インストールガイド](https://learn.netdata.cloud/docs/agent/packaging/installer/methods/kickstart)
  - [MySQL plugin]( https://learn.netdata.cloud/docs/agent/collectors/go.d.plugin/modules/mysql)
    - こういう設定を書くだけでいい感じに可視化してくれる。
```
jobs:
  - name: local
    dsn: mysql://isucari:isucari@127.0.0.1:3306/isucari?charset=utf8
```

### スロークエリの解析設定

- `slow_query_log`あたりを設定するとスロークエリを報告してくれるらしい。https://dev.mysql.com/doc/refman/5.6/ja/slow-query-log.html

    - `/etc/mysql/mysql.conf.d/mysqld.cnf`の`slow_query_log`のセクションをコメントアウト外すだけでOK

- `pt-query-digest` というツールでいい感じに解析できるらしい。
    - インストールガイド:
        - [リポジトリ登録](https://www.percona.com/doc/percona-repo-config/percona-release.html#installation)
        - [本体インストール](https://www.percona.com/doc/percona-toolkit/LATEST/installation.html)



## 技術選定


### フレームワーク

- [amzn/smoke-framework](https://github.com/amzn/smoke-framework/blob/main/README.md)
    - [サンプル](https://github.com/amzn/smoke-framework-examples/tree/main/EmptyExampleService)
    - ざっと試してみたけど、Swaggerで自動生成することが前提の作りっぽい。
    - 全部手書きするのは大変…
    - async/await APIがついてる。
- [vapor/vapor](https://github.com/vapor/vapor)
    - 現状デファクト
    - 最近開発が鈍化してる気がする…
    - async/await対応は未マージ
        - https://github.com/vapor/vapor/pull/2613
        - このPRのブランチ使うのは割とアリかも。

### SQLライブラリ

- [vapor/fluent-kit](https://github.com/vapor/fluent-kit)
    - いわゆるORM。型安全にクエリが書ける。
    - vaporグループが作ってるけど、vaporには依存してない。
    - が、APIの型推論設計が微妙で、すぐ `ambiguous type` が出て、リズムよく書くのは難しい。
    - あと、fluentのAPIで狙ったSQL文を生成させるのが難しい。
- [vapor/mysql-kit](https://github.com/vapor/mysql-kit)
    - もう少しlow-levelのMySQL操作ライブラリ。Fluentの下請け。
    - libmysqlclientに依存しないので、非同期IOできる
    - 普通にSQLを書いて実行する感じ。
        - `let rows = try mysql.simpleQuery("SELECT @@version;").wait()`
    - `Decodable`でSwiftの型にいい感じにマップできる。
    - これで十分感はあるが、直接使ったことは無い。

### Redisライブラリ

- [Nathan Harris / RediStack · GitLab](https://gitlab.com/Mordil/RediStack)
    - 使ったこと無いけど、見た限り普通に使えそう。VaporのRedisサポートに使われてる。


### テンプレートエンジン


- [vapor/leaf-kit](https://github.com/vapor/leaf-kit)
    - エスケープの扱い周りがかなり微妙…
- 生のSwift文字列
    - Multiline String Literalで十分な気もする


## 練習環境

- [matsuu/aws-isucon: ISUCON過去問をAWS環境で構築するための一式](https://github.com/matsuu/aws-isucon)


### 反省点

- Xcodeのデバッガがnightly toolchainでうごかん
- MySQLKitの挙動
    - valuesのオーバーロード
- Vaporの挙動
    - ペイロードサイズの上限
- ~~デバッガちゃんと動くように直す~~
    - ツールチェーンにそのバージョンのlldbが入ってないので無理だ。


## Tips

DYLD_LIBRARY_PATHでランタイムライブラリのロード優先度を変えると、macOSでもCLIからサーバー起動できる

`
$ DYLD_LIBRARY_PATH=/Library/Developer/Toolchains/swift-5.5-DEVELOPMENT-SNAPSHOT-2021-07-30-a.xctoolchain/usr/lib/swift/macosx/ 
/Users/katei/Library/Developer/Xcode/DerivedData/isucon10-derlfopajitqwqddkkovwzoytcxd/Build/Products/Debug/Run serve --port 1323
`