Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Speaker Deck
PRO
Sign in
Sign up for free
PHPでWebサーバーを作って高速化に挑戦する!/php-web-server
Ryo Tomidokoro
April 11, 2022
Technology
0
220
PHPでWebサーバーを作って高速化に挑戦する!/php-web-server
PHPerKaigi 2022 Day2 の LTです。
Ryo Tomidokoro
April 11, 2022
Tweet
Share
More Decks by Ryo Tomidokoro
See All by Ryo Tomidokoro
Laravel を低速化する技術 / how to slow laravel
hanhan1978
0
1.7k
俺の Laravel がこんなに速いわけがない! / My Laravel Too Fast
hanhan1978
0
590
カンファレンスで登壇するとどうなるのか? / PHPTechCafe PHPerKaigi 2022
hanhan1978
3
240
同期的なプログラミング言語の視点から非同期処理を理解する/understand async from sync
hanhan1978
2
680
カオナビにおける マイクロサービスの取組と今後の展開 / kaonavi rearchitecturing
hanhan1978
1
1.5k
EventLoopの実装から考えるFiberの位置付けについて/Fiber and Async Request
hanhan1978
4
610
PHPで書いて覚える非同期処理 / php-async-programming
hanhan1978
5
4.2k
PHPで学ぶ Session の基本と応用 / web-app-session-101
hanhan1978
15
5.3k
ソースコードから理解するPreloadとJITの話/preload_and_jit
hanhan1978
1
1.5k
Other Decks in Technology
See All in Technology
金属加工屋の営業マンがSTマイクロで・・・
usashirou
0
170
スクラム導入して変わったチーム、組織のありかた
yumechi
0
190
WebLogic Server for OCI 概要
oracle4engineer
PRO
3
880
PCL (Point Cloud Library)の基本となぜ点群処理か_2023年_第2版.pdf
cvmlexpertguide
0
170
ChatGPT for Hacking
anugrahsr
0
4.4k
Airdrop for Open Source Projects
epicsdao
0
700
230125 古いタブレットの活用 かーでぃさん
comucal
PRO
0
16k
PCI DSS に準拠したシステム開発
yutadayo
0
310
SSMパラメーターストアでクロススタック参照の罠を回避する
shuyakinjo
0
7.1k
ML PM, DS PMってどんな仕事をしているの?
line_developers
PRO
1
240
「一通りできるようになった」その先の話
hitomi___kt
0
120
OpenShiftのリリースノートを整理してみた
loftkun
2
390
Featured
See All Featured
Faster Mobile Websites
deanohume
295
29k
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
7
580
5 minutes of I Can Smell Your CMS
philhawksworth
198
18k
Done Done
chrislema
178
14k
A Philosophy of Restraint
colly
193
15k
GitHub's CSS Performance
jonrohan
1020
430k
Building Adaptive Systems
keathley
27
1.3k
Agile that works and the tools we love
rasmusluckow
320
20k
Web Components: a chance to create the future
zenorocha
304
40k
Art Directing for the Web. Five minutes with CSS Template Areas
malarkey
196
9.8k
Typedesign – Prime Four
hannesfritz
34
1.5k
Making the Leap to Tech Lead
cromwellryan
117
7.7k
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