---
# System prepended metadata

title: NTT PTC2020

---

# NTT PTC2020


## 各リンク
- [ベンチマークリクエストのページ](https://practice.ptc.ntt.dev/)
- [API仕様書](https://practice.ptc.ntt.dev/spec.html)
- [練習会マニュアル](https://docs.google.com/document/d/1xNbNdw849FrsCy_TWWMMJ1Cd-VoNqie3cMyUrkuwQ8c/edit)
- [練習会オフィスアワーの動画](https://drive.google.com/file/d/1P1Dx1HdT0TA8inqu12-F1YrYzL9bDrrd/view)
- [MySQL パフォーマンスチューニングTIPS](https://speakerdeck.com/yoshiakiyamasaki/mysqlpahuomansutiyuningutips?slide=19)
- [ISUCON チートシート](https://qiita.com/harhogefoo/items/d4f9d62979e4122a5832)
- [ISUCONの負け方](https://qiita.com/suthio/items/c3b8c4456ec1b441f826)
- [ISUCONの準備](https://qiita.com/shun91/items/5080e6bda83cc1298453)
- [練習会の資料](https://docs.google.com/presentation/d/1u_XPLzl8VDRG_bfxpi6sfze_VffCsF40zAEH_PKxqUk/edit#slide=id.g5df7ac6c71_4_5)
- [ホワイトボード](https://jamboard.google.com/d/1ZfqO_nwuyr7w6kUfrLzb8RgWW1ptq75Gk9rJ-QazZsg/edit?usp=sharing)
- [バックアップ用リポジトリ](https://github.com/takaya-ito/smb-isucon)

## インフラ系のリンク
- [インフラのお仕事](https://qiita.com/ihsiek/items/11106ce7a13e09b61547)
- [apache性能](https://httpd.apache.org/docs/2.4/ja/mod/core.html#maxkeepaliverequests)
- [サーバの負荷分散](https://www.slideshare.net/yuta-ishiyama/web-application-server-126087000)
- [nginxのリバースプロキシ化](https://qiita.com/mike-ayumu/items/5f255bab07606759a8e5)

## スケジュール
• 9時45分： 集合。開会＆前説
• 10時00分： 競技開始
• 　（この間時間の使い方は自由）
• 16時00分： 競技終了
• 　（この間自由時間）
• 17時00分： 結果発表
• 17時30分： 解散


## 事前準備

### サーバ設定

### 言語決め
- Go
- Node.js
- Ruby
- Python

## 役割分担
- API(プログラム面)
    - taccho
- DB
    - mitsu
- サーバ・ネットワーク(インフラ面)
    - pop


## 測定ツール類
- htop
    - httpの測定ツール
- kataribe
    - どのURIにどれくらいのアクセスがあり、それぞれどの程度の時間がかかったか出力
- alp
    - kataribeと同様、LTSV形式
- pt-query-digest(DBの測定ツール)
    - クエリに時間のかかっている箇所を集計して可視化してくれる


## 始めにやること
- git管理(色々と壊す可能性があるため)
    - 直して計測して、スコアが良かったらmasterにpush
- 事前インストール
    - sudo systemctl start niita_node
    - sudo apt-get -y install htop
    - sudo apt-get -y install dstat
    - alp
        - wget https://github.com/tkuchiki/alp/releases/download/v0.3.1/alp_linux_amd64.zip
        - unzip alp_linux_amd64.zip
        - sudo install ./alp /usr/local/bin

## サーバ接続
- メインサーバ(ベンチマークテスト)
    - ssh ptc-user@34.85.38.116 -o "ServerAliveInterval 30"
- Extra Server
    - ssh ptc-user@35.200.84.94 -o "ServerAliveInterval 30"
    - ssh ptc-user@35.200.57.207 -o "ServerAliveInterval 30"

## 当日の進め方
- 必要なツールのインストール
    - スクリプトを準備？
- gitのセットアップ
    - `/app` のみでよい？ -> `/etc`配下もやるらしい
- アクセスログ解析用設定（ubuntuの場合）
    - `/etc/apache2/apache2.conf` にalp用の LogFormat 設定を追加（他のLogformatはコメントアウト？）
    ```
    LogFormat "time:%t\tforwardedfor:%{X-Forwarded-For}i\thost:%h\treq:%r\tstatus:%>s\tmethod:%m\turi:%U%q\tsize:%B\treferer:%{Referer}i\tua:%{User-Agent}i\treqtime_microsec:%D\tapptime:%D\tcache:%{X-Cache}o\truntime:%{X-Runtime}o\tvhost:%{Host}i" ltsv
    CustomLog /var/log/access.log ltsv
    ```
    - `sudo systemctl restart apache`
    - ログみるコマンド例: `alp -f /var/log/access.log`
    - alp(公式github): https://github.com/tkuchiki/alp
- mysql クエリログ解析用の設定
    - `/etc/mysql/my.cnf`に以下を追加
    ```
    [mysqld]
    slow_query_log = 1
    slow_query_log_file = /var/log/mysql/slow.log
    long_query_time = 0
    ```
    - `sudo systemctl restart mysql`
    - `sudo systemctl restart niita_node`
    - 解析はこれ: `sudo pt-query-digest --limit 10 /var/log/mysql/slow.log`
- 動いているプロセスの確認
    - `ps aux`
    - `dstat -ta --top-cpu`
        - 他オプション参考:  https://qiita.com/ryuichi1208/items/387fa1cba44690c3db9b
    


## その他
-  ls /etc/systemd/system
    -  各言語実装のserviceファイルが格納されている
- サービスの停止
    - sudo service apache2 stop
- apacheのconfigファイルのありか (ubuntu)
    - `/etc/apache2/apache2.conf`
    - alpでlog解析するためのconfig投入(`/etc/apache2/apache2.conf`)
        - LogFormat "time:%t\tforwardedfor:%{X-Forwarded-For}i\thost:%h\treq:%r\tstatus:%>s\tmethod:%m\turi:%U%q\tsize:%B\treferer:%{Referer}i\tua:%{User-Agent}i\treqtime_microsec:%D\tapptime:%D\tcache:%{X-Cache}o\truntime:%{X-Runtime}o\tvhost:%{Host}i" ltsv
        - CustomLog /var/log/access.log ltsv
        - sudo systemctl restart apache

- dstat
    - 各プロセスの使用情報がわかりやく見える
    - dstat -ta --top-cpu

- チューニングポイント
    - 静的ファイルはnginxで配布
    - 遅いクエリの改善
    - select * は遅い
    - indexを適切に張る
    - offsetの破棄（まずidだけでソート→対象idを取り出し、もっかいクエリ投げる）
    - キャッシュする（redisとか）
    - DBをキャッシュする
    - HTMLをキャッシュする
    - テンプレートエンジンをキャッシュする
    - マイクロサービスをやめる
    - 正規表現の最適化
    - （ベンチマーカーの挙動を解析する。アクセスログとか見て。）
    - apacheじゃなくてnginxにする

## todo
- pt-query-digest も入れてみると良さそう
    - スロークエリログ集計
- 再起動時のスクリプトを用意しておく


