Upgrade to Pro — share decks privately, control downloads, hide ads and more …

PHPでWebサーバーを作って高速化に挑戦する!/php-web-server

 PHPでWebサーバーを作って高速化に挑戦する!/php-web-server

PHPerKaigi 2022 Day2 の LTです。

F04982ad61107b5408ad139966596316?s=128

Ryo Tomidokoro

April 11, 2022
Tweet

More Decks by Ryo Tomidokoro

Other Decks in Technology

Transcript

  1. @hanhan1978 PHPでWebサーバーを作って高速化に挑 戦する! PHPerKaigi 2022 LT

  2. @hanhan1978 • 富所 亮 • 所属 株式会社カオナビ💎 Expert • 職業

    Webアプリケーションエンジニア • ブログ https://blog.hanhans.net • Yokohama North AM https://anchor.fm/yokohama-north-am 2
  3. 本日のテーマ 3

  4. PHP 8.1 でウェブサーバーを作って 世界一を目指す! 4

  5. ルール説明 5

  6. 各言語、実装、ミドルウェアのウェブサーバーは / へのアクセスに対して {status : “OK”} というレスポンスを返す 6

  7. 各言語、実装、ミドルウェアのウェブサーバーは / へのアクセスに対して {status : “OK”} というレスポンスを返す 7

  8. ベンチマーカーには wrk を使う。 ベンチマークコマンドは下記 wrk -t3 -c100 -d30s –latency http://127.0.0.1:8080/

    8
  9. 9 実測

  10. まずは対戦相手から 10

  11. 11 Go

  12. Nginx 12 docker run -v default.conf:/etc/nginx/conf.d/default.conf -p 8080:80 --rm nginx

  13. Node.js 13

  14. 14

  15. top 1 で簡易に負荷状況を見る 15

  16. top 1 で簡易に負荷状況を見る 16 特定のCPUコアに負荷が偏る

  17. top 1 で簡易に負荷状況を見る 17

  18. top 1 で簡易に負荷状況を見る 18 満遍なく負荷をかけられている こちらが理想的な形

  19. 19 PHP実装

  20. Webサーバーとは? ようするに HTTP の仕様にそった 文字列を Socket 通信で返却すればOK 20

  21. まずは、シングルプロセス 21

  22. まずは、シングルプロセス 22 実に単純明快

  23. 23 結果

  24. 無念の敗退 24

  25. 次は、IO多重化 25

  26. 次は、IO多重化 26 複数コネクションを同時に扱 えるようになった

  27. 27 結果

  28. むしろ遅くなる 28

  29. シンプルすぎる返却値なので socket_select 分遅くなったと推測 29

  30. よし!ノンブロックだ! 30

  31. よし!ノンブロックだ! 31 時代はノンブロッキング

  32. 32 結果

  33. ブロッキングとほぼ変わらない 33

  34. この辺で、PHPのコア側にブロックしてい る箇所があるという想像が働く 34

  35. 実際の負荷状況 35

  36. 実際の負荷状況 36 全てのコアが遊びまくっている

  37. ノンブロッキングの場合は無限ループのコードにな るので、若干1コアの負荷が上がるが、ほぼ負荷を かけられない 37

  38. 諦めずにpreforkしてみる 38

  39. 諦めずにpreforkしてみる 39 ノンブロッキングサーバーを 複数プロセスで利用

  40. 40 結果

  41. ちょっと改善したが... 41

  42. そろそろ勝てる気がしなくなってきたので 手当たりしだいに試した 42

  43. 手当たり次第の結果 43 実装 Req/Seq Amp 11933 RoadRunner 19618 Revolt 20297

    mod-php 30389
  44. なんとか Node.js をかわした 44

  45. しかし、それでいいのか? 45

  46. mod-php での実装 46

  47. mod-php での実装 47 これでいいのか?

  48. 助けて Open Swoole ….. 48

  49. Open Swoole での実装 49

  50. 50 結果

  51. 勝てば官軍 51

  52. 52 優勝だ!

  53. ちょっとだけ、まじめなラップアップ 53

  54. Open Swoole は、PHPコアのブロッキングする関 数を独自実装で置き換えている。 結局のところ、ボトルネックを自前で差し替えるよう な豪腕を発揮しない限りPHP単体では勝てないの かもしれない。 54

  55. この件については、まじめな追加調査をします! 影PHP勉強会でお会いしましょう! 55