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
1
2.4k
俺の Laravel がこんなに速いわけがない! / My Laravel Too Fast
Laravel を意図的に低速化していくことで、どのようなコードがどれくらいの影響を速度面で与えるかを勉強します。
Ryo Tomidokoro
June 29, 2022
Tweet
Share
More Decks by Ryo Tomidokoro
See All by Ryo Tomidokoro
100分で本番デプロイ!Laravelで作るWebアプリケーション作成/100min_web_app_cicd
hanhan1978
1
53
PHPerのための計算量入門/Complexity101 for PHPer
hanhan1978
6
1.8k
集中して作業する技術/how_to_work_deeply
hanhan1978
62
46k
PHPでデータベースを作ってみた/create-data-with-php
hanhan1978
11
9.7k
ADRを一年運用してみた/adr_after_a_year
hanhan1978
8
3.8k
B+木入門:PHPで理解する データベースインデックスの仕組み/b-plus-tree-101
hanhan1978
5
4.9k
ADRを一年運用してみた/our_story_about_adr
hanhan1978
5
2.1k
PHPで学ぶ Session の基本と応用 / web-app-session-101-2024
hanhan1978
13
5.7k
レガシー回避のPHP開発術/avoid_php_legacy
hanhan1978
17
13k
Other Decks in Technology
See All in Technology
一度 Expo の採用を断念したけど、 再度 Expo の導入を検討している話
ichiki1023
1
230
「正しく」失敗できる チームの作り方 〜リアルな事例から紐解く失敗を恐れない組織とは〜 / A team that can fail correctly
i35_267
1
500
Moved to https://speakerdeck.com/toshihue/presales-engineer-career-bridging-tech-biz-ja
toshihue
2
830
【Developers Summit 2025】プロダクトエンジニアから学ぶ、 ユーザーにより高い価値を届ける技術
niwatakeru
2
1.6k
The Future of SEO: The Impact of AI on Search
badams
0
240
Tech Blogを書きやすい環境づくり
lycorptech_jp
PRO
1
260
短縮URLをお手軽に導入しよう
nakasho
0
110
JEDAI Meetup! Databricks AI/BI概要
databricksjapan
0
270
全文検索+セマンティックランカー+LLMの自然文検索サ−ビスで得られた知見
segavvy
2
130
利用終了したドメイン名の最強終活〜観測環境を育てて、分析・供養している件〜 / The Ultimate End-of-Life Preparation for Discontinued Domain Names
nttcom
2
310
NFV基盤のOpenStack更新 ~9世代バージョンアップへの挑戦~
vtj
0
200
Building Products in the LLM Era
ymatsuwitter
10
6.1k
Featured
See All Featured
KATA
mclloyd
29
14k
Agile that works and the tools we love
rasmusluckow
328
21k
How To Stay Up To Date on Web Technology
chriscoyier
790
250k
Music & Morning Musume
bryan
46
6.4k
Let's Do A Bunch of Simple Stuff to Make Websites Faster
chriscoyier
507
140k
Building a Modern Day E-commerce SEO Strategy
aleyda
38
7.1k
Bash Introduction
62gerente
611
210k
I Don’t Have Time: Getting Over the Fear to Launch Your Podcast
jcasabona
32
2.1k
It's Worth the Effort
3n
184
28k
For a Future-Friendly Web
brad_frost
176
9.5k
[Rails World 2023 - Day 1 Closing Keynote] - The Magic of Rails
eileencodes
33
2.1k
Typedesign – Prime Four
hannesfritz
40
2.5k
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