ENECHANGE Developer Blog

ENECHANGE開発者ブログ

Scout APM を導入して、高速化したときの話

自己紹介

cuzic こと、 ENECHANGE チーフエンジニアの川西です。

今回は enechange.jp で Scout APM を使って高速化した話を書きます。

はじめに

enechange.jp で、サイトが遅いので高速化したい、という声が開発者から多くありました。

特に、開発環境ではマシンが低速だったりキャッシュクリアして動作確認が必要なケースも多く、耐えがたく遅い場合がありました。

それで、性能監視ツール Scout APM を導入しました。 Scout APM を選定したのは単純に RubyKaigi で名刺交換し、2週間無料のアカウントを設定してもらったから。そのときは、たまたま忙しいタイミングであったということもあり、一切検証せずに2週間が過ぎてしまっていた。 今回、お願いしでみたら、あっさり再度 2週間の検証用アカウントを利用させてもらえた。神。

とはいえ、検証期間が2週間しかない。短い。締め切りまでにやらなきゃ。というわけでバタバタと 8件の PR を作成。

f:id:cuzic:20200117163828p:plain
Scout APM を参考にして作成した高速化 Pull Request

N+1 問題を解消する PR がほとんど。

N+1 問題があると、下記のようにタグがつくので、根本原因がすぐに分かります。

f:id:cuzic:20200117171830p:plain
N+1 問題の表示の例

N+1 問題以外にも高速化の役に立ちます。 この記事では、ずっと放置されていたレスポンスが遅い事象を発見・解決した件について特に紹介します。

低確率で発生する時間のかかる処理を高速化

今回の検証期間では Scout APM を本番環境にも導入し、性能監視を行いました。

すると、下記のような事象を発見しました。

f:id:cuzic:20200117163912p:plain
非常に遅い HTTP リクエストにより表示に 11秒かかっていた例

非常に遅い xml_tag_from_wp という同じメソッドを 5回呼んでいます。結果、表示に11秒もかかっています。遅すぎです。 これは Wordpress の API に対してリクエストするメソッドです。 このメソッドは非常に応答が遅くなるときはあるのですが、本来 Redis を使って結果をキャッシュするはずです。 5回も行われるような処理ではありません。

原因となった元のコードは下記のとおりでした。(実際のコードを説明用に簡素化しています)

return Rails.cache.read(cache_key) if Rails.cache.read(cache_key)

xml_tag_from_wp メソッドは HTTP リクエストが失敗するとき結果が nil になる場合があります。この場合、 Rails.cache.read(cache_key) の結果も nil になり、キャッシュが使われません。その結果、非常に低速な HTTP リクエストの処理を、リトライも含めて 5回行う処理となっていました。

このコードを下記のように修正しました。

return Rails.cache.read(cache_key) if Rails.cache.exist?(cache_key)

exist? を使うことで、2回目以降はキャッシュを使って nil を返すことができるようになり、非常に高速化することができました。

このように、低確率で発生する事象は、通常はなかなか発見することはできませんが、今回、本番環境に Scout APM を導入し、気づくことができました。

おわりに

2週間の検証期間でさまざまな高速化に取り組み、結果として Scout APM を enechange.jp の本番環境に本格導入しました。

さらに、今はキャンペーンで特別に、 Scout APM に関する技術ブログを執筆すると、特別なディスカウントがありました。 お得。

SVGのアニメーションで遊んだ話

こんにちは、SanFrancisco Bay Areaでエンジニア業務をしている大澤です。 普段はRailsを使って電力会社様向けのサービスの開発、運用しています。

今年の夏のある日、FollowしているJoe Rogan *1 のInstagramから、こんな動画が流れてきた。 https://www.instagram.com/p/B0i9QevlN7V/

*1:Joe Roganはアメリカの徹子の部屋っぽい感じで、IT系ではElon Musk、Jack Dorseyが出てきたり、 James Hetfield, Kelly Slaterが出たりと、為になります。

続きを読む

PDFファイルに不適切なメタデータ(「作成者」や「タイトル」など)が存在している場合にCIで検知する方法

こんにちは。ENECHANGE の gamenechange です。

朝起きたら「The Last of Us Part II」の発売が 5月 に延期になったことが発表されており、とても残念です。しばらくは IGA氏 の新作 Bloodstained: Ritual of the Night をプレイしていきたいと思います。

さて、今回はPDFファイルに保存されている「不適切な」メタデータの露出を防ぐために、CI でそのデータの検知をする方法をご紹介します。

続きを読む

絵文字を使用すると GitHub Actions と AWS Elastic Beanstalk に罠が待ち受けている(いた)

こんにちは。ENECHANGEのgamenechangeです。伝説のゲーム moon がついにSwitchで配信開始されましたが、未だにその事実が信じられずにいます*1

さて今回は、絵文字を使用したことにより、GitHub ActionsAWS Elastic Beanstalk(eb) で罠にはまった話をしたいと思います。

*1:気になる方はぜひ「moon 伝説」で検索してみてください

続きを読む

ElasticBeanstalkでのデプロイ高速化!〜assets:precompileをCircleCI上で〜

プラットフォーム事業部の@yuyasatです。

背景

ENECHANGE社では、ElasticBeanstalkのRubyプラットフォームを利用してインフラを構成することが多くあります。ElasticBeanstalkを利用していて困るのがデプロイに時間がかかること。デプロイするRailsアプリケーションやデプロイ時のバッチ数(複数のEC2インスタンスに対し、何回に分けてデプロイを反映するか)にも依存しますが、長い時では20分近くかかってしまうこともあります。

デプロイに時間がかかると速やかに修正を反映できません。不具合時の対応に時間がかかり、デプロイすることへの心理的ハードルも上がってしまいます。デプロイ時間を速くすることは安定的なリリースには欠かせません。

続きを読む

ElasticBeanstalk環境下のALBで301リダイレクトさせる

こんにちは。レイブパーティーで一晩中踊り明かしたい衝動に駆られてミニマル・テクノ界隈を徘徊しているCTO室のigaharaです。 本エントリは下書きにしたまま放置してあったんですが、ElasticBeanstalkとTerraformの記事って、ネットであまり見かけないしバッドノウハウは需要あると思い、掘り起こしてブラッシュアップしました。

続きを読む