private-isuを使ってISUCONの練習するぞ
こちらの書籍をもとに進めていきます
セットアップ
- https://ap-northeast-1.console.aws.amazon.com/ec2/home?region=ap-northeast-1#ImageDetails:imageId=ami-0bed62bba4100a4b7 をクリックし、AMIからインスタンスを起動
- c7g.large
- EC2のアクション>セキュリティ>IAM Roleの設定変更 でSSM Roleを追加する
- セッションマネージャからセッションを開く(なんでこのステップが必要なのかよくわかっていない)
SSM接続してくださいがドキュメントの案内で終わっていたので手こずったけれど、IAM Roleの読み込みが遅いだけだった。
- AmazonSSMManagedInstanceCoreを指定してIAM Roleを作る
- 1で作ったRoleをインスタンスにアタッチする
おわり!!!!!!VPCエンドポイントがどうとか色々調べていたけれど関係なかったわい!!!!!
セキュリティグループの設定
自分のIPだけ許可した上で80番ポートをあけよう。ちゃんと本に書いてある。
パブリックIPをつけているので、パブリックIPをブラウザに入力するとこの画面が見れる!やった!これでスタート地点に立った!
nginxでJSON形式のアクセスログを出力する
sudo vi /etc/nginx/nginx.conf
log_format json escape=json '{'
'"time": "$time_iso8601",'
'"host": "$remote_addr",'
'"port": "$remote_port",'
'"method": "$request_method",'
'"uri": "$request_uri",'
'"status": "$status",'
'"body_bytes": "$body_bytes_sent",'
'"referer": "$http_referer",'
'"ua": "$http_user_agent",'
'"request_time": "$request_time",'
'"response_time": "$upstream_response_time"'
'}';
access_log /var/log/nginx/access.log json;
設定ファイルに問題がないか確認する
sudo nginx -t
NGINXをリロードする
sudo systemctl reload nginx
alpのインストール
sudo wget https://github.com/tkuchiki/alp/releases/download/v1.0.21/alp_linux_arm64.zip
sudo unzip alp_linux_arm64.zip
sudo install ./alp /usr/local/bin
ここでbashが使えることに気づく。遅い!
アクセスログが途中からJSON形式になっているとalpで読み込めないので、一旦アクセスログを強制ローテートする。他にいい方法ないかな
sudo mv /var/log/nginx/access.log /var/log/nginx/access.log.1
sudo systemctl restart nginx
出力例
sudo cat /var/log/nginx/access.log | alp json
+-------+-----+-----+-----+-----+-----+--------+------------------+-------+-------+-------+-------+-------+-------+-------+--------+-------------+-------------+-------------+-------------+
| COUNT | 1XX | 2XX | 3XX | 4XX | 5XX | METHOD | URI | MIN | MAX | SUM | AVG | P90 | P95 | P99 | STDDEV | MIN(BODY) | MAX(BODY) | SUM(BODY) | AVG(BODY) |
+-------+-----+-----+-----+-----+-----+--------+------------------+-------+-------+-------+-------+-------+-------+-------+--------+-------------+-------------+-------------+-------------+
| 4 | 0 | 4 | 0 | 0 | 0 | GET | /posts/10000 | 0.075 | 0.075 | 0.300 | 0.075 | 0.075 | 0.075 | 0.075 | 0.000 | 1387.000 | 1387.000 | 5548.000 | 1387.000 |
| 4 | 0 | 4 | 0 | 0 | 0 | GET | /image/10000.png | 0.003 | 0.003 | 0.012 | 0.003 | 0.003 | 0.003 | 0.003 | 0.000 | 1056749.000 | 1056749.000 | 4226996.000 | 1056749.000 |
+-------+-----+-----+-----+-----+-----+--------+------------------+-------+-------+-------+-------+-------+-------+-------+--------+-------------+-------------+-------------+-------------+
ssm-user@ip-172-31-18-243:/var/snap/amazon-ssm-agent/7984$
これがシンプルで見やすそう
more /var/log/nginx/access.log | alp json --sort sum -r -m "/posts/[0-9]+,/@\w+" -o count,method,uri,min,avg,max,sum
abコマンドをインストールする。abコマンド使ったことあるからうれし〜
sudo apt update
sudo apt install apache2-utils
ベンチマークコマンド
ab -c 1 -n 10 http://localhost/
集計
tail -n 10 /var/log/nginx/access.log | alp json -o count,method,uri,min,avg,max
ログファイルのローテート方法書いてあった。
cat << 'EOF' > rotate.sh
#!/bin/sh
mv /var/log/nginx/access.log /var/log/nginx/access.log.$(date +%Y%m%d-%H%M%S)
nginx -s reopen
EOF
chmod +x rotate.sh
ベンチマーク実施
ab -c 1 -n 30 http://localhost/
スローログクエリを設定する
vi /etc/mysql/mysql.conf.d/mysqld.cnf
以下を追記する
slow_query_log = 1
slow_query_log_file = /var/log/mysql/mysql-slow.log
long_query_time = 0
元の設定ファイルには以下が記載されている
# slow_query_log = 1
# slow_query_log_file = /var/log/mysql/mysql-slow.log
# long_query_time = 2
# log-queries-not-using-indexes
MySQLを再起動する
systemctl restart mysql
いくつかMySQLコマンド
show databases;
use <データベース名>;
indexを参照する
show index;
スローログに出てくるクエリが以下
SELECT * FROM comments WHERE post_id = N ORDER BY created_at DESC LIMIT N
なのでExplainと適当なNを埋めて参照する
explain SELECT * FROM comments WHERE post_id = 9995 ORDER BY created_at DESC LIMIT 3;
実行結果
mysql> explain SELECT * FROM comments WHERE post_id = 9995 ORDER BY created_at DESC LIMIT 3;
+----+-------------+----------+------------+------+---------------+------+---------+------+--------+----------+-----------------------------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+----------+------------+------+---------------+------+---------+------+--------+----------+-----------------------------+
| 1 | SIMPLE | comments | NULL | ALL | NULL | NULL | NULL | NULL | 100170 | 10.00 | Using where; Using filesort |
+----+-------------+----------+------------+------+---------------+------+---------+------+--------+----------+-----------------------------+
1 row in set, 1 warning (0.00 sec)
インデックスを作成する
alter table comments add index post_id_idx(post_id);
スローログをリフレッシュする
rm /var/log/mysql/mysql-slow.log
mysqladmin flush-logs
スローログの解析
mysqldumpslow /var/log/mysql/mysql-slow.log
dstatをインストールする
apt install dstat
dstatでCPUを解析
dstat --cpu
k6s install
公式には以下の通り
sudo gpg -k
sudo gpg --no-default-keyring --keyring /usr/share/keyrings/k6-archive-keyring.gpg --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys C5AD17C747E3415A3642D57D77C6C491D6AC1D69
echo "deb [signed-by=/usr/share/keyrings/k6-archive-keyring.gpg] https://dl.k6.io/deb stable main" | sudo tee /etc/apt/sources.list.d/k6.list
sudo apt-get update
sudo apt-get install k6
しかしarm64用は公式にないので以下を利用する
K6_TAR_LINK=https://github.com/grafana/k6/releases/download/v0.45.0/k6-v0.45.0-linux-arm64.tar.gz
curl -OL $K6_TAR_LINK
tar -xzf k6-v0.45.0-linux-arm64.tar.gz
sudo mv k6-v0.45.0-linux-arm64/k6 /usr/local/bin/k6
rm -rf k6-v0.45.0-linux-arm64*
単純な負荷試験
import http from "k6/http";
const BASE_URL = "http://localhost";
export default function () {
http.get(`${BASE_URL}/`);
}
このk6を使ったシナリオを持った負荷試験って実際のISUCONでもやるの??
スローログクエリを有効化
SET GLOBAL slow_query_log = 1;
SET GLOBAL slow_query_log_file = "/var/log/mysql/mysql-slow.log";
SET GLOBAL long_query_time = 0;
Percona Tookitのインストール
sudo apt update
sudo apt instal percona-toolkit
スローログクエリを解析する
pt-query-digest /var/log/mysql/mysql-slow.log | tee digest_$(date +%Y%m%d%H%M).txt
query-digester
git clone https://github.com/kazeburo/query-digester.git
cd query-digester
sudo install query-digester /usr/local/bin