Slide 1

Slide 1 text

PHPer が ISUCON11 に チャレンジした時のあれこれ 2021/10/03 PHP Conference Japan 2021 #phpcon2021 @takoba

Slide 2

Slide 2 text

誰? takoba / ばーばら 🌹 🏢 コネヒト株式会社 󰳕 Webアプリケーション / PHP / ちょっとReact / たまにUXデザイン 🏓 インターネット / 音楽 / カレーライス / 銭湯 / Jリーグ / ポッドキャスト @takoba @takoba_

Slide 3

Slide 3 text

[PR]会社紹介 「あなたの家族像が実現できる社会をつくる」というビジョンを掲げ、 ママの3人に1人(※) が利用する「ママリ」などを運営しています。 ※「ママリ」で2019年に出産予定と設定したユーザー数と、厚生労働省発表「人口動態統計」の出生数から算出

Slide 4

Slide 4 text

[PR]会社紹介 「あなたの家族像が実現できる社会をつくる」というビジョンを掲げ、 ママの3人に1人(※) が利用する「ママリ」などを運営しています。 ※「ママリ」で2019年に出産予定と設定したユーザー数と、厚生労働省発表「人口動態統計」の出生数から算出 「ママリ」は主にサーバーサイドが CakePHP 3-4 で書かれています! (ご興味のある方は Twitter: @takoba_ まで 💌 )

Slide 5

Slide 5 text

ISUCON とは? 前提

Slide 6

Slide 6 text

https://isucon.net/

Slide 7

Slide 7 text

いいかんじにスピードアップコンテスト ( Web アプリケーションのパフォーマンス向上を競う)

Slide 8

Slide 8 text

No content

Slide 9

Slide 9 text

今年で11回目、約600チーム参加、 優勝賞金100万円のなかなか規模のでかいコンテストです

Slide 10

Slide 10 text

2021年8月21日 朝 ISUCON11 予選当日

Slide 11

Slide 11 text

ISUCON11 予選に参加しました

Slide 12

Slide 12 text

うおおおおおおおおおお おおおおおおおおおおお おおおおおおおおおおお おおおおおおおおおおお

Slide 13

Slide 13 text

8時間後 2021年8月21日 夕方

Slide 14

Slide 14 text

惨敗しました (スコア: 1,000点 / 428位タイ)

Slide 15

Slide 15 text

https://commons.nicovideo.jp/material/nc109721

Slide 16

Slide 16 text

というのは冗談で、 冷静にふりかえりします

Slide 17

Slide 17 text

PHPer が参加してみてどうだったか 感想

Slide 18

Slide 18 text

ISUCON は参考実装が選べます。 Go / Ruby / Python / Node.js / Perl / Rust / PHP

Slide 19

Slide 19 text

我々は、当然 PHP を選びました。

Slide 20

Slide 20 text

だけど...

Slide 21

Slide 21 text

結論、PHPあんま関係ねえ!

Slide 22

Slide 22 text

詳しく掘り下げていきます

Slide 23

Slide 23 text

● PHP 参考実装のアプリケーションは Slim Framework で書かれている ○ 薄くて一通り読める ○ アプリのコアとなる app/routes.php は1,800行くらい ■ アクションメソッドがごっそり集中している ■ app/routes.php の各種メソッドの実装で、エラーの受け取り方とかが なんとなく Go っぽいかんじに書かれてること以外は特に... ● 実行環境は nginx + php-fpm + MariaDB ○ 特筆すべきことは特にないかな(いまどきのナウい構成) ISUCON で PHP に関係するところ

Slide 24

Slide 24 text

No content

Slide 25

Slide 25 text

● 「推測するな、計測せよ」(cf. ISUCON 事前講習2021 座学 ) ○ e.g. CPU / memory /process の状態を htop などで探る ○ e.e. nginxのアクセスログを解析してボトルネックを探る ■ alp とかを使って、どこにアクセスが集中しているかを集計する ○ e.g. MariaDB(ほぼMySQL) の slow-query.log を解析して改善計画を練る ■ cf. スローログの集計に便利な「pt-query-digest」を使ってみよう | Think IT(シンクイット) ● 実際に使うときは matsuu/docker-pt-query-digest を使うと便利 ■ slow-query の改善に関しては 本カンファレンスの @mamy1326 の セッション がとても参考になった〜〜 ISUCON の勝負どころはアプリだけにあらず

