Upgrade to Pro — share decks privately, control downloads, hide ads and more …

インフラとバックエンドとフロントエンドをくまなく調べて遅いアプリを早くした件

 インフラとバックエンドとフロントエンドをくまなく調べて遅いアプリを早くした件

NW-JAWS #13 ~re:Inventに行く前に振り返り~ で話したLTです。
https://jawsug-nw.connpass.com/event/333031/

tubone(Yu Otsubo)

November 14, 2024
Tweet

More Decks by tubone(Yu Otsubo)

Other Decks in Technology

Transcript

  1.  名 前 Yu Otsubo  所 属 KDDIアジャイル開発センター(KAG)  職種 ゆるふわエンジニア  SNS

    @meitante1conan  その他 妻と二人暮らしでしたが 最近犬をお迎えしました! なので最近はエンジニアリングのつぶやき少なめ 自 己 紹 介 00 00
  2. ど ん な 問 題 が 発 生 し た

    の ? 1 . C l o u d F r o n t が 返 す 謎 の エ ラ ー 2 . C l o u d W a t c h A p p l i c a t i o n S i g n a l s で ボ ト ル ネ ッ ク を 調 べ る 3 . ご ん . . . お ま え だ っ た の か 🦊 4 . 最 後 に 5 . 本 日 の ア ジ ェ ン ダ
  3. ど ん な 問 題 が 発 生 ど ん

    な 問 題 が 発 生 し た の ? し た の ? ファイルのアップロードに失敗するよ. . . . ? 01 01
  4. ど ん な ア プ リ を 開 発 し

    て い る の ? PDFとかパワポのファイルをアップロードして 、 非常に重たい処理並列で実行、結果を画面に表示させる 業務アプリケーションです。 ど ん な 問 題 が 発 生 し た の ? 01 01 この場で詳細話せないのが悔しい. . . 。
  5. フ ァ イ ル ア ッ プ ロ ー ド

    が 待 っ て も 完 了 し な い よ ! 開発チームで確認したところ確かにAWS環境で再現。 ただし、ローカルでは発生しない 。 「ペロッこれはインフラ起因!」 ど ん な 問 題 が 発 生 し た の ? 01 01
  6. 01 01 簡 単 な 構 成 を お さ

    ら い し ま し ょ う ど ん な 問 題 が 発 生 し た の ? ちょっと複雑な構成ですが、追って行きましょう! みなさんもどこが原因か想像しながらお聞きください!
  7. 01 01 ど ん な 問 題 が 発 生

    し た の ? CloudFront Cl oudFrontでフロントエンドアプリケーションを配信 ビヘイビアでバックエンドAPI にルーティングしている
  8. 01 01 ど ん な 問 題 が 発 生

    し た の ? フロントはReact フロントエンドはReactで作成。 SPAで動きます。
  9. 01 01 ど ん な 問 題 が 発 生

    し た の ? S3でホスティング Cl oudFront + S3のよくある構成
  10. 01 01 ど ん な 問 題 が 発 生

    し た の ? ALB FastAPI へのアクセスのフロント面です。 カスタムヘッダー+ マネージドプレフィックスリストでセキュアに
  11. 01 01 ど ん な 問 題 が 発 生

    し た の ? バックエンドは FastAPI FastAPI はルーティングを主に実施。 Uvi corn のお陰で軽量爆速! 重たい処理は後段のWorkerが実施します。
  12. 01 01 ど ん な 問 題 が 発 生

    し た の ? ECS Fargate 特に取り立てて話すことなし
  13. 01 01 ど ん な 問 題 が 発 生

    し た の ? RedisでWorkerへ Job登録 Cel eryのBroker/Resul t Backendとして利用しています。 Resul t Backendを兼ねることができるので地味に便利。
  14. 01 01 ど ん な 問 題 が 発 生

    し た の ? CeleryでWorker構築 重たい処理はこちらで Cel eryのコーディング体験半端なくいいですよ!!! 普通のPython書いたら即Worker化できます。おすすめ。 一つあたりのWorker処理はとても小さいのでThread Pool を Gevent で設定
  15. フ ァ イ ル が 重 た い か ら

    . . . ? コ ン テ ナ が 小 さ い か ら . . . ? Devtool sでAPI のレスポンスを見てみよう. . . 「ん!?」 C l o u d F r o n t が 返 す 謎 の エ ラ ー 02 02
  16. 02 02 C l o u d F r o

    n t が 返 す 謎 の エ ラ ー CloudFront Cl o u d F r o n t にはバックエンドの タイムアウトがある。 最大60秒 これですね. . . . 。
  17. Cl oudFr ont が返す 謎のエラー ALBの設定を見直してみる 02 02 ALB 一方、AL

    Bにもタイムアウトはあるが、 最大4 0 0 0 秒 に伸ばしても変わらず。 AL Bのヘルスチェックも問題ない. . .
  18. 何かがとても遅くて 何かがとても遅くて C l o u d F r o

    n t で 6 0 秒 タ イ ム ア ウ ト C l o u d F r o n t で 6 0 秒 タ イ ム ア ウ ト ボトルネック調査!! ボトルネック調査!! Cl oudFr ont が返す 謎のエラー 02 02 私はストレートネック 私はストレートネック
  19. Cl oudWat c h Appl i c at i on

    Si gnal s でボトルネックを調べる 03 03 アプリケーション全体のトレース するときに便利 OpenTel emetry(OTEL) を活用してAWSのアプリケーションモニタリングを自動化する 新しいサービス Pythonは自動計装に対応!
  20. ア ッ プ ロ ー ド だ け が タ

    イ ム ア ウ ト す る と 思 っ た ら 全 A P I が 遅 い . . . ! ! ! C l o u d W a t c h A p p l i c a t i o n S i g n a l s で ボ ト ル ネ ッ ク を 調 べ る 03 03 単純なstatusしか返さない heal thcheckのAPI ですら数秒 かかっている。 明らかに遅い。
  21. 逆 に r e d i s / w o

    r k e r の ス ピ ー ド は 早 い 。 ということは被疑箇所はFastAPI だ! こうして調査の旅はアプリケーション内部へ進んだ. . . C l o u d W a t c h A p p l i c a t i o n S i g n a l s で ボ ト ル ネ ッ ク を 調 べ る 03 03
  22. G e v e n t と は な に

    か ? Geventは、Pythonで非同期プログラミングを実現するためのネットワークライブラリで、 Greenl etという軽量な協調的マルチスレッド(コルーチン)を使用します。 ごん. . . おまえだったのか 🦊 04 04 I /O待ちの多い処理では効率的に処理をこなせます。(CPU負荷の低いやつ) GeventはCel eryのスレッドプールで選択可能です。 ジーイベント
  23. G e v e n t と は な に

    か ? geventは、Pythonで非同期プログラミングを実現するためのネットワークライブラリで、 greenl etという軽量な協調的マルチスレッド(コルーチン)を使用します。 ごん. . . おまえだったのか 🦊 04 04 要は小さい処理なら Celery Workerを高密度にできますよ というもの
  24. G e v e n t と は な に

    か ? geventは、Pythonで非同期プログラミングを実現するためのネットワークライブラリで、 greenl etという軽量な協調的マルチスレッド(コルーチン)を使用します。 ごん. . . おまえだったのか 🦊 04 04 要は小さい処理なら Celery Workerを高密度にできますよ というもの コスト削減のため コスト削減のため 導入してました 導入してました
  25. ご ん . . . お ま え だ っ

    た の か 🦊 04 04 Cel ery Workerの高密度化のために導入したGevent
  26. ご ん . . . お ま え だ っ

    た の か 🦊 04 04 Cel ery Workerの高密度化のために導入したGevent FastAPI のコンテナにもpi pでGeventインストール
  27. ご ん . . . お ま え だ っ

    た の か 🦊 04 04 Cel ery Workerの高密度化のために導入したGevent FastAPI のコンテナにもpi pでGeventインストール Geventのmonkey. patch_al l がライブラリ起因で適用 非同期・Threadi ngの標準ライブラリがgreenl et処理に置き換え
  28. ご ん . . . お ま え だ っ

    た の か 🦊 04 04 Cel ery Workerの高密度化のために導入したGevent FastAPI のコンテナにもpi pでGeventインストール Geventのmonkey. patch_al l がライブラリ起因で適用 非同期・Threadi ngの標準ライブラリがgreenl et処理に置き換え Uvi cornと競合!! イベントループに変な形で割り込み! 💦 🧨
  29. ご ん . . . お ま え だ っ

    た の か 🦊 04 04 Cel ery Workerの高密度化のために導入したGevent FastAPI のコンテナにもpi pでGeventインストール Geventのmonkey. patch_al l がライブラリ起因で適用 非同期・Threadi ngの標準ライブラリがgreenl et処理に置き換え Uvi cornと競合!! イベントループに変な形で割り込み! Issueも上がっていました。
  30. ご ん . . . お ま え だ っ

    た の か 🦊 04 04 Cel ery Workerの高密度化のために導入したGevent FastAPI のコンテナにもGeventのpi pでインストール Geventのmonkey. patch_al l がライブラリ起因で適用 非同期・Threadi ngの標準ライブラリがgreenl et処理に置き換え Uvi cornと競合!! イベントループに変な形で割り込み!
  31. 解 決 方 法 Dockerfil eを2つに分けて それぞれ geventあり geventなし で作成した。

    たったこれだけ. ..。 ごん...おまえだったのか 🦊 04 04 ※細かい話ですが、MacだとGreenl etの動きがまたちょっと動きが違うようで、ローカルだと再現しなかったようです。
  32. 原 因 わ か ら ず 夢 で デ バ

    ッ グ 夜遅くまで調査して、 それでもわからなくて、 悔しくて、 寝ながらデバッグして、 朝起きてperpl exityに聞いて 解決。 ごん...おまえだったのか 🦊 04 04 喜びすぎて変なタイポしてますね。 喜びすぎて変なタイポしてますね。
  33. T H A N K Y O U T H

    A N K Y O U ご清聴ありがとうございました。 ご清聴ありがとうございました。