Open29

private-isuを使ってISUCONの練習するぞ

あおいあおい

こちらの書籍をもとに進めていきます
https://www.amazon.co.jp/dp/4297128462

セットアップ

  1. https://ap-northeast-1.console.aws.amazon.com/ec2/home?region=ap-northeast-1#ImageDetails:imageId=ami-0bed62bba4100a4b7 をクリックし、AMIからインスタンスを起動
  2. c7g.large
  3. EC2のアクション>セキュリティ>IAM Roleの設定変更 でSSM Roleを追加する
  4. セッションマネージャからセッションを開く(なんでこのステップが必要なのかよくわかっていない)
あおいあおい

SSM接続してくださいがドキュメントの案内で終わっていたので手こずったけれど、IAM Roleの読み込みが遅いだけだった。

  1. AmazonSSMManagedInstanceCoreを指定してIAM Roleを作る
  2. 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
あおいあおい

アクセスログが途中から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
あおいあおい

集計

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
あおいあおい

スローログクエリを設定する

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