Laravel を意図的に低速化していくことで、どのようなコードがどれくらいの影響を速度面で与えるかを勉強します。
俺の Laravelがこんなに速いわけない!2022-06-22Laravel.shibuyaRyo Tomidokoro / @hanhan1978
View Slide
はじめにLaravelは遅くて有名?Laravel.shibuyaRyo Tomidokoro / @hanhan1978
Laravel.shibuyaRyo Tomidokoro / @hanhan1978
しかし、実際に簡易ブログを作ってみると...※ 10000レコードの中規模想定Laravel.shibuyaRyo Tomidokoro / @hanhan1978
充分速い!これじゃ、評判と違うLaravel.shibuyaRyo Tomidokoro / @hanhan1978
低速化Laravelの実装や実行環境を工夫して、 評判通りに遅くしよう!※なるべく気づかれないように遅くする技術Laravel.shibuyaRyo Tomidokoro / @hanhan1978
アプリの仕様シンプルなブログアプリLaravel.shibuyaRyo Tomidokoro / @hanhan1978
データ量posts 10000users 1000post_posts 33864Laravel.shibuyaRyo Tomidokoro / @hanhan1978
以後の高速化の指標siege -t 10s -c 50 -b localhostTransaction Rate (Req/Sec)の3回平均初期状態は 195.84Laravel.shibuyaRyo Tomidokoro / @hanhan1978
1. preload無効化zend_extension=opcache.so;opcache.preload=/var/www/src/preload.php;opcache.preload_user=www-data効果なし (CPUバウンドじゃない)195.39 (Req/Sec)Laravel.shibuyaRyo Tomidokoro / @hanhan1978
2. opcache.jit無効化zend_extension=opcache.so;opcache.jit=disable効果なし (CPUバウンドじゃない)199.29 (Req/Sec)Laravel.shibuyaRyo Tomidokoro / @hanhan1978
3. opcache無効化;zend_extension=opcache.so抜群の効果125.00 (Req/Sec)Laravel.shibuyaRyo Tomidokoro / @hanhan1978
4. xdebug有効化zend_extension=xdebug地味な一撃101.90 (Req/Sec)Laravel.shibuyaRyo Tomidokoro / @hanhan1978
ここまでの総評気づかれずにミドルで与える打撃はこのくらい。もっと過激な手段としてはpreforkの startServer 1PHPのバージョンダウンLaravel.shibuyaRyo Tomidokoro / @hanhan1978
5. eager loading廃止$posts = \App\Models\Post::take(20);//->with('user')//->with('linkPosts')//->with('linkedPosts')->get();効果は抜群だ!22.76 (Req/Sec)Laravel.shibuyaRyo Tomidokoro / @hanhan1978
6. limit句 廃止$posts = \App\Models\Post::get();return view(...)->with('posts', $posts->take(20));mysqlndの優秀さがわかる12.83 (Req/Sec)Laravel.shibuyaRyo Tomidokoro / @hanhan1978
7. Attribute Casting乱用foreach($posts as $post){$post->created_at;$post->updated_at;$post->created_at;$post->updated_at;}Carbonの生成コストを侮るなかれ6.5 (Req/Sec)Laravel.shibuyaRyo Tomidokoro / @hanhan1978
総評現場でありえそうなコードでも、50msec -> 1.5 sec程度に低速化単体アクセスも遅いが、特に並列化性能は 30倍程度劣化※複雑化したコードベースでは注意しないとすぐ劣化Laravel.shibuyaRyo Tomidokoro / @hanhan1978
おまけカリカリチューニング編Laravel.shibuyaRyo Tomidokoro / @hanhan1978
1. apcuキャッシュapcu_store('key', $posts);メモリキャッシュ最高865.7 (Req/Sec)Laravel.shibuyaRyo Tomidokoro / @hanhan1978
2. var_exportして include$postsは stdclassで中身を置き換えた上でfile_put_contents('/tmp/posts.php', 'include('/tmp/posts.php');OPCacheに乗る1098 (Req/Sec)Laravel.shibuyaRyo Tomidokoro / @hanhan1978
3. var_exportして preload上の /tmp/posts.phpを preloadしてしまう1300 (Req/Sec)Laravelで 5msecの世界Laravel.shibuyaRyo Tomidokoro / @hanhan1978
これなら Isucon勝てる?単純比較は出来ないが、多分無理。静的 HTMLすると 8000 (Req/Sec)Nginxでやってみると 12000 (Req/Sec)Goは、この1.5倍くらいなので、18000と仮定すると、あと13倍速くすればワンチャンある。Laravel.shibuyaRyo Tomidokoro / @hanhan1978
Octaneは?ソース見てないので実測だけだが、単純な高速化において swooleベースで 、今回の 6割くらいの性能に収まった。レースコンディションで問題を起こさないようにするために、どこかで同期処理が入っているのだと思う。Laravel.shibuyaRyo Tomidokoro / @hanhan1978
じゃあどうしたら?Goを書けOpen Swooleと 軽量フレームワークを組み合わせて同期処理を廃すれば、チャンスはある。Laravel.shibuyaRyo Tomidokoro / @hanhan1978