Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Speaker Deck
PRO
Sign in
Sign up for free
俺の Laravel がこんなに速いわけがない! / My Laravel Too Fast
Ryo Tomidokoro
June 29, 2022
Technology
0
580
俺の Laravel がこんなに速いわけがない! / My Laravel Too Fast
Laravel を意図的に低速化していくことで、どのようなコードがどれくらいの影響を速度面で与えるかを勉強します。
Ryo Tomidokoro
June 29, 2022
Tweet
Share
More Decks by Ryo Tomidokoro
See All by Ryo Tomidokoro
Laravel を低速化する技術 / how to slow laravel
hanhan1978
0
1.7k
カンファレンスで登壇するとどうなるのか? / PHPTechCafe PHPerKaigi 2022
hanhan1978
3
240
PHPでWebサーバーを作って高速化に挑戦する!/php-web-server
hanhan1978
0
220
同期的なプログラミング言語の視点から非同期処理を理解する/understand async from sync
hanhan1978
2
680
カオナビにおける マイクロサービスの取組と今後の展開 / kaonavi rearchitecturing
hanhan1978
1
1.5k
EventLoopの実装から考えるFiberの位置付けについて/Fiber and Async Request
hanhan1978
4
610
PHPで書いて覚える非同期処理 / php-async-programming
hanhan1978
5
4.1k
PHPで学ぶ Session の基本と応用 / web-app-session-101
hanhan1978
15
5.2k
ソースコードから理解するPreloadとJITの話/preload_and_jit
hanhan1978
1
1.5k
Other Decks in Technology
See All in Technology
FlexScan HD2452Wの 後継を探して
tring
0
180
ERC3525 Semi-Fungible token
sbtechnight
0
330
UIFlowの2.0がやってきた! / ビジュアルプログラミングIoTLT vol.13
you
0
210
IoT から見る AWS re:invent 2022 ― AWSのIoTの歴史を添えて/Point of view the AWS re:invent 2022 with IoT - with a history of IoT in AWS
ma2shita
0
130
Amazon Forecast を使って売上予測をしてみた
tomuro
0
290
MoT/コネヒト/Kanmu が語るプロダクト開発xデータ分析 - 分析から機械学習システムの開発まで一人で複数ロールを担う大変さ
masatakashiwagi
2
540
UNIX は知らない。でも AWS は知ってる。 そんな僕が『 UNIX という考え方』を 読んでみた件
kentosuzuki
1
280
20230117_JAWS-UG_朝会_41_LT資料
tsumita
0
290
Hasuraの本番運用に向けて
nori3tsu
0
260
Stripe / Okta Customer Identity Cloud(旧Auth0) の採用に至った理由 〜モリサワの SaaS 戦略〜
tomuro
0
110
Dev Containers ことはじめ - 失敗から学ぶ開発環境運用法
streamwest1629
0
260
それでもどうしてRecoilを使うのか / Harajuku.ts Meetup Recoil
okunokentaro
11
3.3k
Featured
See All Featured
Put a Button on it: Removing Barriers to Going Fast.
kastner
56
2.5k
Thoughts on Productivity
jonyablonski
49
2.7k
How To Stay Up To Date on Web Technology
chriscoyier
779
250k
The Invisible Side of Design
smashingmag
292
48k
ピンチをチャンスに:未来をつくるプロダクトロードマップ #pmconf2020
aki_iinuma
31
20k
Streamline your AJAX requests with AmplifyJS and jQuery
dougneiner
128
8.8k
Building Better People: How to give real-time feedback that sticks.
wjessup
346
17k
In The Pink: A Labor of Love
frogandcode
132
21k
Cheating the UX When There Is Nothing More to Optimize - PixelPioneers
stephaniewalter
270
12k
Done Done
chrislema
178
14k
Creatively Recalculating Your Daily Design Routine
revolveconf
207
11k
Building a Scalable Design System with Sketch
lauravandoore
451
31k
Transcript
俺の Laravel がこんなに速い わけない! 2022-06-22 Laravel.shibuya Ryo Tomidokoro / @hanhan1978
はじめに Laravel は遅くて有名? Laravel.shibuya Ryo Tomidokoro / @hanhan1978
Laravel.shibuya Ryo Tomidokoro / @hanhan1978
しかし、実際に簡易ブログを作ってみると... ※ 10000 レコードの中規模想定 Laravel.shibuya Ryo Tomidokoro / @hanhan1978
Laravel.shibuya Ryo Tomidokoro / @hanhan1978
充分速い! これじゃ、評判と違う Laravel.shibuya Ryo Tomidokoro / @hanhan1978
低速化 Laravel の実装や実行環境を工夫して、 評判通りに遅くしよう! ※なるべく気づかれないように遅くする技術 Laravel.shibuya Ryo Tomidokoro / @hanhan1978
アプリの仕様 シンプルなブログアプリ Laravel.shibuya Ryo Tomidokoro / @hanhan1978
Laravel.shibuya Ryo Tomidokoro / @hanhan1978
データ量 posts 10000 users 1000 post_posts 33864 Laravel.shibuya Ryo Tomidokoro
/ @hanhan1978
以後の高速化の指標 siege -t 10s -c 50 -b localhost Transaction Rate
(Req/Sec) の3回平均 初期状態は 195.84 Laravel.shibuya Ryo 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.shibuya Ryo Tomidokoro / @hanhan1978
2. opcache.jit 無効化 zend_extension=opcache.so ;opcache.jit=disable 効果なし (CPU バウンドじゃない) 199.29 (Req/Sec)
Laravel.shibuya Ryo Tomidokoro / @hanhan1978
3. opcache 無効化 ;zend_extension=opcache.so 抜群の効果 125.00 (Req/Sec) Laravel.shibuya Ryo Tomidokoro
/ @hanhan1978
4. xdebug 有効化 zend_extension=xdebug 地味な一撃 101.90 (Req/Sec) Laravel.shibuya Ryo Tomidokoro
/ @hanhan1978
ここまでの総評 気づかれずにミドルで与える打撃はこのくらい。 もっと過激な手段としては prefork の startServer 1 PHP のバージョンダウン Laravel.shibuya
Ryo Tomidokoro / @hanhan1978
5. eager loading 廃止 $posts = \App\Models\Post::take(20); //->with('user') //->with('linkPosts') //->with('linkedPosts')->get();
効果は抜群だ! 22.76 (Req/Sec) Laravel.shibuya Ryo Tomidokoro / @hanhan1978
6. limit 句 廃止 $posts = \App\Models\Post::get(); return view(...)->with('posts', $posts->take(20));
mysqlnd の優秀さがわかる 12.83 (Req/Sec) Laravel.shibuya Ryo 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.shibuya Ryo Tomidokoro / @hanhan1978
総評 現場でありえそうなコードでも、50msec -> 1.5 sec 程度に低速化 単体アクセスも遅いが、特に並列化性能は 30 倍程度劣化 ※複雑化したコードベースでは注意しないとすぐ劣化
Laravel.shibuya Ryo Tomidokoro / @hanhan1978
おまけ カリカリチューニング編 Laravel.shibuya Ryo Tomidokoro / @hanhan1978
1. apcu キャッシュ apcu_store('key', $posts); メモリキャッシュ最高 865.7 (Req/Sec) Laravel.shibuya Ryo
Tomidokoro / @hanhan1978
2. var_export して include $posts は stdclass で中身を置き換えた上で file_put_contents('/tmp/posts.php', '<?php
$posts='.var_export($posts, true)); include('/tmp/posts.php'); OPCache に乗る 1098 (Req/Sec) Laravel.shibuya Ryo Tomidokoro / @hanhan1978
3. var_export して preload 上の /tmp/posts.php を preload してしまう 1300
(Req/Sec) Laravel で 5msec の世界 Laravel.shibuya Ryo Tomidokoro / @hanhan1978
これなら Isucon 勝てる? 単純比較は出来ないが、多分無理。 静的 HTML すると 8000 (Req/Sec) Nginx
でやってみると 12000 (Req/Sec) Go は、この1.5 倍くらいなので、18000 と仮定すると、あと13 倍速 くすればワンチャンある。 Laravel.shibuya Ryo Tomidokoro / @hanhan1978
Octane は? ソース見てないので実測だけだが、単純な高速化において swoole ベースで 、今回の 6 割くらいの性能に収まった。 レースコンディションで問題を起こさないようにするために、どこ かで同期処理が入っているのだと思う。
Laravel.shibuya Ryo Tomidokoro / @hanhan1978
じゃあどうしたら? Go を書け Open Swoole と 軽量フレームワークを組み合わせて同期処理を廃 すれば、チャンスはある。 Laravel.shibuya Ryo
Tomidokoro / @hanhan1978