Laravelを使い始めたばかりです。まだコードをほとんど書いていませんが、ページの読み込みに1秒近くかかります。
フレームワークのないアプリとNodeJSアプリに約2ミリ秒かかると、これは少し衝撃的です。Laravelは何をしているのですか?これは正常な動作ではありませんか?微調整が必要ですか?
Laravelを使い始めたばかりです。まだコードをほとんど書いていませんが、ページの読み込みに1秒近くかかります。
フレームワークのないアプリとNodeJSアプリに約2ミリ秒かかると、これは少し衝撃的です。Laravelは何をしているのですか?これは正常な動作ではありませんか?微調整が必要ですか?
回答:
Laravelはありません、実際にそれが遅いです。500-1000msはばかげています。デバッグモードで20msまで下げました。
問題はVagrant / VirtualBox +共有フォルダーでした。彼らがそのようなパフォーマンスの打撃を受けたことに気づかなかった。Laravelには非常に多くの依存関係があり(最大280ファイルをロード)、それらのファイルの読み取りはそれぞれ遅いため、合計が非常に速くなると思います。
kreevesは私を正しい方向に向けました。このブログ投稿では、共有フォルダーを使用する代わりにファイルをVMにrsyncできるVagrant1.5の新機能について説明しています。
Windowsにはネイティブのrsyncクライアントがないため、cygwinを使用する必要があります。それをインストールし、Net / rsyncを必ずチェックしてください。C:\cygwin64\bin
パスに追加します。[または、Win10 / Bashにインストールできます]
Vagrantは新機能を導入します。私はPuphetを使用しているので、Vagrantfileは少しおかしいように見えます。私はそれをこのように見えるように微調整しなければなりませんでした:
data['vm']['synced_folder'].each do |i, folder|
if folder['source'] != '' && folder['target'] != '' && folder['id'] != ''
config.vm.synced_folder "#{folder['source']}", "#{folder['target']}",
id: "#{folder['id']}",
type: "rsync",
rsync__auto: "true",
rsync__exclude: ".hg/"
end
end
すべての設定が完了したら、を試してくださいvagrant up
。すべてがスムーズに進むと、マシンが起動し、すべてのファイルがコピーされます。vagrant rsync-auto
ファイルを最新の状態に保つには、ターミナルで実行する必要があります。レイテンシーは少しかかりますが、ページの読み込みが30倍速くなるので、それだけの価値があります。
PhpStormを使用している場合、自動アップロード機能はrsyncよりも優れています。PhpStormは、ファイルウォッチャーをつまずかせる可能性のある多くの一時ファイルを作成しますが、アップロード自体を処理させると、うまく機能します。
もう1つのオプションは、lsyncdを使用することです。私はこれをUbuntuホスト-> FreeBSDゲストで使用して大成功を収めました。私はまだWindowsホストでそれを試していません。
artisan optimize
し、デバッグをオフにして、わずかにブーストするために実行できます。残りは主にあなたがあなたのアプリをデザインする方法だと思います。インストールbarryvdh/laravel-debugbar
して、速度が遅いかどうかを確認します。
あなたの問題を解決するために、Laravelの生産を最適化することについて話しているこのブログを見つけました。アプリを高速化するために必要なことのほとんどは、コードの効率、ネットワーク容量、CDN、キャッシュ、データベースの管理下にあります。
今、私は問題について話します:
Laravelは箱から出してすぐに遅いです。それを最適化する方法があります。コードでキャッシュを使用して、サーバーマシンを改善するオプションもあります。yaddayaddayadda。しかし、結局、Laravelはまだ遅いです。
Laravelは多くのsymfonyライブラリを使用しており、techempowerのベンチマークでわかるように、symfonyのランクは非常に低くなっています(控えめに言っても)。Laravelベンチマークがほぼ最下部にあることさえわかります。
多くの自動読み込みがバックグラウンドで行われているため、不要なものも読み込まれます。技術的には、laravelは使いやすいため、アプリをすばやく構築するのに役立ち、速度も遅くなります。
しかし、私はLaravelが悪いと言っているのではありません、それは素晴らしいです、多くのことで素晴らしいです。ただし、トラフィックの急増が予想される場合は、要求を処理するためだけに、さらに多くのハードウェアが必要になります。それはあなたにもっと多くの費用がかかるでしょう。しかし、あなたが不潔な金持ちなら、Laravelで何でも達成できます。:D
通常のトレードオフ:
Easy = Slow, Hard = Fast
CまたはJavaは、学習曲線と保守性が難しいと思いますが、Webフレームワークでは非常に上位にランクされています。
あまり関係はありませんが。私はただのポイントを証明しようとしていますeasy = slow
:
Rubyは、保守性と習得のしやすさで非常に高い評価を得ていますが、ここに示すように、PythonとPHPの中で最も遅いと考えられています。
はい-Laravelは本当に遅いです。このためにPOCアプリを作成しました。ログインフォーム付きのシンプルなルーター。20ドルのデジタルオーシャンサーバー(数GBのRAM)で10の同時接続で60RPSしか取得できませんでした。
セットアップ:
2gb RAM
Php7.0
apache2.4
mysql 5.7
memcached server (for laravel session)
最適化、コンポーザーダンプの自動ロードなどを実行しましたが、実際にはRPSが43程度に低下しました。
問題は、アプリが200〜400ミリ秒で応答することです。LaravelがオンになっているローカルマシンからABテストを実行しました(つまり、Webトラフィック経由ではありません)。そして私は112RPSしか得られませんでした。平均300msで200ms速い応答時間で。
比較すると、AWS t2.medium(x3、負荷分散)で1日に数百万のリクエストを実行する本番PHPネイティブアプリをテストしました。ELBを介してローカルマシンからWeb経由で25の同時接続をABしたとき、約1200RPSが得られました。負荷のあるマシンとlaravelの「ログイン」ページの大きな違い。
これらは、セッション(elasticache / memcached)、ライブDBルックアップ(memcachedを介したキャッシュクエリ)、CDNを介してプルされたアセットなどを含むページです。
私が言えることは、laravelは物事に約200-300msの負荷をかけます。結局のところ、PHPで生成されたビューには問題ありませんが、このタイプの遅延はロード時に許容できます。ただし、Ajax / JSを使用して小さな更新を処理するPHPビューの場合、動作が遅くなり始めます。
200個のボットがそれぞれ100ページを同時にクロールしているときに、このシステムがマルチテナントアプリでどのように見えるかは想像できません。
Laravelはシンプルなアプリに最適です。ミドルウェアのナンセンスを必要とするような凝ったことをする必要がない場合(つまり、マルチテナントアプリやカスタムドメインがないなど)、Lumenは許容範囲内です。
ただし、「Hello World」の投稿に対して、バインドして300ミリ秒の負荷が発生する可能性のあるものから始めるのは好きではありません。
あなたが「誰が気にするの?」と思ったら
..数十万件の結果にわたるオートコンプリートの提案に応答するために、クイッククエリに依存する予測検索を記述します。その200〜300ミリ秒の遅れは、ユーザーを完全に狂気に駆り立てます。
Laravel 4を使用すると、適切なセッションドライバーを選択することで最大の速度向上が達成できることがわかりました。
Sessions "driver" file;
Requests per second: 188.07 [#/sec] (mean)
Time per request: 26.586 [ms] (mean)
Time per request: 5.317 [ms] (mean, across all concurrent requests)
Session "driver" database;
Requests per second: 41.12 [#/sec] (mean)
Time per request: 121.604 [ms] (mean)
Time per request: 24.321 [ms] (mean, across all concurrent requests)
それが役立つことを願っています
私のHelloWorldコンテストから、Laravelはどれですか?推測できると思います。テストにはDockerコンテナーを使用しましたが、結果は次のとおりです。
http-response "Hello World"を作成するには:
私はLaravelをかなり使用していますが、ブラウザーで測定されたエンドツーエンドのレンダリングでは、リクエストから準備ができるまでの合計時間が短いため、Laravelが示す数値を信じていません。
さらに、職場のマシンではわずかに高い数値が得られます。これは、自宅のマシンよりも著しく高速にページを実行します。
これらの数値がどのように計算されているかはわかりませんが、観察やFirebugなどのブラウザツールによって裏付けられていません...
Laravelは、特に最適化されている場合、実際にはそれほど遅くはありません。ただし、メモリが不足しています。Drupalのような非常に遅い重いCMSでさえ、Laravelリクエストの約1/3のメモリフットプリントを持っているように見えます。
したがって、Laravelを本番環境で実行するには、CPU最適化サーバーの前にメモリ最適化サーバーにデプロイします。
php artisan optimize
ですか、それとももっとできることはありますか?
これは少し古い質問ですが、状況は変わりました。Laravelはそれほど遅くはありません。前述のように、同期されたフォルダは遅いです。しかし、Windows10では使用できませんでしたrsync
。私は両方を試してみましたcygwin
とminGW
。のバージョンrsync
と互換性がないようです。git for windows
ssh
これが私のために働いたものです:NFS。
Vagrantのドキュメントによると:
NFSフォルダーはWindowsホストでは機能しません。Vagrantは、Windows上のNFS同期フォルダーに対する要求を無視します。
これはもう真実ではありません。最近はvagrant-winnfsd
プラグインが使えます。インストールは本当に簡単です:
vagrant plugin install vagrant-winnfsd
Vagrantfile
:config.vm.synced_folder ".", "/vagrant", type: "nfs"
Vagrantfile
:config.vm.network "private_network", type: "dhcp"
NFS
仕事をするのに必要なのはそれだけです。Laravelの応答時間は500msから100msに短縮されました。
他の誰もそれについて言及していないので、xdebugデバッガーが劇的に時間を増加させたことがわかりました。基本的な「HelloWorld、時間は2020-01-01T01:01:01.010101」動的ページを提供し、これをhttpd.confで使用してリクエストの時間を計りました。
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" **%T/%D**" combined
%Tは秒単位のサーブ時間、%Dはマイクロ秒単位の時間です。私のphp.iniでこれを使って:
[XDebug]
xdebug.remote_autostart = 1
xdebug.remote_enable = 1
応答時間は約770ミリ秒でしたが、両方を0に設定して無効にすると、すぐに160ミリ秒に跳ね上がりました。これらの両方を実行すると、120ミリ秒に短縮されました。
php artisan route:cache
php artisan config:cache
欠点は、構成やルートを変更した場合、それらを再キャッシュする必要があることです。これは煩わしいことです。
ちなみに、奇妙なことに、サイトをSSDから回転するHDDに移動しても、パフォーマンス上の利点はありませんでした。これは私には非常に奇妙なことですが、キャッシュされている可能性があります。私はXAMPPを搭載したWindows10を使用しています。
ほとんどの場合、WebページにPHPを使用すると時間がかかるため、Laravelは低速です。
Laravelを使用すると、フレームワーク全体が呼び出しごとに再構築されます。これが、すべてのページがindex.phpを指す理由です。フレームワーク全体がPHPスクリプトであるため、それらはすべてPHPインタープリターを通過する必要があります-毎回。フレームワークが大きいほど、これには時間がかかります。
これを、サーバーが初期化コードを1回実行し、最終的にすべてのページがネイティブコード(JIT後)になる「サーバー環境」(Tomcatなど)と比較してください。
参考例として、同じハードウェア、OSなどを使用すると、このハードウェアでJSPを使用する単純な「helloworld」は3000 rps、laravelでの同じhelloworldは51rpsです。
フレームワークのオーバーヘッドと、結果として生じるコアあたりの最大RPSをテストする最も簡単な方法は、Apache ABと同時実行値1を使用し、動的な単純な「helloworld」を使用することです(静的ページキャッシュを回避するため)。
php artisan optimize --force