Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
PHPでWebサーバーを作って高速化に挑戦する!/php-web-server
Search
Ryo Tomidokoro
April 11, 2022
Technology
1.2k
1
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
PHPでWebサーバーを作って高速化に挑戦する!/php-web-server
PHPerKaigi 2022 Day2 の LTです。
Ryo Tomidokoro
April 11, 2022
More Decks by Ryo Tomidokoro
See All by Ryo Tomidokoro
Laravelで学ぶ Webアプリケーションチューニング入門/web_application_tuning_101
hanhan1978
4
2.6k
あるアーキテクチャ決定と その結果/architecture-decision-and-its-result
hanhan1978
2
1.9k
開発者が知っておきたい複雑さの正体/where-the-complexity-comes-from
hanhan1978
8
3.9k
Spec Driven Development入門/spec_driven_development_for_learners
hanhan1978
2
2k
フロントエンドが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
310
PHPerのための計算量入門/Complexity101 for PHPer
hanhan1978
8
4k
集中して作業する技術/how_to_work_deeply
hanhan1978
69
62k
Other Decks in Technology
See All in Technology
パッチ更新でterraform initが落ちた日
grimoh
1
130
TinyGoでオブザーバビリティ?OpenTelemetryはTinyGoで使えるのか / Is OpenTelemetry available in TinyGo environment?
ymotongpoo
2
140
ハードウェアコンペでもAI駆動開発が進んでいる話
iotengineer22
1
710
AIがコードを書く時代に、エンジニアは何で自分の価値を証明するのか / In an era where AI writes code how do engineers prove their value
carta_engineering
3
950
ソフトウェア ファクトリー - 再現性のあるソフトウェアの工場づくり / Software factory
iktakahiro
5
3.2k
大型犬好きによるPugの紹介
yamanoku
1
150
実体験から学ぶ分析エージェントの開発と運⽤
recruitengineers
PRO
8
2.3k
Kiro Crewをはじめよう
kizawa2020
1
150
UniFi(ユニファイ)AIカメラの現場活用
ludicmind
1
430
AI時代に必要な脅威モデリング― 変化の速度に負けない理解とリスク判断
masakane55
5
1.3k
JAWSUG TOHOKU 青森支部 「LoGoチャット」のAWS移行で 乗り越えたこと
taketakekaho
0
220
Deep Data Security 機能解説
oracle4engineer
PRO
2
800
Featured
See All Featured
Agile Leadership in an Agile Organization
kimpetersen
PRO
0
280
Typedesign – Prime Four
hannesfritz
42
3.2k
Breaking role norms: Why Content Design is so much more than writing copy - Taylor Woolridge
uxyall
1
450
State of Search Keynote: SEO is Dead Long Live SEO
ryanjones
0
320
Side Projects
sachag
456
43k
Templates, Plugins, & Blocks: Oh My! Creating the theme that thinks of everything
marktimemedia
31
2.9k
Practical Orchestrator
shlominoach
192
12k
Become a Pro
speakerdeck
PRO
31
6.3k
Ethics towards AI in product and experience design
skipperchong
2
430
New Earth Scene 8
popppiees
4
2.7k
Automating Front-end Workflow
addyosmani
1369
210k
Ecommerce SEO: The Keys for Success Now & Beyond - #SERPConf2024
aleyda
1
2.2k
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