Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
俺の Laravel がこんなに速いわけがない! / My Laravel Too Fast
Search
Ryo Tomidokoro
June 29, 2022
Technology
0
1.6k
俺の Laravel がこんなに速いわけがない! / My Laravel Too Fast
Laravel を意図的に低速化していくことで、どのようなコードがどれくらいの影響を速度面で与えるかを勉強します。
Ryo Tomidokoro
June 29, 2022
Tweet
Share
More Decks by Ryo Tomidokoro
See All by Ryo Tomidokoro
ADRを一年運用してみた/adr_after_a_year
hanhan1978
7
2.4k
B+木入門:PHPで理解する データベースインデックスの仕組み/b-plus-tree-101
hanhan1978
5
3.3k
ADRを一年運用してみた/our_story_about_adr
hanhan1978
4
1.3k
PHPで学ぶ Session の基本と応用 / web-app-session-101-2024
hanhan1978
12
4.7k
レガシー回避のPHP開発術/avoid_php_legacy
hanhan1978
14
11k
Laravel Collectionの計算量を調べてみた2023/laravel_collection_time_complexity_2023
hanhan1978
0
860
PHP で学ぶ Cache の距離の話 / study_cache_with_php
hanhan1978
7
1.8k
Laravel を低速化する技術 / how to slow laravel
hanhan1978
1
3.1k
カンファレンスで登壇するとどうなるのか? / PHPTechCafe PHPerKaigi 2022
hanhan1978
3
390
Other Decks in Technology
See All in Technology
Tellus の衛星データを見てみよう #mf_fukuoka
kongmingstrap
0
220
非同期推論システムによるコスト削減と信頼性向上
koki_nishihara
0
270
LangSmith入門―トレース/評価/プロンプト管理などを担うLLMアプリ開発プラットフォーム
os1ma
3
390
SIEMを用いて、セキュリティログ分析の可視化と分析を実現し、PDCAサイクルを回してみた
coconala_engineer
0
340
「スニダン」開発組織の構造に込めた意図 ~組織作りはパッションや政治ではない!~
rinchsan
3
570
今年のRubyKaigiはProfiler Year🤘
osyoyu
0
180
ChatworkのSRE部って実は 半分くらいPlatform Engineering部かもしれない
saramune
0
160
IaCジェネレーターとBedrockで詳細設計書を生成してみた
tsukasa_ishimaru
3
290
VS CodeでAWSを操作しよう
smt7174
8
1.7k
GraphQL 成熟度モデルの紹介と、プロダクトに当てはめた事例 / GraphQL maturity model
mh4gf
7
1.4k
複雑な構成要素を持つUIとの向き合い方 〜新・支出グラフでの実例〜 / B43 TECH TALK
nakamuuu
0
140
エンジニアのキャリアをちょっと楽しくする3本の軸/Three Pillars to Make an Engineer's Career More Enjoyable
kwappa
0
2.7k
Featured
See All Featured
The Invisible Side of Design
smashingmag
294
49k
CSS Pre-Processors: Stylus, Less & Sass
bermonpainter
352
28k
10 Git Anti Patterns You Should be Aware of
lemiorhan
648
58k
Into the Great Unknown - MozCon
thekraken
10
1k
Git: the NoSQL Database
bkeepers
PRO
422
63k
How to Create Impact in a Changing Tech Landscape [PerfNow 2023]
tammyeverts
14
1.6k
Faster Mobile Websites
deanohume
299
30k
WebSockets: Embracing the real-time Web
robhawkes
59
7k
Building Flexible Design Systems
yeseniaperezcruz
319
37k
Web development in the modern age
philhawksworth
202
10k
ピンチをチャンスに:未来をつくるプロダクトロードマップ #pmconf2020
aki_iinuma
78
43k
Easily Structure & Communicate Ideas using Wireframe
afnizarnur
187
16k
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