ISUCON過去問にNew Relic APMを入れてみる(Ruby、Python、php)

記事タイトルとURLをコピーする

こんにちは、マネージドサービス大城です。

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を開いてデータが来ていることを確認します。

isucon-ruby

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を開いてデータが来ていることを確認します。

isucon-python

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を開いてデータが来ていることを確認します。

isucon-php

最後に

ここまで読んでいただきありがとうございます。この記事が誰かの役に立ったら幸いです。

普段インフラ屋さんをしているので、アプリ周りを触るのは勉強になることが多いです。次回は APM の画面をみてボトルネックを確認する記事を書いてみたいと思います。

大城 慶明 (記事一覧)

マネージドサービス部

2022年10月サーバーワークスに入社、沖縄からリモート勤務。AWSを勉強中。沖縄では大城が多いので「よっさん」と呼ばれています。AWS14冠。NRUG沖縄支部運営。X @yo_ohshiro