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
PHPでWebサーバーを作って高速化に挑戦する!/php-web-server
Search
Ryo Tomidokoro
April 11, 2022
Technology
1.1k
1
Share
PHPでWebサーバーを作って高速化に挑戦する!/php-web-server
PHPerKaigi 2022 Day2 の LTです。
Ryo Tomidokoro
April 11, 2022
More Decks by Ryo Tomidokoro
See All by Ryo Tomidokoro
あるアーキテクチャ決定と その結果/architecture-decision-and-its-result
hanhan1978
2
630
開発者が知っておきたい複雑さの正体/where-the-complexity-comes-from
hanhan1978
8
3.5k
Spec Driven Development入門/spec_driven_development_for_learners
hanhan1978
2
1.8k
フロントエンドがTypeScriptなら、バックエンドはPHPでもいいじゃない/php-is-not-bad
hanhan1978
8
14k
どうすると生き残れないのか/how-not-to-survive
hanhan1978
17
15k
100分で本番デプロイ!Laravelで作るWebアプリケーション作成/100min_web_app_cicd
hanhan1978
1
260
PHPerのための計算量入門/Complexity101 for PHPer
hanhan1978
8
3.6k
集中して作業する技術/how_to_work_deeply
hanhan1978
65
56k
PHPでデータベースを作ってみた/create-data-with-php
hanhan1978
11
11k
Other Decks in Technology
See All in Technology
ARIA Notifyについて
ryokatsuse
1
120
#jawsugyokohama 100 LT11, "My AWS Journey 2011-2026 - kwntravel"
shinichirokawano
0
350
こんなアーキテクチャ図はいやだ / Anti-pattern in AWS Architecture Diagrams
naospon
1
450
最初の一歩を踏み出せなかった私が、誰かの背中を押したいと思うようになるまで / give someone a push
mii3king
0
160
AWS DevOps Agentはチームメイトになれるのか?/ Can AWS DevOps Agent become a teammate
kinunori
6
740
Rapid Start: Faster Internet Connections, with Ruby's Help
kazuho
2
600
みんなで作るAWS Tips 100連発 (FinOps編)
schwrzktz
1
300
Hacobu Tech Deck
hacobu
PRO
0
110
「SaaSの次の時代」に重要性を増すステークホルダーマネジメントの要諦 ~解像度を圧倒的に高めPdMの価値を最大化させる方法~
kakehashi
PRO
2
990
Microsoft 365 / Microsoft 365 Copilot : 自分の状態を確認する「ラベル」について
taichinakamura
0
240
The Journey of Box Building
tagomoris
4
2.8k
クラウドネイティブな開発 ~ 認知負荷に立ち向かうためのコンテナ活用
literalice
0
130
Featured
See All Featured
Joys of Absence: A Defence of Solitary Play
codingconduct
1
350
Claude Code のすすめ
schroneko
67
220k
The MySQL Ecosystem @ GitHub 2015
samlambert
251
13k
世界の人気アプリ100個を分析して見えたペイウォール設計の心得
akihiro_kokubo
PRO
69
39k
How to Create Impact in a Changing Tech Landscape [PerfNow 2023]
tammyeverts
55
3.3k
The B2B funnel & how to create a winning content strategy
katarinadahlin
PRO
1
330
Tips & Tricks on How to Get Your First Job In Tech
honzajavorek
1
490
The Power of CSS Pseudo Elements
geoffreycrofte
82
6.2k
Kristin Tynski - Automating Marketing Tasks With AI
techseoconnect
PRO
0
230
Leadership Guide Workshop - DevTernity 2021
reverentgeek
1
270
Lightning Talk: Beautiful Slides for Beginners
inesmontani
PRO
1
520
Designing for Timeless Needs
cassininazir
0
200
Transcript
@hanhan1978 PHPでWebサーバーを作って高速化に挑 戦する! PHPerKaigi 2022 LT
@hanhan1978 • 富所 亮 • 所属 株式会社カオナビ💎 Expert • 職業
Webアプリケーションエンジニア • ブログ https://blog.hanhans.net • Yokohama North AM https://anchor.fm/yokohama-north-am 2
本日のテーマ 3
PHP 8.1 でウェブサーバーを作って 世界一を目指す! 4
ルール説明 5
各言語、実装、ミドルウェアのウェブサーバーは / へのアクセスに対して {status : “OK”} というレスポンスを返す 6
各言語、実装、ミドルウェアのウェブサーバーは / へのアクセスに対して {status : “OK”} というレスポンスを返す 7
ベンチマーカーには wrk を使う。 ベンチマークコマンドは下記 wrk -t3 -c100 -d30s –latency http://127.0.0.1:8080/
8
9 実測
まずは対戦相手から 10
11 Go
Nginx 12 docker run -v default.conf:/etc/nginx/conf.d/default.conf -p 8080:80 --rm nginx
Node.js 13
14
top 1 で簡易に負荷状況を見る 15
top 1 で簡易に負荷状況を見る 16 特定のCPUコアに負荷が偏る
top 1 で簡易に負荷状況を見る 17
top 1 で簡易に負荷状況を見る 18 満遍なく負荷をかけられている こちらが理想的な形
19 PHP実装
Webサーバーとは? ようするに HTTP の仕様にそった 文字列を Socket 通信で返却すればOK 20
まずは、シングルプロセス 21
まずは、シングルプロセス 22 実に単純明快
23 結果
無念の敗退 24
次は、IO多重化 25
次は、IO多重化 26 複数コネクションを同時に扱 えるようになった
27 結果
むしろ遅くなる 28
シンプルすぎる返却値なので socket_select 分遅くなったと推測 29
よし!ノンブロックだ! 30
よし!ノンブロックだ! 31 時代はノンブロッキング
32 結果
ブロッキングとほぼ変わらない 33
この辺で、PHPのコア側にブロックしてい る箇所があるという想像が働く 34
実際の負荷状況 35
実際の負荷状況 36 全てのコアが遊びまくっている
ノンブロッキングの場合は無限ループのコードにな るので、若干1コアの負荷が上がるが、ほぼ負荷を かけられない 37
諦めずにpreforkしてみる 38
諦めずにpreforkしてみる 39 ノンブロッキングサーバーを 複数プロセスで利用
40 結果
ちょっと改善したが... 41
そろそろ勝てる気がしなくなってきたので 手当たりしだいに試した 42
手当たり次第の結果 43 実装 Req/Seq Amp 11933 RoadRunner 19618 Revolt 20297
mod-php 30389
なんとか Node.js をかわした 44
しかし、それでいいのか? 45
mod-php での実装 46
mod-php での実装 47 これでいいのか?
助けて Open Swoole ….. 48
Open Swoole での実装 49
50 結果
勝てば官軍 51
52 優勝だ!
ちょっとだけ、まじめなラップアップ 53
Open Swoole は、PHPコアのブロッキングする関 数を独自実装で置き換えている。 結局のところ、ボトルネックを自前で差し替えるよう な豪腕を発揮しない限りPHP単体では勝てないの かもしれない。 54
この件については、まじめな追加調査をします! 影PHP勉強会でお会いしましょう! 55