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

RPSの観点から見るGoとPHPのリクエスト処理の違い

 RPSの観点から見るGoとPHPのリクエスト処理の違い

CA.go#16 LT大会で使用したスライドです。

Avatar for tomori

tomori

July 02, 2025

Other Decks in Programming

Transcript

  1. 検証内容 サーバー構成 【PHP】 • 構成:Nginx + php-fpm • フレームワーク:Laravel 12 【Go】

    • 構成:Go APIサーバー • フレームワーク:chi Container vCPU Memory [GB] Nginx 0.5 0.5 php-fpm 1 2 MySQL 6 4 Container vCPU Memory [GB] Go 1 2 MySQL 6 4
  2. 検証内容 実装エンドポイント 1. CPUバウンドな処理を行うエンドポイント(POST: /api/battle/resolve) • バトル演算を想定したエンドポイント • 内部で重ためな計算処理を実行する • DB通信などのIO処理は含まない

    2. IOバウンドな処理を行うエンドポイント(POST: /api/gacha/draw10) • ガチャを想定したエンドポイント • 複数回のDB通信を中心とした処理を行う • その他の演算処理は最小限に抑えている
  3. 検証結果から見えてくること 1. PHPとGoでRPS性能に10倍以上の差が生じる → ランタイムの差によるもの Go(コンパイル言語) • 事前にマシンコードに変換済み • 複雑なアーキテクチャもコンパイル時に最

    適化され実行時は高速 PHP(インタープリター) • リクエストのたびにスクリプトを 読み込み・解析・実行 • DDD/クリーンアーキテクチャなど複雑 な構造ほど解析コストが増大 リクエスト処理に関するオーバーヘッドが削減されるため 効率よくリクエストを処理できる
  4. 検証結果から見えてくること 2. 処理タイプによってさらに性能差が拡大する → 同時実行モデルの差によるもの Go • 1リクエスト = 1goroutine(軽い)

    • DB待機中は他の処理に CPU を譲る PHP • 1リクエスト = 1プロセス(重い) • DB待機中もプロセスを占有し続ける IOの待機時間でもリソースを効率よく活用できるため より多くのリクエストを同時に処理できる
  5. まとめ • CPUバウンド処理において、GoはPHPの約10倍のRPSを達成 • IOバウンド処理において、GoはPHPの約16倍のRPSを達成 • ランタイムの差や同時実行モデルの違いが掛け合わさり、十数倍の差が発生 • IO処理が多いシステムではよりGoの強みが活きる •

    インフラリソースの観点から、高負荷APIではGoが圧倒的に有利 • 開発速度・人材確保の観点ではPHPも有効な選択肢 • システムの特性と要件に応じた言語選択が重要 (本当はプロファイラとかいれてもう少し詳細まで追いたかったけど力及ばず間に合いませんでした😣)
  6. 補足 反応をみての補足です • 検証結果のグラフが線形ではなく段差のある形状になっているのはなぜか ➔ RPSを手動で段階的に上げたため、このような段差のある形になりました ➔ 10→11→12 ではなく、10→20→30 のように変更して確認

    • PHPのチューニング次第ではここまでの差は生じないのではないか ➔ 今回は簡易的な設定のみで検証したためその可能性は大いにあると思っています ➔ GitHubにソースを上げているので興味のある方は覗いてみてください 建設的なフィードバック・議論は大歓迎です https://github.com/tksx1227/php-golang-rps/tree/2025-07-01