---
# System prepended metadata

title: ISUCON10(2020/08/01)

---

# ISUCON10(2020/08/01)
## memo
- 夏期講習資料
  - https://speakerdeck.com/rosylilly/isucon-xia-qi-jiang-xi-2020
- レギュレーション
  - http://isucon.net/archives/54753430.html
- 過去問置き場
  - https://github.com/matsuu/vagrant-isucon
## 今日やること
- 何を決めるか洗い出す
- 洗い出しものを決める
- 当日までどう過ごすかスケジュールを組む
- レギュレーション読む

### 何を決めるか
- ISUCONの目標
  - 打倒CTOチーム
    - 技術では勝てなさそう
    - レギュレーション
    - 役割分担
    - DXを高めて倒す
- 当日どうするかを決める
  - 役割
  - 計測
- 当日までのスケジュール
  - 過去問のやる日程
- 当日のやる場所
  - 集まる方向で
- 利用する言語
  - Ruby
- 作業領域
- 開始から50分何をするか
- よくやる作業手順が手元にある
- 全員の言語バージョンが揃っている
- 全員の手元のミドルウェアのバージョンが揃っている
- 情報共有の仕方が決まっている
- デプロイが１コマンドで実行できるようになっている
- ロールバックが確実にできることになっている
- メンバー間のHRTが確保されている

### 洗い出しものを決める
#### ISUCONの目標
- 打倒CTOチーム
  - 技術では勝てなさそう
  - レギュレーション
  - 役割分担
  - DXを高めて倒す
