参考: https://github.com/catatsuy/memo_isucon/blob/master/README.md Best Practices Gist: https://gist.github.com/minhquang4334/26e86a84731164581ed25d3fc7fe5211
- リポジトリを作成する (isucon12q)
- ポータルサイトにログインしてsshできることを確認
- インスタンスにログインしてsshできることを確認
- Makefileを適切に修正する
- ssh-keygenして鍵をdeploy keyに登録する
- コードをリポジトリにpushする
- Go実装に切り替えてベンチマークを流す
- 何もせずにベンチマークを流す
- 動作しているプロセスを確認しておおよその構成を理解する (ps auxwf)
- 必要なパッケージなどインストール (必須: alp, graphviz)
- nginxで計測できるようにして(alpを使う)、mysqlでSlowlogを計測できるようにする (mysqldumpslowを使う)
- 初回の結果をスコア履歴で投稿する (必須:score, top, alp, slowlog)
- pprof 設定する
- ハードウェアの構成を調べ (mysql versionなど, nginx http version)
- MySQL・画像などのバックアップを開発環境用に作成
- マニュアルを読み取って気になることを記載する
- スコア履歴と作業スレ作成
- マニュアルを読み取って、きになることを記載する
- Web 画面を見て、機能を確認する
- スキーマ一覧を共有
- 各テーブルのサイズを共有
- 各テーブルのレコード数を共有
- initialize の動作を確認する
- キーになる改善余地のある箇所があれば洗い出す
- Mysql の設定をベストプラティスに沿って設定する (my.cnf)
- Nginx 通信は Http 1.1で設定したのか
- Nginx のWorker Connectionsとworker_rlimit_nofileを十分ふやす (=OSの ulimitふやす)
- DBは別のインスタンスで管理する
- それに合わせてMakefileを修正する
- Net 通信を設定したのか (/etc/sysctl.cnf)
- 静的ファイルをNginx経由で通信しているか (js/css/gif/ico)
- NginxのCPUが高すぎる場合、gzipをoffにしておく
- 同じクエリパラメータで同じ結果を返すAPIがあれば、Nginxでちゃんとキャッシューできているか (nginx.confのSectionsでcached_endpointの例を使う)
- sql.DBに接続する箇所に interpolateParams=true追加する
- jsonを使う場合、gocy-jsonを使うように修正する
- exec.Commandをよく呼ばれている箇所はgolangのライブラリを使う
- sql.DBに接続するConnections数と Idle Connections数を適切に設定する
- アプリケーションログを出力しないようにする
- mysql 8 の場合、bin log出力を止めておく
- 再起動試験
- nginx access log off
- slow log off
- Os drop caches