こんにちは、マネージドサービス大城です。
ISUCON過去問の環境に、Ruby、Python、phpのNew Relic APMを入れてみました。当ブログでは下の内容を書きます。
- AWSにオールインワン環境準備
- New Relic APM インストール
- ベンチマークツールを実行
- New Relicにデータが来ていること確認
実際にNew Relic画面をみて、ボトルネックを特定する作業は当ブログでは書きません。またの機会に書きたいと思います。
ISUCONとは
ChatGPTに聞きました(手抜きしてすみませんw)
ISUCON(イスコン)は、ウェブシステムのパフォーマンスを競う技術大会です。参加者は、与えられた課題に対してウェブアプリケーションのパフォーマンスを最適化し、高速化することを目指します。ISUCONは、日本発祥の大会であり、システム運用やプログラミングスキルを競うことで、参加者の技術力向上を図ることを目的としています。
公式ブログはこちら 優勝賞金は100万円のようです。100万円いいですね。アーロンチェアほしいです。
前準備
ISUCON13のマニュアルをよく読みます
New Relic 無料サインアップをしておきます
AWSにオールインワン環境準備
利用するAMI
ISUCON公式ブログ「ISUCONの過去問にチャレンジするためのシンプルな環境構築」から「matsuu/aws-isucon: ISUCON過去問をAWS環境で構築するための一式」を利用しました。
ISUCON13 の ami-006d211cb716fe8a0
を利用させていただきました。
AMIを起動する
ami-006d211cb716fe8a0
を下記の通り起動します。(詳細な手順は省いております。)
- 東京リージョン(ap-northeast-1)
- キーペアは任意のものを指定する
- インスタンスタイプは t3.medium
- パブリックサブネットに起動する
- パブリック IP アドレス を有効にする。EIPでもOK
- セキュリティグループは下の通り
- インバウンド:マイIP からのssh、httpsを許可する
- アウトバウント:ALL開放
EC2にsshする
下のコマンドでsshすることができます。sshした後に「isucon」ユーザーにスイッチします。ターミナル上は基本的に「isucon」ユーザーで操作することになります。
ssh -i xxx.key ubuntu@パブリックIP sudo -i -u isucon
MySQLに初期データを入れる
MySQLに起動後は初期データが入っていないので動作確認のため、データを入れておきます。
sudo -i -u isucon ~/webapp/sql/init.sh
アプリにhttpsでアクセスする
hostsの追加
作業PCのhostsに下記を追加します
(Macの場合の手順です)
sudo vi /etc/hosts # 下記を追加 EC2のパブリックIP pipe.u.isucon.local
自己証明書の追加
EC2内のnginxにTLS自己証明書がインストールされています。そのままChromeなどで表示すると証明書エラーが出てアプリが表示できないので、作業PCに証明書をインストールしておきます。
(Macの場合の手順です)
EC2から証明書「/etc/nginx/tls/_.u.isucon.local.crt」をダウンロードしておきます。
作業PCでキーチェーンアクセスを開きます
「キーチェーンアクセスを開く」をクリックします
「ログイン -> 証明書」タブを開きます。
「_.u.isucon.local.crt」をドラックランドドロップします。
「*.t.isucon.local」が表示されることを確認します。
ブラウザより「https://pipe.u.isucon.local」にアクセスし、下のような画面が表示されたらOKです。
各種言語にAPMインストール
環境ができたのでAPMをインストールしていきましょう。
Go(New Relicさんのブログリンク)
ISUCON 11の時のNew Relicさんのブログですが、Go については下のブログに分かりやすく記載されているのでご参照ください。(ISUCONではGo が一番利用されているようなので紹介させていただきました)
ISUCON 環境に New Relic APM Agent を入れてみる (Go 編) | New Relic
Ruby
RubyにAPMを入れていきましょう。sshしたら「isucon」ユーザーにスイッチします。
sudo su - isucon
デフォルトでは Go でアプリが上がっているのでRubyに切り替えます。
sudo systemctl disable --now isupipe-go.service sudo systemctl enable --now isupipe-ruby.service
New Relicのドキュメントを見ながらAPMをインストールしていきます。
New Relic Rubyエージェントのインストール | New Relic Documentation
アプリが配置されているディレクトリに移動して New Relic APMの gemを追加します。
cd /home/isucon/webapp/ruby echo "gem 'newrelic_rpm'" >> Gemfile echo "gem 'newrelic-infinite_tracing'" >> Gemfile bundle install
New Relicのymlを生成します。
cd /home/isucon/webapp/ruby bundle exec newrelic install --license_key="xxxxxxxxxxxxxxxxxNRAL" "isucon-ruby"
アプリを見たところ Sinatra で動いているのでNew Relicの「Sinatra instrumentation」を見ながらソースコードに追加します。
シナトラのインストルメント | New Relic Documentation
cd /home/isucon/webapp/ruby vi app.rb # 下記を追加 require 'newrelic_rpm'
アプリを再起動します
sudo systemctl restart isupipe-ruby.service
負荷をかけてNew Relicにデータが来るか確認します。
cd ./bench run --enable-ssl
New Relicを開いてデータが来ていることを確認します。
Python
PythonにAPMを入れていきましょう。sshしたら「isucon」ユーザーにスイッチします。
sudo su - isucon
デフォルトでは Go でアプリが上がっているのでPythonに切り替えます。
sudo systemctl disable --now isupipe-go.service sudo systemctl enable --now isupipe-python.service
Python APM のインストールはGithubのREADMEが分かりやすかったのでこちらを参照してインストールを進めます
GitHub - newrelic/newrelic-python-agent: New Relic Python Agent
アプリが配置されているディレクトリに移動して New Relic APMの pipを追加します。
cd /home/isucon/webapp/python
pipenv install newrelic
APMの設定ファイルを生成します。
pipenv run newrelic-admin generate-config xxxxxxxxxxxxxxxxxNRAL newrelic.ini
APMの設定ファイルの中の app_name を設定します。
sed -i 's/^app_name =.*/app_name = isucon-python/g' /home/isucon/webapp/python/newrelic.ini
ソースコードに下記を追加します。
cd /home/isucon/webapp/python vi app.py # 下記を追加 import newrelic.agent newrelic.agent.initialize('newrelic.ini')
アプリを再起動します
sudo systemctl restart isupipe-python.service
負荷をかけてNew Relicにデータが来るか確認します。
cd ./bench run --enable-ssl
New Relicを開いてデータが来ていることを確認します。
php
phpにAPMを入れていきましょう。(少しハマりました)
sshしたら「isucon」ユーザーにスイッチします。
sudo su - isucon
デフォルトでは Go でアプリが上がっているのでphpに切り替えます。
sudo systemctl disable --now isupipe-go.service sudo systemctl enable --now isupipe-php.service
phpのみnginxの設定が追加で必要なのでISUCON13のマニュアル通り行います。
sudo ln -s /etc/nginx/sites-available/isupipe-php.conf /etc/nginx/sites-enabled/ sudo systemctl restart nginx.service
New Relicのマニュアル通りに phpのAPMを入れていきます。
PHPエージェントのインストール:UbuntuとDebian | New Relic Documentation
echo 'deb http://apt.newrelic.com/debian/ newrelic non-free' | sudo tee /etc/apt/sources.list.d/newrelic.list wget -O- https://download.newrelic.com/548C16BF.gpg | sudo apt-key add - sudo apt-get update sudo apt-get install newrelic-php5
ここで少しハマってしまいます。「newrelic-install install」でphpが見つからないとメッセージが出てしまいます。
sudo newrelic-install install We searched and searched and couldn't find any complete enough PHP installs. You may well have PHP installed on your system but are lacking either the command line version or the php-config program that should accompany each PHP install. Sometimes, these require that you install the "dev" package for PHP or the "cli" version. We need one or the other. Please visit https://newrelic.com/docs/php and review the installation documentation for ways in which you can customize this script to look for PHP in non-standard locations or to do a manual install.
環境を確認したところ「/home/isucon/local/php/bin」にphpがインストールされていました。
また「newrelic-install」コマンドはrootでしか実行できないため、rootがphpのPATHを見つけられずメッセージが出ていました。
rootで一時的にPATHを通す必要があります。悩んだ結果「/tmp/nr_install.sh」を作成して実行しました。
実行後にnewrelic.ini がrootユーザーで作成されてしまうので、念の為isuconユーザーにオーナー変更しておきます。
cat <<EOF > /tmp/nr_install.sh PATH=/home/isucon/local/php/bin:\$PATH newrelic-install install chown isucon. /home/isucon/local/php/etc/conf.d/newrelic.ini EOF chmod +x /tmp/nr_install.sh sudo /tmp/nr_install.sh
New Relicのライセンスキーを求められるので入力します
New Relic PHP Agent Installation (interactive mode) =================================================== Enter New Relic license key (or leave blank): xxxxxxxxxxxxxxxxxNRAL
APMの設定ファイルの中の newrelic.appname を設定します。
sed -i 's/^newrelic.appname.*/newrelic.appname = isucon-php/g' /home/isucon/local/php/etc/conf.d/newrelic.ini
アプリを再起動します。
sudo systemctl restart isupipe-php.service
負荷をかけてNew Relicにデータが来るか確認します。
cd ./bench run --enable-ssl
New Relicを開いてデータが来ていることを確認します。
最後に
ここまで読んでいただきありがとうございます。この記事が誰かの役に立ったら幸いです。
普段インフラ屋さんをしているので、アプリ周りを触るのは勉強になることが多いです。次回は APM の画面をみてボトルネックを確認する記事を書いてみたいと思います。
大城 慶明 (記事一覧)
マネージドサービス部
2022年10月サーバーワークスに入社、沖縄からリモート勤務。AWSを勉強中。沖縄では大城が多いので「よっさん」と呼ばれています。AWS14冠。NRUG沖縄支部運営。X @yo_ohshiro