#### 当日どうするかを決める
- 役割
  - よっち
    - インフラ
      - [インフラ何するん?](https://qiita.com/ihsiek/items/11106ce7a13e09b61547)
      - [計測系](https://qiita.com/kopug/items/51e0ed4dfa4e20aa64ce)
  - あだっち、トミー
    - アプリ
    - DB
- 計測
  - masterマージに走らせると嬉しい
#### 当日までのスケジュール
- 8/1
  - キックオフ
- 8/9
  - 過去問１回目(isucon8)
- 8/22
  - 過去問2回目(isucon9)
- 9/12(当日)
#### 当日のやる場所
- 集まる方向で
  - 塩田家
- 予想外の自体があれば自宅でリモート
#### 利用する言語
- Ruby
#### 開始から50分何をするか
- よっち
  - ドキュメントを読む・インフラ整備
- あだっち
  - 手元で開発が進むようにする
- トミー
  - アプリコード読む・とりあえずベンチ実行
#### よくやる作業手順が手元にある
#### 全員の言語バージョンが揃っている
- ruby
  - 2.7.0
#### 全員の手元のミドルウェアのバージョンが揃っている
- ローカルにインストールする方向で
  - mysql
    - `mysql  Ver 8.0.19 for osx10.14 on x86_64 (Homebrew)`
  - nginx
    - `Version: 1.14.0-0ubuntu1.7`

#### 情報共有の仕方
- discordとgithubの連携
- 計測依頼
- 計測結果
  - https://github.com/SamSaffron/flamegraph
- コンフリクトについて
- レビュー部屋 
- ボトルネック共有部屋
#### デプロイが１コマンドで実行できるようになっている
- 塩田の宿題
#### ロールバックが確実にできることになっている
- コミット単位を細かく切る
- (共有の目的のため)大きくなる場合はレビューを入れる
#### メンバー間のHRTが確保されている
#### ローカルの計測方法
- rack-mini-profiler
- newrelic

### レギュレーション読む




### memo
### shiota
- sshのファイル設定
  - remoteのisuconユーザーへのアクセス
  - githubからpull
- pullから実行までのスクリプトをかく
- result.jsonにいるのを投げる
- bash_profileに記述しててもsuだと反応しない

### adacchi
- 開発環境を合わせる
  - ruby-versionを合わせるのに手が空く
    - アプリのコードを読む
  - 手順書作ったけど、あれでよかった?
- 開発環境を作ったあとのアクションに悩んだ
  - ここを決めたい
    - 今回はnewrelic導入
- よっちタスクで予選のマニュアルを読むがあったけど引き受けてもよかった?

### tommy
- ベンチ実行
  - よっちさんがどこまでやってるか確認しとけばよかった
- ベンチ実行のあとのアクションに悩んだ
- 実行中の暇な時間はどうしようか
  - 今回はマニュアル読む
  - アプリのコードを読む(途中)

## 決まったこと
- yothio
  - 最初の１時間でインフラ専念
    - アプリケーションが動くようにする
    - コマンド１発でデプロイできるようにする
      - git pullしてから、pumaのリスタートまで
      - ローカルからスクリプト一度で行う
    - sshのconfigを配布する
    - 最初のベンチはtommy,途中のベンチはyothio
- adacchi
  - ローカルでの開発環境構築手順作成
    - rubyのインストール
    - dataの初期化
    - bundlerのバージョン合わせる
    - 起動コマンドを叩く
  - 終わったら予選のマニュアルを読む
    - 要点をまとめる
      - 加点・減点・禁止事項の共有
- tommy
  - ベンチが動くか確認
    - 問題の切り分けのため
  - newrelicの導入
  - ベンチを回す
  - newrelic・ベンチ結果を共有して問題箇所を洗い出す

### 最初の１時間後で何やったか
- yothio
  - GithubにIssue登録しベンチ結果を流した
  - アンシブル流して、webサーバを複数台立てようとした
    - 途中で目的を見失ってやめた
  - DBの設定を一部変更
  - SSHのconfigを変更に挑戦した
  - sqldumpを渡した
- adacchi
  - NewRelicでベンチが取れなかった
  - ベンチマークから下記を調査しようと進めた
    - user
    - イベント
  - `/`の調査をした
  - `get_events`→`get_event`にリクエストが飛んでいるのを確認
    - 両方ともN+1が走ってた
      - `get_event`のN＋１を解消しようとした
      - SQLは完成した
      - コードに落とせなかった
  - 初期データの取得に手間取った
    - goの環境が整ってなかったため
- tommy
  - NewRelicからベンチが取れなかった
  - あんまりわからんかったからコードを読んでた
  - SQLの記述方法を少し理解
  - MySqlの記法を調べた
  - 初期データを入れるように行動した

---
- tommy
    - やること
        - Sinatoraのインプット
        - SequelProの使い方を理解するこ



---
# 2020/08/22
## 感想
- adacchi
  - 最初の１時間でやるべきことは実施できた
- tommy
  - mysql2が嫌いになった
- yocchi
  - 冗長な作業とかはあったけど、やりたいことはできた
- comment
  - newrelicでどこが重いかなど判断できればよかった

## 最初の１時間でやったこと
- adacchi
  - レポジトリ作成まで予選マニュアルを読む
      - 要点はまとめられたはず
  - ローカルでの初期データの作成、データベースの初期化、アプリの実行までの手順書作成
      - 細かい作業で.ruby-versionの作成,push
      - mysql2のversion設定,push
  - アプリのコードを読み始めることができた
- tommy
  - ベンチ実行
      - 実行してから挙動把握して、よっちさんにパス
      - 並行してドキュメント軽く見る
  - リポジトリ作成後、落としてNewRelicを入れる準備
      - 入れるところまでDONE、push
      - そこからの挙動確認がこれから
      - mysql2のバージョンの確認
- yocchi
  - 接続コマンド共有
  - ブラウザ確認
  - サーバー側のruby-versionあげる
  - リポジトリ作成
  - discordと連携
  - nginxの設定を見て、ベンチが実行できるように変更
    - 503 Bad Gateway解消
  - リクエストタイムアウト問題に対して
    - nginx側の時間を伸ばせないか?調査中
    - 静的ファイルをキャッシュできないか?調査中

### 次の時にやること
- tommyの初動を変更する
  - adacchiの開発環境作成が整うまではベンチ実行・アプリのコード読む
  - またnewrelicの導入手順だけ作成して置いて、ローカル確認せずにMR作成する


## 感想
- adacchi
  - お前と俺は一緒だよ。
- tommy
  - 「パスワードが漏洩しました。」
- yocchi
  - タイムアウトが出るとスコアが伸びる...?
### 何したか?
- adacchi
    - https://github.com/yothio/isu_7_practice/pull/5
    - GET /fetchの処理を改修
    - ベンチで`新着件数が正しくありません`と出て絶望した

- tommy
  - newRelicのymlファイルを発掘して導入
  - ランダム文字列の生成が毎度Newしていたので、`SecureRandom`で出すように変更(手元では早くなったけど、どうなんだろう)
  - /loginの箇所にて、`SELECT *`で全部取得していたところあったので、調査。

- yocchi
  - mysqlでindexにkeyを貼った
  - ベンチの実行(スコア伸びた 6000→8000)
  - レスポンスをgzipで送るように変更
  - nginx側でコンテンツキャッシュを有効化調査


- git の省略コマンド
- 21
  - https://try.newrelic.com/rs/412-MZS-894/images/Get%20Ready%20for%20ISUCON10-2%20-%202020-07-30.pdf

# 2020/09/12
## TODO 
### アプリ + DB
- [ ] N+1の解消
- [ ] インスタンスキャッシュ(@hoge ||= fuga)できるか
- [ ] DBインデックス
- [ ] 