💻

[M1Mac]isucon11予選問題の環境をローカルに構築+必要最低限のツールを導入しチューニング作業を開始できる状態まで持っていく

2022/07/10に公開

matsuu/cloud-init-isucon: ISUCON過去問環境を構築するためのcloud-config集

を利用させて頂き、isucon11-qualifyのローカル環境構築を行ってみました。それに加え最低限必要と思われるツール導入を行ってみたので、そのメモになります。

筆者はisuconに今年初めて出場予定の初心者である点、ご承知おきください。

環境

  • M1 MacBook Air(メモリ16GB)

ローカル環境構築

multipassをインストール

mac
brew install multipass

リポジトリをcloneしてUbuntu環境を構築

リポジトリをクローンし、multipassコマンドでUbuntuインスタンスを立ち上げます。メモリは4GBとします。

mac
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は時間がかかるため以下のようなメッセージが表示される場合がありますが、バックグラウンドで構築は継続しています

とのことなのでタイムアウトエラーが出ても慌てずに待ちます。

構築が完了したら、

mac
multipass shell isucon11q

で立ち上がったUbuntuに入れます。中にはいれたら

ubuntu
sudo -i -u isucon

でisuconユーザにチェンジします。以降のUbuntu上の作業は基本的にすべてisuconユーザで行います。

言語を変更

isucon11-qualify/manual.md at main · isucon/isucon11-qualify

マニュアルに従いプログラミング言語を変更します。今回はRubyを設定します。

ubuntu
sudo systemctl disable --now isucondition.go.service
sudo systemctl enable --now isucondition.ruby.service

benchを実行してみる

benchコマンドが実行できることを確認します。

ubuntu
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

アプリケーションをブラウザで開いてみる

次のコマンドを実行します。

mac
multipass ls

すると下記の出力が得られます。

mac
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 とします。

mac
cd ~/.ssh
ssh-keygen -t rsa -f id_rsa_isucon11q

公開鍵の値を控えておきます。

mac
cat id_rsa_isucon11q.pub

ubuntuインスタンスに ~/.ssh/authorized_keys を作成し、公開鍵の値を追加します。

ubuntu
cd ~/.ssh
touch authorized_keys
chmod 600 authorized_keys
vi authorized_keys # viエディタで開き、公開鍵の値をペーストし保存

macターミナルからsshできることを確認しておきます。

mac
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コマンドでダウンロードします。

ubuntu
wget https://github.com/tkuchiki/alp/releases/download/v1.0.9/alp_linux_arm64.tar.gz
tar -zxvf alp_linux_arm64.tar.gz

installationを参考に、

ubuntu
sudo install alp /usr/local/bin/alp

を実行します。

ubutnu
alp --version

で動作確認します。

Nginxログ設定

Nginxのログをalpで解析できるようにするためには

  • LTSV
  • JSON

のどちらかの出力形式に設定する必要があります。今回はLTSV設定を行います。

ubuntu
sudo vi /etc/nginx/nginx.conf
/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を再起動します。

ubuntu
sudo systemctl restart nginx

それではalpで解析できることを確認していきます。まず既存ログをクリアしておきます。

ubuntu
sudo truncate /var/log/nginx/access.log --size 0

そしてbenchコマンドを実行します。bench完了後、alpでNginxログの解析を行います。

ubuntu
sudo cat /var/log/nginx/access.log | alp ltsv

MariaDBスロークエリログ設定

MariaDBのスロークエリログを設定します。あまり詳しくないのですがMySQLと互換性がある認識なので、MySQLの情報も参考にしつつ設定を進めます。

ubuntu
sudo vi /etc/mysql/conf.d/my.cnf
/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 にスロークエリログが出力されるようです。

再起動して設定を反映します。

ubuntu
sudo systemctl restart mysql

pt-query-digest導入

percona-toolkitの中にpt-query-digestが含まれているようなのでこちらをインストールします。

ubuntu
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 を確認するとレポート結果が出力されていることが確認できます。

参考

Discussion