isucon練習会めも
友人とisuconの練習会を実施しましたが、全然できなかったので次に活かすためのメモ
インフラを担当したけど、ツールのインストトールやMySQLの操作コマンドがすぐに出てこず時間をかけてしまったので、当日の流れを自分がやったこと以外もまとめておく
isuconとは
やったこと
☆が今回自分でやったこと
事前準備
- 環境構築
- チーム分担
- 役割極め
- アプリ
- ☆ インフラ
- サーバーへのSSHを渡しておく
練習中
- ☆ レギュレーション確認 isucon.net
☆ マニュアル確認 github.com
-
- Slack連携
- サーバーにgitの設定
- メンバーにリポジトリのアクセス・編集権限を渡す
- ☆ 調べたこと、わかったことは一つのissueにどんどん書いていく
Makefile作成
- ビルドやベンチなど、何度も実行するものをまとめておく
- go build
- ☆アプリケーションサーバーからベンチ実行
- ☆SSHコマンドで実行するため鍵交換しておく
- ビルドやベンチなど、何度も実行するものをまとめておく
bench: ssh -l ubuntu [ベンチサーバーのIP] cd /home/isucon/isucari \&\& /home/isucon/isucari/bin/benchmarker -target-url http://18.183.105.62:80 -shipment-url http://13.231.82.53:7000 -payment-url http://13.231.82.53:5555
※ /home/isucon/isucari
配下に必要なログファイルがあるためそこに移動して実行しないといけないが、sshコマンドでディレクトリ移動した後のコマンド実行は \&\&
とエスケープする必要があり(ないと移動して実行されない)
- ☆ミドルウェアのバージョン確認
MySQL Server mysql> select version(); +-------------------------+ | version() | +-------------------------+ | 5.7.33-0ubuntu0.18.04.1 | +-------------------------+ 1 row in set (0.00 sec) Client ubuntu@ip-172-31-39-97:~$ mysql --version mysql Ver 14.14 Distrib 5.7.33, for Linux (x86_64) using EditLine wrapper Nginx $ nginx -V nginx version: nginx/1.14.0 (Ubuntu) Go $ cat go/go.mod module github.com/isucon/isucon9-qualify/webapp/go go 1.12 require ( github.com/go-sql-driver/mysql v1.4.1 github.com/gorilla/sessions v1.2.0 github.com/jmoiron/sqlx v1.2.0 goji.io v2.0.2+incompatible golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4 )
☆リソースモニタリングツールを入れる
- ☆Netdata github.com
- Dockerもあるが、curlで入れれば良い
-
- Nginxでログを取るため、80ポートを利用するように変更
- kataribeでログ集計 github.com
作戦を立てる
- kataribeを見て、実行時間が大きいものから着手
- (1つ大きいのを変えると他の順番が大きく変わることがあるので、2-3つめを並行してやるのは効果が薄かったりするらしい)
N+1クエリ改善
- 最重要
- 1箇所のみならず、複数箇所あることも
ユーザの一括取得とカテゴリのオンメモリ化
スロークエリ集計
- MySQLのスロークエリ出力設定
- 最初は0以上にして全て出してみる
- pt-query-digestで集計 www.percona.com
- MySQLのスロークエリ出力設定
インデックス作成
- スロークエリとなっており改善必要なものから
- EXPLAINを見て
☆DBを切り出す
$ sudo systemctl status isucari.golang.service | grep Active $ sudo systemctl stop isucari.golang.service $ sudo systemctl status isucari.golang.service | grep Active $ sudo systemctl status payment.service | grep Active $ sudo systemctl status shipment.service | grep Active $ sudo systemctl status nginx.service | grep Active $ sudo systemctl stop nginx.service
- ☆ MySQLへ外部ホストからのアクセス許可設定
- ☆ 設定確認
sudo mysql -e "SHOW VARIABLES LIKE 'bind%';"
- ☆
mysqld.cnf
の修正 - ☆ ユーザー毎の許可アクセス元の確認
☆ アプリケーションの向き先変更
- ☆ アプリケーションでDBの設定をしている箇所を修正
- 今回
env.sh
のMYSQL_HOST=XXX.XXX.XXX.XXX
を変える
DBコネクションプールの利用
connect: connection refused
が出ていたためコネクションを増やそうとする- 最大接続数は151だったので一旦そのままで良いという判断
☆ DBチューニング
[mysqld] innodb_buffer_pool_size=512MB query_cache_type=1
→この辺りはあまり効果が出ず
練習後
- 振り返り会
$ echo "* hard nofile 64000" >> /etc/security/limits.conf $ echo "* soft nofile 64000" >> /etc/security/limits.conf
次回に向けて
今回のisucon9はこちらの本でも取り上げられていたので再度一人でやっておく(本当は事前に一人でやっておくつもりができなかったので次回までは必ず・・。今回もチラチラ見ながらやってた)
Webサービスチューニングコンテスト ISUCONのススメ (技術の泉シリーズ(NextPublishing))
やることが多いため、繰り返しやりコマンド等に慣れておくのが大切(本業でのトラブル対応の役にも立ちそう)