開発環境だけPostgreSQL + PHPの処理がめちゃくちゃ遅い理由がxdebugだった話

タイトルでもう内容が完結してしまっているのですが。アプリケーションにPHPを、DBにPostgreSQLを使っているシステムで、開発環境でだけやたら動きが遅い、具体的には5秒以上ページの表示に時間がかかるという現象を感じていました。特定の機能でだけ発生していました。

  • 言語: PHP 7.1.11 (Windows 64bit ThreadSafe版)
  • DB接続: DoctrineDBAL(pdo_pgsql)
  • DB: PostgreSQL 9.6.5

 

PHPやPostgreSQLのチューニング回り確認

PHPのメモリ設定は128MB、OPCacheも有効化済み、メモリ不足が出るような事も無く特に問題無し。PostgreSQLもshared_buffersは比較的大きなサイズが取られています。実行している処理もKabyLake世代のintel Core i7 + RAM16GB + 240GB SSDのマシンが悲鳴を上げるような処理とは思えません。

SQLの調査

特に重いページでPostgreSQLのクエリログ出力を有効化。

logging_collector = on
log_statement = 'all'

確認したクエリをPgAdmin 4からPostgreSQLに投げてみるも、1秒もかからず実行が完了します。となるとDB側は問題なさそうです。

コードの調査

PHPのコードを追いかけてみるも、特にネックになって居そうな処理はなく。

xdebugのプロファイリングが原因だった

そういえばComposerって「xdebugが有効だと遅いよ」というメッセージが出るよね、と思いだし
xdebug.profiler_enable=1 に設定していたのを
xdebug.profiler_enable=0 にしてみたところ、
あっさり解消。今まで5秒以上かかっていた画面が1秒未満で表示されるように。

本当の原因は何なのか

特定の機能だけやたら遅い状態だったので、PostgreSQL周りが常にxdebug要因で遅くなるというよりは、更に条件が有りそうです。同様に妙に(開発環境でだけ)重かった他のシステムではCodeIgniter 3のQueryBuilderとphp_pgsqlを使っており、DoctrineDBALやPDOが遅いという訳でもなさそうです。流石にxdebugのソースコードを読むのは辛いのでここから先は置いておきます。

開発環境のPostgreSQLがなぜだか遅いんだけど! という方はxdebugも確認してみるといいかもしれません。