Akatsukiのインターンシップに参加してきました

9月9日から9月30日までAkatsukiのサマーインターンシップに参加してきました。

取り組んだこと

取り組んだことは以下の2つになります.

N+1問題の解消

開発されているアプリケーションで、N+1が発生していました。インターンの課題として、N+1問題の解消をまず最初に取り組みました。 N+1問題に関しては、他のブログでわかりやすく解説されています。

pikawaka.com

N+1問題が実際にどこで起きているかを、ログから探しました。 以下のようなログを発見して、実際にN+1が起きている箇所を特定しました。

SELECT * FROM deck WHERE user.num = 0
SELECT * FROM deck WHERE user.num = 1
SELECT * FROM deck WHERE user.num = 2
.....

次に、ログに記録されていたSQLを実行している関数を特定して、その部分の修正を行いました。
N+1問題の対処として、includeを使うことにより対処されている記事が多いですが、今回はActiverecord-Importを利用しました。

github.com

また、キャッシュをうまく使うことにより、データフローをよくしました。 実際にN+1問題を解消することにより、以下の表に示すようにSQLの平均呼び出し回数を削減することができました。

N+1解消前 N+1解消後
Segment % Time Avg Calls(per txn) Avg Time(ms) % Time Avg Calls(per txn) Avg Time(ms)
find 4.9 18.6 24.3 2.5 4.53 12.5
select 4.4 12.0 21.8 0.1 0.258 0.447

アプリケーションの平均実行時間もN+1問題を解消することにより、520msから465msに短縮することができました。

f:id:yotiyotiaruku:20200930152349p:plain
アプリの平均実行時間 N+1解消前
f:id:yotiyotiaruku:20200930152352p:plain
アプリの平均実行時間 N+1解消後

AWSの新しいインスタンスタイプの検証

N+1問題の解消に取り組み時間が余っていたので,AWSの新しいインスタンスタイプの検証もさせて頂きました. インターンシップで参加させていただいた部署では,EC2のc5インスタンスを使っています. 現在は,c5インスタンスより新しい世代としてc5aインスタンスが登場しています.

aws.amazon.com

新しいインスタンスであるc5aはc5に比べて10%ほど値段が安くなっています. 新しいインスタンスに移行することができれば,EC2のコストも削減することができます. 実際に移行できるかを確かめるために,c5インスタンスとc5aインスタンスの比較を行いました.

インスタンスの比較としては,インスタンスにデプロイしたWebアプリケーションに対して負荷試験を行いました. 負荷試験を行った際に,CPU,メモリ使用率に変化があるかや平均レスポンスに差があるかを測定しました. 負荷試験の結果を以下の表に示します. f:id:yotiyotiaruku:20200930182310p:plain

負荷試験の結果が示す通り,CPU使用率がc5インスタンスに比べて高くなっています. リクエストもc5インスタンスに比べて捌けていません. 比較結果からc5インスタンスからc5aインスタンスにそのままインスタンスの変更はできませんが,構成を変更することにより対処できるのではないかということが分かりました.

インターンシップに参加して

サーバサイドの本格的な実装を行ったことはなかったのですが,メンターや社員の方にサポートをしていただいて楽しく業務に取り組むことができました. コロナの関係で物理的な出社は一回もせずにインターンシップが終わってしまいましたが,Zoomなどでコミュニケーションを取ることで円滑にインターンシップに参加できたかなと思います.

また,自分の課題に関してもたくさん見つけることができたので,その部分を解消していきたいと思います.