Slide 26

Slide 26 text

● 「推測するな、計測せよ」(20秒ぶり2回目) ○ e.g. アプリケーションをプロファイリングしてボトルネックを探る ■ APM(Application Performance Monitoring)を活用したいけど... ● e.g. New Relic APM, Tideways XHProf etc. ○ APM、どれもだいたい有料なんですよね... ■ ISUCON11 では Sponsored してくれて無料で使えた 🙌 ● 本家 XHProf は PHP7 以上に公式で対応してない 😢 ■ PHP8 に対応したプロファイリングは 本カンファレンスでの @seike460 によるセッション がめちゃ詳しかった! ● cf . PHP8のプロファイリングにXdebug3とWebgrindを使う - Fusic Tech Blog ISUCONの勝負どころはアプリだけにあらず

Slide 27

Slide 27 text

● 「推測するな、計測せよ」 (20秒ぶり3回目) ○ 意味がないわけじゃないけど、ボトルネックをシューティングしなくちゃ スコア(=パフォーマンス)に影響してこない ○ 限られた時間の中で、どのボトルネックをシューティングすべきかが肝 ■ アプリの問題を見つけてもボトルネックパズルの中の一部に過ぎない ● e.g. N+1問題 ■ アプリケーションの問題以上にトラフィックの問題が大きかったり ■ そのへんを解決してようやくN+1を解決したのが効いてくるかも ● 結局そこまで辿り着けずに終わってしまった... 😭 N+1問題を解決したぜドヤァがあまり意味をなさない

Slide 28

Slide 28 text

● これも 事前講習 で言われてたけど「マニュアル読むの大事」 ○ 前提を理解しないとアプリもトラフィックもDBも特徴掴めない ■ 今回は ISUCONDITION というイスの調子を記録するサービス(?) ■ 各イスから status が秒単位で大量に送られてくる、という設定 ● どのエンドポイントに集中するのか?みたいなシナリオをイメー ジすると、自ずとボトルネック候補が絞られてくる ○ マニュアル無視すると、結局はどこがボトルネックか特定しづらい 「マニュアル読むの大事」

Slide 29

Slide 29 text

というわけで、

Slide 30

Slide 30 text

結論、PHPあんま関係ねえ!

Slide 31

Slide 31 text

PHPより前に解決することがある (今回は特に、序盤のボトルネックがインフラ寄りだった感)

Slide 32

Slide 32 text

つまりは、Webアプリケーションエンジニアの総合力が問われるので、 ISUCON 参加はめちゃくちゃ経験値になるはず 💪

Slide 33

Slide 33 text

というわけで、みんな来年も ISUCON 参加しような!! 🤝 (練習問題やるだけでも力になります)

Slide 34

Slide 34 text

個人的には PHPer の参加を増やして、 PHP 参考実装を継続してほしい…!🙏(切実)

Slide 35

Slide 35 text

終 制作・著作

Slide 36

Slide 36 text

● Slim Framework ● ISUCON 事前講習2021 座学 ● isucon/isucon11-qualify: ISUCON11 予選 (ISUCONDITION) ● htopコマンドで覚えておきたい使い方11個 | 俺的備忘録 〜なんかいろいろ〜 ● alpの使い方(基本編) - Zenn ● スローログの集計に便利な「pt-query-digest」を使ってみよう | Think IT(シ ンクイット) ○ matsuu/docker-pt-query-digest: Dockerfile for pt-query-digest(Percona Toolkit) ● PHPer が知るべき MySQL クエリチューニング/What PHPers Need to Know about MySQL Query Tuning - Speaker Deck 参考文献

Slide 37

Slide 37 text

● New Relic APM | サービス紹介 | New Relic(ニューレリック) ● XHProf for PHP7 – Tideways ● PHPWebアプリケーションパフォーマンスチューニングの勘所〜なぜアプリケー ションは速くなるのか〜 / Why PHP Applications are Faster - Speaker Deck 参考文献