[M1Mac]isucon11予選問題の環境をローカルに構築+必要最低限のツールを導入しチューニング作業を開始できる状態まで持っていく
matsuu/cloud-init-isucon: ISUCON過去問環境を構築するためのcloud-config集
を利用させて頂き、isucon11-qualifyのローカル環境構築を行ってみました。それに加え最低限必要と思われるツール導入を行ってみたので、そのメモになります。
筆者はisuconに今年初めて出場予定の初心者である点、ご承知おきください。
環境
- M1 MacBook Air(メモリ16GB)
ローカル環境構築
multipassをインストール
brew install multipass
リポジトリをcloneしてUbuntu環境を構築
リポジトリをクローンし、multipassコマンドでUbuntuインスタンスを立ち上げます。メモリは4GBとします。
git clone https://github.com/matsuu/cloud-init-isucon
cd cloud-init-isucon/isucon11q
multipass launch --name isucon11q --cpus 2 --disk 16G --mem 4G --cloud-init isucon11q.cfg 20.04
しばらく待ちます。
matsuu/cloud-init-isucon: ISUCON過去問環境を構築するためのcloud-config集
cloud-initは時間がかかるため以下のようなメッセージが表示される場合がありますが、バックグラウンドで構築は継続しています
とのことなのでタイムアウトエラーが出ても慌てずに待ちます。
構築が完了したら、
multipass shell isucon11q
で立ち上がったUbuntuに入れます。中にはいれたら
sudo -i -u isucon
でisuconユーザにチェンジします。以降のUbuntu上の作業は基本的にすべてisuconユーザで行います。
言語を変更
isucon11-qualify/manual.md at main · isucon/isucon11-qualify
マニュアルに従いプログラミング言語を変更します。今回はRubyを設定します。
sudo systemctl disable --now isucondition.go.service
sudo systemctl enable --now isucondition.ruby.service
benchを実行してみる
benchコマンドが実行できることを確認します。
cd bench
./bench -all-addresses 127.0.0.11 -target 127.0.0.11:443 -tls -jia-service-url http://127.0.0.1:4999
アプリケーションをブラウザで開いてみる
次のコマンドを実行します。
multipass ls
すると下記の出力が得られます。
Name State IPv4 Image
isucon11q Running ***.***.***.*** Ubuntu 20.04 LTS
IPv4
の値を確認し、 http://***.***.***.***:3000
をブラウザで開くとISU CONDITIONのアプリを見ることができるはずです。
便利ツール群のセットアップ
VSCode Remote Developmentで接続できるようにする
エディタにVSCodeを使用しており、掲題のVSCode拡張を追加済みであることが前提です。
VSCodeでリモート接続できると何かと作業しやすそうなので設定しておきます。
ssh設定
まずmacで鍵を作ります。名前を id_rsa_isucon11q
とします。
cd ~/.ssh
ssh-keygen -t rsa -f id_rsa_isucon11q
公開鍵の値を控えておきます。
cat id_rsa_isucon11q.pub
ubuntuインスタンスに ~/.ssh/authorized_keys
を作成し、公開鍵の値を追加します。
cd ~/.ssh
touch authorized_keys
chmod 600 authorized_keys
vi authorized_keys # viエディタで開き、公開鍵の値をペーストし保存
macターミナルからsshできることを確認しておきます。
ssh isucon@***.***.***.*** -i ~/.ssh/id_rsa_isucon11q
VSCode設定
VSCode左メニューより Remote Explorer
-> SSH Targets
-> +
ボタンと選択し、先ほど接続確認したsshコマンド ssh isucon@***.***.***.*** -i ~/.ssh/id_rsa_isucon11q
を設定します。
Open Folder
より /
(ルート)を設定して開いておくとまるっと全部のファイルを見渡せて便利な気がします。
alp導入
ubuntuインスタンスにalpを導入します。
Releases · tkuchiki/alpよりダウンロードしたいファイルのURLを確認し、wgetコマンドでダウンロードします。
wget https://github.com/tkuchiki/alp/releases/download/v1.0.9/alp_linux_arm64.tar.gz
tar -zxvf alp_linux_arm64.tar.gz
installationを参考に、
sudo install alp /usr/local/bin/alp
を実行します。
alp --version
で動作確認します。
Nginxログ設定
Nginxのログをalpで解析できるようにするためには
- LTSV
- JSON
のどちらかの出力形式に設定する必要があります。今回はLTSV設定を行います。
sudo vi /etc/nginx/nginx.conf
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
- log_format main '$remote_addr - $remote_user [$time_local] "$request" '
- '$status $body_bytes_sent "$http_referer" '
- '"$http_user_agent" "$http_x_forwarded_for"';
- access_log /var/log/nginx/access.log main;
+ log_format ltsv "time:$time_local"
+ "\thost:$remote_addr"
+ "\tforwardedfor:$http_x_forwarded_for"
+ "\treq:$request"
+ "\tmethod:$request_method"
+ "\turi:$request_uri"
+ "\tstatus:$status"
+ "\tsize:$body_bytes_sent"
+ "\treferer:$http_referer"
+ "\tua:$http_user_agent"
+ "\treqtime:$request_time"
+ "\truntime:$upstream_http_x_runtime"
+ "\tapptime:$upstream_response_time"
+ "\tcache:$upstream_http_x_cache"
+ "\tvhost:$host";
+ access_log /var/log/nginx/access.log ltsv;
sendfile on;
#tcp_nopush on;
keepalive_timeout 65;
#gzip on;
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*.conf;
}
上記のように設定ファイルを変更し、保存後にNginxを再起動します。
sudo systemctl restart nginx
それではalpで解析できることを確認していきます。まず既存ログをクリアしておきます。
sudo truncate /var/log/nginx/access.log --size 0
そしてbenchコマンドを実行します。bench完了後、alpでNginxログの解析を行います。
sudo cat /var/log/nginx/access.log | alp ltsv
MariaDBスロークエリログ設定
MariaDBのスロークエリログを設定します。あまり詳しくないのですがMySQLと互換性がある認識なので、MySQLの情報も参考にしつつ設定を進めます。
sudo vi /etc/mysql/conf.d/my.cnf
[mysqld]
character-set-server=utf8mb4
+slow_query_log=ON
+long_query_time=0.001
+slow_query_log_file=my-slow.log
[mysql]
default-character-set=utf8mb4
[client]
default-character-set=utf8mb4
ちなみにこの設定の場合 /var/lib/mysql/my-slow.log
にスロークエリログが出力されるようです。
再起動して設定を反映します。
sudo systemctl restart mysql
pt-query-digest導入
percona-toolkitの中にpt-query-digestが含まれているようなのでこちらをインストールします。
sudo apt install -y percona-toolkit
動作確認してみます。先に bench
コマンドを実行した後、
sudo pt-query-digest /var/lib/mysql/my-slow.log > /tmp/pt-query-digest.txt
を実行します。そして /tmp/pt-query-digest.txt
を確認するとレポート結果が出力されていることが確認できます。
参考
- matsuu/cloud-init-isucon: ISUCON過去問環境を構築するためのcloud-config集
- isucon 11予選環境のローカル構築メモ
- alpの使い方(基本編)
- isucon7に参加する準備 - Qiita
- [Linux]ファイルの圧縮、解凍方法 - Qiita
- ssh-keygenでファイル名を指定して作成 - Qiita
- ssh公開鍵認証設定まとめ - Qiita
- IPアドレスの例示で xxx.xxx.xxx.xxx を使うな - Qiita
- IPアドレスの例示で「xxx.~」は使ってはいけない? 「めんどくさい説教かと思ったら違った」などの反応続々 - ITmedia NEWS
- multipassで仮想マシン作ったら名前をつけると便利 - Qiita
- [Ruby] isucon11-qualifyを解説を見ながらなぞってみる
- MySQL スロークエリ改善 初心者向け
- MySQLでデータが増えてきたときのpt-query-digest - Qiita
- percona/percona-toolkit: Percona Toolkit
- DB 高負荷時に数秒でサクッと原因を特定する (aws RDS) - Qiita
- isucon8の予選の環境構築 - 解析編 - Qiita
- 既存のファイルを空にするLinuxコマンド - Qiita
Discussion