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.6k
俺の Laravel がこんなに速いわけがない! / My Laravel Too Fast
Laravel を意図的に低速化していくことで、どのようなコードがどれくらいの影響を速度面で与えるかを勉強します。
Ryo Tomidokoro
June 29, 2022
Tweet
Share
More Decks by Ryo Tomidokoro
See All by Ryo Tomidokoro
フロントエンドがTypeScriptなら、バックエンドはPHPでもいいじゃない/php-is-not-bad
hanhan1978
8
12k
どうすると生き残れないのか/how-not-to-survive
hanhan1978
17
13k
100分で本番デプロイ!Laravelで作るWebアプリケーション作成/100min_web_app_cicd
hanhan1978
1
160
PHPerのための計算量入門/Complexity101 for PHPer
hanhan1978
8
2.7k
集中して作業する技術/how_to_work_deeply
hanhan1978
62
48k
PHPでデータベースを作ってみた/create-data-with-php
hanhan1978
11
10k
ADRを一年運用してみた/adr_after_a_year
hanhan1978
8
4k
B+木入門:PHPで理解する データベースインデックスの仕組み/b-plus-tree-101
hanhan1978
5
5.2k
ADRを一年運用してみた/our_story_about_adr
hanhan1978
5
2.3k
Other Decks in Technology
See All in Technology
JavaのMCPサーバーで体験するAIエージェントの世界
tatsuya1bm
1
210
大手企業のAIツール導入の壁を越えて:サイバーエージェントのCursor活用戦略
gunta
34
17k
現場で役立つAPIデザイン
nagix
1
190
Java 30周年記念! Javaの30年をふりかえる
skrb
4
2.7k
AIエージェント実践集中コース LT
okaru
1
190
impressions-trying-lambda-web-adapter
junkishigaki
2
140
Vibe Codingの裏で、 考える力をどう取り戻すか
csekine
1
450
All About Sansan – for New Global Engineers
sansan33
PRO
1
1.2k
Sansan Engineering Unit 紹介資料
sansan33
PRO
1
2k
為什麼我們需要 Observability?
marcustung
0
490
【ClickHouseMeetup】ClickHouseを活用したセキュリティログ解析AIエージェント『LogEater』とは
hssh2_bin
0
120
Introduction to Sansan, inc / Sansan Global Development Center, Inc.
sansan33
PRO
0
2.6k
Featured
See All Featured
Bootstrapping a Software Product
garrettdimon
PRO
307
110k
Raft: Consensus for Rubyists
vanstee
138
7k
Responsive Adventures: Dirty Tricks From The Dark Corners of Front-End
smashingmag
252
21k
Site-Speed That Sticks
csswizardry
9
620
For a Future-Friendly Web
brad_frost
178
9.8k
The Language of Interfaces
destraynor
158
25k
個人開発の失敗を避けるイケてる考え方 / tips for indie hackers
panda_program
106
19k
Optimizing for Happiness
mojombo
378
70k
GraphQLとの向き合い方2022年版
quramy
46
14k
It's Worth the Effort
3n
184
28k
Six Lessons from altMBA
skipperchong
28
3.8k
Why Our Code Smells
bkeepers
PRO
337
57k
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