Vagrantローカル開発環境の激重問題分析

PHP Java MySQL Apache CentOS Linux Windows10 Vagrant VirtualBox 記事 問題

【問題】
Laravelでの動的画面の表示に早くて3秒、平均的に5~8秒、遅いと10~20秒にも達する。(dev環境では0.3秒-0.5秒で描画完了する)

【改善理由】
短期的にも開発においてタイムロスが半端じゃないうえにストレスが非常に高い
長期的に見るとちりつもでとても大きな時間的損失が発生する。ちりってレベルじゃない。(0.3秒で出るものが9秒かかるとか)30倍遅いので。
Laravelでの高速開発。とくにビルドが必要ないPHPでの開発をする上でメリットを打ち消している。

しかし原因がわからない。

【条件】
ローカルに設置してるvagrant上でのLaravel5.5開発環境で発生する。

【分析】
同じvagrantで同じDBを使ってる別のフレームワークもあるが、重くなってるのはLaravelのプロジェクトだけ。
外部ネットワークのDBに接続している。

クエリが重いところは特に遅くなる。10秒程度。
静的画面は0.3秒程度

ということは
アパッチー>Laravelまでの間で遅いわけではない?

Vagrantfile
ファイルシンクをnfsに変更したが変化なしなのでVaglantfileの設定が問題ではなさそう。

Laravelに到達してから出てくるまでが遅いと考えるのが妥当か??

debug barを解除すると、微妙に2-3秒早くなる。(6秒かかっていたものが)
そもそもが遅すぎるので100倍速くならないと意味ない。

思い返すと、最初はこんな遅くなかった。
Laravelにキャッシュでもたまってるのか?ゴミでもたまってる?
過去にこういう経験はない。

別フレームワークは早く動いている以上、Vagrantが原因とするのはおそらく違う。

アクセスした時CPU使用率がhttpdが20%いってる

Timerという名前でLaravelのミドルウェアに時間の測定かませてみた。

ある画面を表示する場合
[2018-04-05 13:40:04] local.DEBUG: 3.0976619720459
[2018-04-05 13:40:07] local.DEBUG: 1.0818920135498
[2018-04-05 13:40:08] local.DEBUG: 1.5860500335693
[2018-04-05 13:40:09] local.DEBUG: 1.5114629268646
[2018-04-05 13:40:09] local.DEBUG: 1.660010099411
[2018-04-05 13:40:09] local.DEBUG: 1.8062179088593
[2018-04-05 13:40:09] local.DEBUG: 1.729807138443
[2018-04-05 13:40:10] local.DEBUG: 0.54395914077759
合計13秒。

ブラウザ側では描画に9.61と出ている。
デバッグバーのタイムラインにはboot793ms app2.95secと出ている。クエリが576ms。
クエリは10msぐらいで全部終わる量だし、アプリケーションのほうも遅すぎる。
要するにLaravelに到達してからは遅いという状態。

vagrantが全く悪くないかというとそうとも言えない
なぜならクエリを発行してアクセスするのは外部のDBだから。
かといって内部のDBだから早いということはない。

重要参考サイト(英語)
https://stackoverflow.com/questions/23283574/is-laravel-really-this-slow

【解決】
vagrantのファイル共有の方法をrsyncに変更で改善した。
vagrantのバージョンは2.0.3
vagrantfileでtype: "rsync"を追加する

// Vagrantfile
config.vm.synced_folder "../git/vagrant/dev", "/var/www/html", type: "rsync"
// Laravelでstorage権限のエラー出たら実行する。rsyncだと権限変更できるぽい
chmod 777 -R storage/

【結果】
同じ画面でテストしたところ
boot128ms
application906ms
query651ms
描画1.68sec

描画速度は以前と比較して5.7倍
体感的にも相当マシにはなった。

【結論】
結論としてはLaravelが遅いのではなくて、Vagrantの共有フォルダの同期(読み込みかな?)に時間がかかっていた。と考えていいと思う。

難しい問題だったので途中で思考プロセスをメモを取りながら解決してきたこの問題だが、振り返ってみると結構解決までのプロセスで間違ってるとこが多い。
論理的思考もっとがんばろう。

ちなみにDebugbarが重いとか、vagrant壊したとかLaravelが遅いとか、ローカル開発だから遅いとか外部DBだから遅いという意見があった。
あとはoptimizeとかcache clearとか。

最適化手法でいえば全部あってるけど、例えば10秒とかっていうのはありえない。もっと大きな問題が存在していたわけですね。
それがVagrantのファイル共有の問題ということで。

Laravelが遅いとか疑われるのは本意ではない。

ちなみにこっちでVagrant壊して直すまで書きました。
http://error-search.com/error-post/detail/169/Vagrant%E3%81%A7vagrant%2Bup%E3%81%A7%E3%81%8D%E3%81%AA%E3%81%84%E3%80%82default%3A%2BSSH%2Bauth%2Bmethod%3A%2Bprivate%2Bkey%E3%81%8B%E3%82%89%E9%80%B2%E3%81%BE%E3%81%AA%E3%81%84%E7%8F%BE%E8%B1%A1%E3%80%82


記事の評価お願いします

Good! 0 ? 0 Bad 0
anonymous / 2018-04-06 / 2714 / 5
このエントリーをはてなブックマークに追加
スポンサー
スポンサー
関連記事

コメント

参考サイト
http://www.1x1.jp/blog/2014/03/vagrant-rsync-synced-folder.html

rsyncを書いているだけだと起動時にしか同期されないっぽい

vagrant up

//こいつも実行する
vagrant rsync-auto

これで自動的にリアルタイム(ほぼ)反映されるぽいです。

パーミッションエラー出たら下記実行

sudo chmod 777 -R storage/
anonymous / 2018-04-06

自動同期した時にパーミッションが変化してパーミッションエラーが出るので設定を変更。

所有者をアパッチに変更で解決した
owner: 'apache'

config.vm.synced_folder "../git/vagrant/laravel_pj", "/var/www/html", type: "rsync", owner: 'apache', mount_options: ['dmode=777','fmode=755']

anonymous / 2018-04-06

パーミッションエラーを起こす件についての参考サイト
http://kazuhei.hatenablog.com/entry/2014/07/27/110014

anonymous / 2018-04-06

追記
@No.1のパーミッション変更はLaravelにおいての場合です。

anonymous / 2018-04-11
スポンサー
スポンサー