🥥
ISUCONハンズオン会

ekusiadadus

ekusiadadus

2022年7月15日
ISUCON

ISUCONのハンズオン会~claat~

id: Work1 summary: Work1 categories: matsuri-isucon environments: Web status: Published

# ハンズオン

# 概要

# このワークで学べること

このワークでは、以下のことを学びます。

  • どのようなサイトなのか確認する
  • ベンチマークを動かす
  • MySQL にインデックスを貼る

# 作業前

bench1

# 作業後

# Iscogram サイト

マニュアル

レギュレーション

# ログイン

isucogram1

ログインボタンから、ログイン画面に遷移します。

ユーザーを作成してみましょう!

isucogram2

作成に成功すると、ログアウトボタンの上にユーザー名が表示されます。

isucogram3

# SSH 接続

実際にサーバーに SSH 接続して、サーバーの中身を見てみましょう。

Host private-isu1
  HostName [User]([[.Team.App1]])
  IdentityFile ~/.ssh/id_rsa
  User isucon

Host private-isu2
  HostName [User]([[.Team.App2]])
  IdentityFile ~/.ssh/id_rsa
  User isucon

Host private-isu3
  HostName [User]([[.Team.App3]])
  IdentityFile ~/.ssh/id_rsa
  User isucon

Host private-isu-bench
  HostName [User]([[.Team.Bench]])
  IdentityFile ..ssh/id_rsa
  User isucon

上の config を~/.ssh/config に追記しましょう。

ssh private-isu1 で接続することができます。

もしくは、ssh isucon@[User]([[.Team.App1]]) で接続することができます。

ssh1

# ベンチマーク

ISUCON では、ベンチマークの点数を競います。 ベンチマーク用のインスタンスから、競技用のインスタンスに向けてベンチマークを回します。 早速ベンチマークを回してみましょう!

ベンチマーク用インスタンス

/home/isucon/private_isu.git/benchmarker/bin/benchmarker -u /home/isucon/private_isu.git/benchmarker/userdata -t http://User

ベンチマークが終わるまで、約一分かかります。

今回の、private-isu では初期状態で点数が 0 点であることもあります。(アプリがそもそも遅すぎるから)

bench1

# MySQL

# スロークエリログ

スロークエリログは、クエリの中で遅いクエリを集計したログです。 スロークエリログの解析ツールは、たくさんあります。

  • pt-query-digest
  • MySQL WorkBench

今回は、pt-query-digest を使用して、スロークエリログを解析します。

mysqld.cnf に スロークエリログの設定を入れます。

mysqld.cnf

ベンチを再度動かすと、スロークエリログの集計ができます。

集計開始

pt-query-digest1

comments が重そう。。。

pt-query-digest2

# MySQL にインデックスを貼る

pt-query-digest では、comments が重そうでした。 MySQL にインデックスを貼ってみましょう!

CREATE INDEX comments_index1 ON comments (post_id, created_at desc);

index1 index2 index3

もう一度、ベンチマークを回してみましょう!

index4

0 点から、19000 点まで上がりました!

また、スロークエリの結果も変わりました。

index5

comments でなく、posts が上位に来るようになりました。(ここもインデックスを貼ると改善されます)

id: Work2 summary: Work2 categories: matsuri-isucon environments: Web status: Published

# ハンズオン

# 概要

# このワークで学べること

このワークでは、以下のことを学びます。

  • app2 台、db1 台構成にする

# app1 台,db1 台に変更する

app1 台、db1 台にするためには、以下の手順を踏みます。

  1. MySQL で、bind-address を解放する
  2. MySQL で、外部からアクセスできるユーザーを作成する
  3. firewall(ここは、今回 AWS セキュリティグループで設定しているので不要)
  4. アプリを書き換える

# 1. MySQL で、bind-address を解放する

sudo vim /etc/mysql/mysql.conf.d/mysqld.cnf

mysql1

# 2. MySQL で、外部からアクセスできるユーザーを作成する

flush privileges;

skip-grant-tables

CREATE USER "isuconp"@"52.194.191.15" IDENTIFIED BY "isuconp";

# 3.

sudo systemctl stop isu-go sudo tee /etc/systemd/system/isu-go.service >/dev/null <isu-go.service sudo systemctl daemon-reload sudo systemctl start isu-go

[Unit]
Description=isu-go
After=syslog.target

[Service]
WorkingDirectory=/home/isucon/private_isu/webapp/golang
EnvironmentFile=/home/isucon/env.sh
Environment=RACK_ENV=production
PIDFile=/home/isucon/private_isu/webapp/golang/server.pid
Environment=MYSQL_DRIVER_POSTFIX=:logger
Environment=SQL_LOGFILE=/tmp/sql.log
Environment=CPU_PROFILE_FILE=/tmp/cpu.pprof

User=isucon
Group=isucon
ExecStart=/home/isucon/private_isu/webapp/golang/app -bind "127.0.0.1:8080"
ExecStop=/bin/kill -s QUIT $MAINPID

[Install]
WantedBy=multi-user.target

mysql3

27400点台まで、スコアが上がりました!