タイトルでもう内容が完結してしまっているのですが。アプリケーションに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も確認してみるといいかもしれません。