キュアセブン技術ブログ

考えたこと,学んだことを書きます

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負荷を下げる

動的プレースホルダを使ってmysql負荷を下げる by pinkumohikan · Pull Request #11 · takoyakisoba/isucon-practice-20200816 · GitHub

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

fix: topHandlerのn+1問題を解消した by FuwariSprit · Pull Request #23 · okashoi/isucon-practice-20200718 · GitHub

クエリ二つにして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

fetchUnreadのN+1を軽減する by pinkumohikan · Pull Request #11 · takoyakisoba/isucon-practice-20200830 · GitHub