ISUCON用チートシート
散乱してたISUCONで使ったコマンドチートシートをまとめておく
ツール入れる編
NETDATA
インストール
$ bash <(curl -Ss https://my-netdata.io/kickstart.sh)
スタート・ストップ
To stop netdata run: $ systemctl stop netdata To start netdata run: $ systemctl start netdata disableの時殺す $ systemctl disable netdata enableの時殺す $ systemctl disable --now netdata
解析編
アプリケーションログを見る
そもそも動いているプロセスは何か調べる
$ systemctl list-unit-files --type=service
goのバイナリファイルがあるサーバーで
$ journalctl -fxu isuumo.go
f: tail -f
的な
x: 詳細情報
u: -u ユニット名
kataribe
kataribeでアクセスログを集計する
$ sudo cat /var/log/nginx/access.log | ./kataribe
kataribe grouping
kataribe.toml
[[bundle]] regexp = '^(GET|HEAD) /recent/[0-9]+\b' name = "get recent" [[bundle]] regexp = '^GET /api/contestant/notifications?.*' name = "get /api/contestant/notifications?after="
db編
テーブルの調査
SELECT COUNT(*) FROM テーブル名; show columns from テーブル名; show index from テーブル名; # markdownのテーブル用 # |--|--|--|--|--|--| # |--|--|--|--|--|--|--|--|--|--|--|--|--|--|--|
index貼る
CREATE INDEX インデックス名 ON テーブル名 (カラム名[, カラム名…]) # force index SELECT * FROM t1 USE INDEX FOR JOIN (i1) FORCE INDEX FOR JOIN (i2); # 貼れてるか確認 explain SQL; # |--|--|--|--|--|--|--|--|--|--|--|--|
mysql-slow-logの設定
今の設定どうか確認する
mysql> show variables like 'slow_query%'; mysql> show variables like 'long%';
設定する
mysql> set global slow_query_log_file = '/tmp/mysql-slow.sql'; mysql> set global long_query_time = 0.1; mysql> set global slow_query_log = ON;
もしくはmy.cnfにこれをかく
https://github.com/zoetics/isucon2020-0628/pull/16/files
pt-query-digest
sqlのログを整形する. サーバー上で
# 権限問題により/home/isuconに移動してる $ sudo cp /var/log/mysql/mysql-slow.sql /home/isucon/mysql-slow.sql $ chown isucon mysql-slow.sql
ローカルで
$ scp isucon-app2:mysql-slow.sql . $ pt-query-digest mysql-slow.sql > pt-query-digest.txt
mysqlの外からsql叩く
$ mysql -uユーザー名 -pパスワード -e "SQL"
LIMIT OFFSET BETWEEN ANDの入れ替え作業
LINIT 取得数 OFFSET 取得開始位置 BETWEEN 以上 AND 以下
動的プレースホルダを使ってmysql負荷を下げる
interpolateParams=true
を設定する
Makefile編
.PHONY: gogo kataribe slow-log gogo: sudo systemctl stop h2o sudo systemctl stop torb.go sudo systemctl stop mariadb sudo truncate --size 0 /var/log/h2o/access.log -sudo truncate --size 0 /var/lib/mysql/mysql-slow.log make -C app/webapp/go build sudo systemctl start mariadb sleep 2 sudo systemctl start torb.go sudo systemctl start h2o sleep 2 ./app/exec_bench.sh $(MAKE) kataribe kataribe: sudo cat /var/log/h2o/access.log | ./kataribe slow-log: sudo mysqldumpslow -s at -t 10 /var/lib/mysql/mysql-slow.log
N+1いろいろ
dbconn, rows.Scan
クエリ二つにしてN+1を解消
refactor:topのN+1解消 by cureseven · Pull Request #3 · takoyakisoba/isucon-practice-20200802 · GitHub
in
Getmessage n1 by cureseven · Pull Request #7 · takoyakisoba/isucon-practice-20200830 · GitHub
join