Share
Embed
「接続」—パフォーマンスチューニングの最後の一手 〜点と点を結ぶ、その一瞬のために〜
PHPerKaigi 2026
2026-03-21 10:40 -
Track B / レギュラートーク(40分)
プロポーザル: https://fortee.jp/phperkaigi-2026/proposal/a16d700c-23b2-4345-956c-eb7869daa814
武田 憲太郎
March 21, 2026
Transcript
73 slides
-
Cloud Infrastructure Server User CDN LB Web Server App Runtime
DB Cache Ext API ͯ͢ͷϦΫΤετɺ ඞͣ͜ΕΒͷlઢzΛ௨Δ -
ʮଓʯͷجຊ֓೦ͱ)551 ΞϓϦέʔγϣϯͷʮଓʯ σʔλϕʔεͷʮଓʯ Ωϟογϡͷʮଓʯ ֎෦"1*ͷʮଓʯ
ଓੑೳʹઌཱͭ ΞδΣϯμ 2026/3/21 #phperkaigi #b 「接続」— パフォーマンスチューニングの最後の一手 10 -
1 2 3 4 5 index.htm フレームセット 1 menu.htm ナビゲーション
2 top.htm コンテンツ 3 abehiroshi.jpg 背景画像 4 abe-top-*.jpg プロフィール写真 5 ʮѨ෦ͷϗʔϜϖʔδʯ͕දࣔ͞ΕΔ·Ͱ -
5$1ଓཱ֬ʢXBZIBOETIBLFʣ • EBZ5SBDL" 1)1ͰͰ͖Δʂࣗ࡞*1ϧʔλʔ CZࢢ!DBLFQIQFS 5-4ϋϯυγΣΠΫʢ)5514ͷ߹ʣ • EBZ5SBDL#
1)1Ͱ5-4ͷϓϩτίϧΛ࣮ͯ͠ΈΔ CZͻ͕͖ ϦΫΤετɾϨεϙϯε • %BZ5SBDL# ंྠͷ࠶ൃ໌Λ͠Α͏ʂ1)1Ͱֶ࣮ͯ͠Ϳɺ8FCαʔόʔͷΈͱ)551ͷਖ਼ମ CZ)3 ʮଓʯຖʹҰఆͷίετ͕ൃੜ͍ͯ͠Δ ʮଓʯΛߏ͢Δཁૉ 2026/3/21 #phperkaigi #b 「接続」— パフォーマンスチューニングの最後の一手 13 -
ׂΛऴ͑ͨଓΛผͷϦΫΤετʹ࠶ར༻ • "QBDIF • ,FFQ"MJWF0O • σϑΥϧτ༗ޮʢ௨ৗԿ͠ͳͯ͘ྑ͍ʣ • ݹ͍࣌ͷઃఆϑΝΠϧ0GG͕ଟ͍ͷͰҙ •
/HJOY • ৗʹ༗ޮ )551,FFQ"MJWFrଓͷ࠶ར༻ 2026/3/21 #phperkaigi #b 「接続」— パフォーマンスチューニングの最後の一手 14 -
1 2 3 4 5 index.htm フレームセット 1 menu.htm ナビゲーション
2 top.htm コンテンツ 3 abehiroshi.jpg 背景画像 4 abe-top-*.jpg プロフィール写真 5 再利用 再利用 再利用 段階1 段階2 ─ 並列 段階3 ─ 並列 ଓͷଟॏԽͱ࠶ར༻ʹΑΔੑೳ্ -
࠶ར༻ͷ༗ແʹΑΔੑೳࠩ ※全てのHTTPSリクエストに対し「OK」とだけ返すWebサーバをローカルネットワーク内の別マシンで起 動し「100並列 × 1000回 = 10万リクエスト」送信した際のレスポンスタイム 平均で約6倍、95パーセンタイルで約15倍の性能差 Avg Median
95pct KeepAlive Off 106ms 79ms 234ms KeepAlive On 17ms 11ms 16ms 倍率 6.16x 7.18x 14.63x 2026/3/21 #phperkaigi #b 「接続」— パフォーマンスチューニングの最後の一手 16 -
6 7 ϖʔδભҠΛލ͙ଓͷ࠶ར༻ トップページ 映画出演 index.htm フレームセット 1 menu.htm ナビゲーション
2 top.htm コンテンツ 3 abehiroshi.jpg 背景画像 4 abe-top-*.jpg プロフィール写真 5 eiga.htm 映画出演ページ 6 movie.jpg 映画画像 7 再利用したい 再利用したい -
ϒϥβଆ • ۭ͍͍ͯΔଓՄೳͳݶΓ࠶ར༻͢Δ • ϖʔδભҠΛލ͍Ͱ࠶ར༻͢Δ αʔόଆ • ࠶ར༻ͷ༗ޮظݶΛઃఆՄೳ • "QBDIF,FFQ"MJWF5JNFPVUʢඵɾσϑΥϧτʣ
• OHJOYLFFQBMJWF@UJNFPVUTʢσϑΥϧτʣ ଓ͕࠶ར༻͞ΕΔ݅ 2026/3/21 #phperkaigi #b 「接続」— パフォーマンスチューニングの最後の一手 18 -
• "QBDIFQSFGPSLϞσϧσϑΥϧτ • .BY3FRVFTU8PSLFST • OHJOYσϑΥϧτ • XPSLFS@DPOOFDUJPOT 8FCαʔόͷ࠷େಉ࣌ଓ 2026/3/21
#phperkaigi #b 「接続」— パフォーマンスチューニングの最後の一手 20 -
લఏ • 17NJOºଓ • ʢλϒด͡ͳ͍ʣ ,FFQ"MJWF5JNFPVUͱಉ࣌ଓͷރׇ KeepAliveTimeout 離脱ユーザーのアイドル接続 60秒
50人 × 6接続 = 300 5秒 約4人 ×6接続 = 24 2026/3/21 #phperkaigi #b 「接続」— パフォーマンスチューニングの最後の一手 21 KeepAliveTimeoutを十分に長くすると MaxRequestWorkers 256 を離脱ユーザーだけで超過 -
࣋ଓଓʹٻΊΔཁ݅ • ϒϥβ • ͋ΒΏΔঢ়گͰ࠶ར༻Ͱ͖ΔΑ͏͘ҡ࣋ͯ͠ཉ͍͠ • αʔό • ඞཁͳଓҡ͍͕࣋ͨ͠ෆཁͳଓ͔ʹΓ͍ͨ ,FFQ"MJWF5JNFPVUͷτϨʔυΦϑ
十分に大きな値 適度に小さな値 接続の再利用 ✅高確率で再利用 ❌同一ページ内に限定 同時接続数 ❌離脱ユーザーも消費 ✅ページロード中に限定 リソース消費 ❌メモリ圧迫・制限到達リスク ✅抑制される 2026/3/21 #phperkaigi #b 「接続」— パフォーマンスチューニングの最後の一手 22 -
$%/ϩʔυόϥϯαʹΑΔղܾ 直接接続 ブラウザ N = ?(予測困難) Webサーバ ෆಛఆଟͷଓ ʢ༧ଌࠔʣ Proxy経由
ブラウザ N = ?(予測困難) Proxyサーバ 設定管理された接続 (予測可能) Webサーバ 2026/3/21 #phperkaigi #b 「接続」— パフォーマンスチューニングの最後の一手 23 Webサーバへの接続を ブラウザを跨いで再利用 -
ϒϥβ͔ΒݟΔͱ • ,FFQ"MJWFଓඇৗʹ࣌ؒҡ࣋͞ΕΔ 8FCαʔό͔ΒݟΔͱ • ,FFQ"MJWFଓదͳλΠϛϯάͰஅ͞ΕΔ ϩʔυόϥϯγϯάΤοδ࠷దԽ͕ෆཁͳ߹Ͱ ϓϩΫγΛಋೖ͢Δཧ༝͕͋Δ ϓϩΫγαʔόͷϝϦοτ 2026/3/21
#phperkaigi #b 「接続」— パフォーマンスチューニングの最後の一手 24 -
• ʮଓʯʹίετ͕͔͔Δ • ࠶ར༻Ͱίετݮ • ʮଓͷҡ࣋ʯίετ͕͔͔Δ • దͳλΠϛϯάͰഁغ͍ͨ͠ • ʮഁغWTҡ࣋ʯͷτϨʔυΦϑΛϓϩΫγͰղফ
͜͜·Ͱͷ·ͱΊ 2026/3/21 #phperkaigi #b 「接続」— パフォーマンスチューニングの最後の一手 25 -
ʮଓʯͷجຊ֓೦ͱ)551 ΞϓϦέʔγϣϯͷʮଓʯ σʔλϕʔεͷʮଓʯ Ωϟογϡͷʮଓʯ ֎෦"1*ͷʮଓʯ
ଓੑೳʹઌཱͭ ΞδΣϯμ 2026/3/21 #phperkaigi #b 「接続」— パフォーマンスチューニングの最後の一手 26 -
$%/-#ͱ8FCαʔόͷؔʹࣅ͍ͯΔ • OHJOY͕શͯͷଓΛड͚͚ • ඞཁͳ͚࣌ͩQIQGQNதܧ • ଓϦΫΤετΛލ͍Ͱ࠶ར༻ ͜ΕʹΑΓ • ϒϥβ͔Βݟͨଓ
ΞϓϦ͔Βݟͨଓ ͱ͍͏ߏ͕Մೳ OHJOY QIQGQN ブラウザ nginx php-fpm HTTP FastCGI 外部 サーバ 2026/3/21 #phperkaigi #b 「接続」— パフォーマンスチューニングの最後の一手 27 -
• ੩తFQPMM /PO#MPDLJOH*0ʹΑΔߴฒྻੑ • ಈతִ͞ΕͨগͷϓϩηεʹΑΔ҆શੑ • OHJOYͷڧΈঢ়گʹԠͯ͡ಈ࡞ϞσϧΛ͍͚Δ OHJOYͷ੩తPSಈతίϯςϯπॲཧ 静的 リクエスト
nginx レスポンス 直接応答 動的 リクエスト nginx php-fpm nginx レスポンス リバースプロクシがFastCGIへ中継 2026/3/21 #phperkaigi #b 「接続」— パフォーマンスチューニングの最後の一手 28 -
˞શͯͷ)551ϦΫΤετʹର͠ʮ0,ʯͱ͚ͩฦ͢8FCαʔόΛܭଌͱಉҰͷϚγϯͰىಈ ͠ʮฒྻ ºճ ສϦΫΤετʯૹ৴ͨ͠ࡍͷϨεϙϯελΠϜ 'BTU$(*ͷʮଓʯίετʁ nginx + php-fpm Apache +
mod_php 倍率 Avg 2.72ms 1.80ms 1.51x Median 3.00ms 2.00ms 1.50x 95pct 3.00ms 2.00ms 1.50x 実測で1msの差。ただし全ての動的レスポンスに確実に積み上がる。 2026/3/21 #phperkaigi #b 「接続」— パフォーマンスチューニングの最後の一手 29 -
$%/ߏͰͷ8FCαʔόͷׂ 責務 CDNなし CDNあり 接続のハンドリング nginx CDN 接続の集約 nginx CDN
バッファリング nginx CDN 静的コンテンツ nginx S3 動的コンテンツ php-fpm or mod_php php-fpm or mod_php nginx + php-fpm ブラウザ CloudFront S3 nginx php-fpm 静的 動的 FastCGI Apache + mod_php ブラウザ CloudFront S3 Apache + mod_php 静的 動的 接続コスト = ゼロ ✓ 2026/3/21 #phperkaigi #b 「接続」— パフォーマンスチューニングの最後の一手 30 -
• OHJOYଓͷʮҡ࣋PSഁغʯΛ࠷దԽ͢Δ • ϒϥβ͔ΒݟͨଓΞϓϦ͔Βݟͨଓ • 'BTU$(*ʮଓʯʹίετ͕͔͔Δ • OHJOYʹΑΔଓ࠷దԽͷখ͞ͳฐ • ʮଓʯͷίετΛผͷϨΠϠʔʹҠৡ͢Δબࢶ
• ΠϯϑϥΛ၆ᛌͰݟΔ͜ͱͷॏཁੑ ͜͜·Ͱͷ·ͱΊ 2026/3/21 #phperkaigi #b 「接続」— パフォーマンスチューニングの最後の一手 31 -
ʮଓʯͷجຊ֓೦ͱ)551 ΞϓϦέʔγϣϯͷʮଓʯ σʔλϕʔεͷʮଓʯ Ωϟογϡͷʮଓʯ ֎෦"1*ͷʮଓʯ
ଓੑೳʹઌཱͭ ΞδΣϯμ 2026/3/21 #phperkaigi #b 「接続」— パフォーマンスチューニングの最後の一手 32 -
5$1ଓཱ֬ 5-4ϋϯυγΣΠΫ ೝূϋϯυγΣΠΫ όοΫΤϯυϓϩηεىಈ • %#ͷϓϩηεཧίετ8FCαʔόΑΓܻҧ͍ʹߴ͍
1)1ͷσϑΥϧτಈ࡞ • ϦΫΤετ͝ͱʹଓΛཱ֬͠ɺऴྃ࣌ʹஅ • όοΫΤϯυϓϩηεىಈͱऴྃΛ܁Γฦ͢ %#ଓͷίετ 2026/3/21 #phperkaigi #b 「接続」— パフォーマンスチューニングの最後の一手 33 -
࣋ଓଓʢ1FSTJTUFOU$POOFDUJPOʣ use Pdo¥Pgsql; $pdo = new Pgsql('pgsql:', options: [ //
持続接続: プロセス毎に接続を維持 Pgsql::ATTR_PERSISTENT ]) ; // Laravel: config/database.php 'pgsql' => [ // ...既存の設定... 'options' => [ Pgsql::ATTR_PERSISTENT => true, ], ], )551ʹ͓͚Δ,FFQ"MJWFͱಉ͡ൃ •ׂΛऴ͑ͨଓΛ࠶ར༻ճҎ߱θϩίετ 2026/3/21 #phperkaigi #b 「接続」— パフォーマンスチューニングの最後の一手 34 -
࣋ଓଓͷϕϯνϚʔΫ ඇ࣋ଓଓ ࣋ଓଓ ഒ ଓ .FEJBO NT NT Y
ଓ Q NT NT Y ΫΤϦ .FEJBO NT NT Y ΫΤϦ Q NT NT Y 接続コストの消滅に加えクエリ性能も向上 ※計測と同一のマシンで稼働するPostgreSQLに対しUNIXドメインソケット経由で接続し SELECT 1 を 10,000回発行。 2026/3/21 #phperkaigi #b 「接続」— パフォーマンスチューニングの最後の一手 35 -
োྫߪೖ࣌ͷ"1*ϦΫΤετࣦഊ ରΛ4&-&$5'0361%"5&ͰϩοΫ ܾࡁ"1*ίʔϧ ˠλΠϜΞτ ϢʔβʔʹจࣦഊΛฦ͠Ϩεϙϯεऴྃ 30--#"$,͞Εͳ͍··ଓ͕࣋ଓ
Ҏ߱ɺಉ͡Λങ͓͏ͱ͢ΔͱશͯλΠϜΞτ ʮ8FCαʔόΛ࠶ىಈͨ͠ΒͬͨʯˠݪҼෆ໌ %#ଓঢ়ଶΛ࣋ͭ ࣋ଓଓͷϦεΫঢ়ଶͷཹ 2026/3/21 #phperkaigi #b 「接続」— パフォーマンスチューニングの最後の一手 36 -
• ηογϣϯมɾҰ࣌ςʔϒϧ • લͷϦΫΤετͷใ͕ผͷϦΫΤετ࿙Ӯ • ϓϦϖΞυεςʔτϝϯτ • BMSFBEZFYJTUTΤϥʔ • קࠂϩοΫ
• ղ์͞ΕͣҎ߱ͷϦΫΤετΛશͯϒϩοΫ ࣋ଓଓΛ҆શʹ͑Δ͔ʮυϥΠόͷ࣮࣍ୈʯ ͦͷଞͷঢ়ଶཹϦεΫ 2026/3/21 #phperkaigi #b 「接続」— パフォーマンスチューニングの最後の一手 37 -
1)1QEP@QHTRMঢ়ଶϦηοτ 1)1 • τϥϯβΫγϣϯ • ✅Ϩεϙϯεऴྃ࣌ʹղ์ • ϓϦϖΞυεςʔτϝϯτ • ✅ແ໊εςʔτϝϯτ҆શ
• ❌໊લ͖εςʔτϝϯτিಥ • ❌্هҎ֎શͯཹ 1)1 • ✅ঢ়ଶશͯϦηοτ 2026/3/21 #phperkaigi #b 「接続」— パフォーマンスチューニングの最後の一手 38 -
%#ଓ1)1ϓϩηε º αʔό • 8FCαʔόͷεέʔϧΞτ͕جຊ • %#ଓεέʔϧΞτͱڞʹ૿͑Δ • %#αʔόεέʔϧΞοϓ͕جຊ •
શαʔό͔Βͷ%#ଓΛͰड͚Δ 8FCαʔόͷεέʔϧΞτ͕ %#ଓރׇΛট͘ϦεΫ εέʔϧಛੑͱ%#ଓ 2026/3/21 #phperkaigi #b 「接続」— パフォーマンスチューニングの最後の一手 39 -
$%/-#ͱಉ͡ʮؒʹϓϩΫγΛڬΉʯύλʔϯ • /ຊͷΞϓϦଓΛ.ຊͷ%#ଓʹूʢ./ʣ ଞݴޠͰ'8ϥΠϒϥϦʹଓϓʔϥʔ͕ଂ • +BWB)JLBSJ$1 • (PEBUBCBTFTRM • 3BJMT"DUJWF3FDPSE
ଟ͘ͷଓϓʔϥʔঢ়ଶཧॳظԽͷػೳΛଂ ଓϓʔϥʔ 2026/3/21 #phperkaigi #b 「接続」— パフォーマンスチューニングの最後の一手 40 -
• ͭͷϓϩηε͕ͭͷϦΫΤετΛॲཧ • ϓϩηεʢʹϦΫΤετʣΛލ͍ͩ࣌Ͱڞ༗ෆՄೳ • 4IBSFE/PUIJOH"SDIJUFDUVSF • Ϩεϙϯεऴྃ࣌ʹશͯΛഁغ͢Δઃܭ͕1)1ͷجຊ ଓϓʔϥʔͰଓίετΛݮ͢Δํ๏ʁ 1)1ʹଓϓʔϥʔ͕ແ͍ʢPSཁΒͳ͍ʣཧ༝
2026/3/21 #phperkaigi #b 「接続」— パフォーマンスチューニングの最後の一手 41 -
࣋ଓଓΛʮͲͷఔ࠶ར༻͢Δ͔ʯબՄೳ • 4FTTJPOΫϥΠΞϯτଓ୯ҐʢσϑΥϧτʣ • ੍ͳ͠ɾޮ • 5SBOTBDUJPOτϥϯβΫγϣϯ୯Ґ ʢਪʣ • ޮߴɾҰ෦ػೳΛར༻ෆՄ
• 4UBUFNFOU42-จ୯Ґʢಛघ༻్ʣ • ࠷ߴޮɾτϥϯβΫγϣϯෆՄ ػೳͱੑೳͷͲͪΒΛ༏ઌ͢Δ͔Ͱબ 1H#PVODFSʢϛυϧΣΞܕʣ 2026/3/21 #phperkaigi #b 「接続」— パフォーマンスチューニングの最後の一手 42 機能 性能 -
• ௨ৗ1H#PVODFSͷ5SBOTBDUJPOϞʔυ૬ • ϐϯཹΊ4FTTJPOϞʔυͷࣗಈΓସ͑ • 4&5קࠂϩοΫͰΞϓϦͱ%#ͷଓ͕ݻఆ͞ΕΔ • ʮঢ়ଶཹϦεΫʯͱશʹରԠ • ΞϓϦଓͷஅͰݻఆ͕ղআ͞ΕΔ
• 3%41SPYZͷଓ࣋ଓ͍͚ͯ͠ͳ͍ʢݻఆղআͰ͖ͳ͍ʣ ಈ࡞ʹԠͯ͡ੑೳ͕ࣗಈతʹมΘΔ 3%41SPYZʢϚωʔδυαʔϏεܕʣ 2026/3/21 #phperkaigi #b 「接続」— パフォーマンスチューニングの最後の一手 43 -
• ʮଓʯͷίετ)551Ҏ্ʹߴ͍ • ࣋ଓଓͰίετΛେ෯ݮ • ʮଓҡ࣋ʯͷίετ)551Ҏ্ʹߴ͍ • 8FCαʔόεέʔϧΞτ ˠଓރׇ ˠଈো
• ଓ͕ঢ়ଶΛ࣋ͭϦεΫ • σʔλͷ࿙Ӯଛࣦɺোʹܨ͕Δ͓ͦΕ • ଓϓʔϥʔͰτϨʔυΦϑΛ͋Δఔղফ • ֎෦ͷϛυϧΣΞ1BB4Λ׆༻ ͜͜·Ͱͷ·ͱΊ 2026/3/21 #phperkaigi #b 「接続」— パフォーマンスチューニングの最後の一手 44 -
ʮଓʯͷجຊ֓೦ͱ)551 ΞϓϦέʔγϣϯͷʮଓʯ σʔλϕʔεͷʮଓʯ Ωϟογϡͷʮଓʯ ֎෦"1*ͷʮଓʯ
ଓੑೳʹઌཱͭ ΞδΣϯμ 2026/3/21 #phperkaigi #b 「接続」— パフォーマンスチューニングの最後の一手 45 -
Ωϟογϡͷ࣋ଓଓ // Memcached: `$persistent_id` を指定 $memcached = new Memcached('接続を識別するID'); $memcached->addServer('localhost',
11211); // Redis: `pconnect()`メソッド $redis = new Redis(); $redis->pconnect('localhost', 6379); // Laravel - Memcached: config/cache.php - 抜粋 'memcached' => [ 'persistent_id' => env('MEMCACHED_PERSISTENT_ID'), ], // Laravel - Redis: config/database.php - 抜粋 'redis' => [ 'options' => [ 'persistent' => env('REDIS_PERSISTENT', false), ], ], )551ɾ%#ͱಉ͡ߟ͑ํ •ଓཱ֬ʹίετ͕͔͔Δ • ˠ࣋ଓଓͰ࠶ར༻͍ͨ͠ )551ɾ%#ͱҟͳΔߟ͑ํ •ಉ࣌ଓฒྻॲཧʹڧ͍ • ˠଓؾʹ͠ͳͯ͘ྑ͍ 2026/3/21 #phperkaigi #b 「接続」— パフォーマンスチューニングの最後の一手 46 -
Ωϟογϡ࣋ଓଓͷϕϯνϚʔΫ 2026/3/21 #phperkaigi #b 「接続」— パフォーマンスチューニングの最後の一手 47 3FEJT ඇ࣋ଓଓ ࣋ଓଓ
ഒ ଓ "WH NT NT Y ଓ .FEJBO NT NT Y ଓ Q NT NT Y .FNDBDIFE ඇ࣋ଓଓ ࣋ଓଓ ഒ (&5"WH NT NT Y (&5.FEJBO NT NT Y (&5Q NT NT Y ※php-memcachedは最初のコマンド実行まで接続を遅延するためGETでベンチマーク(この表はRedis とMemcachedの比較にはならない) -
ଓ͕ঢ়ଶΛ͔࣋ͭʁ 2026/3/21 #phperkaigi #b 「接続」— パフォーマンスチューニングの最後の一手 48 Memcached: 接続は状態を持てない(HTTPと同じ考え方) コマンドは全てアトミックに動作
→ 持続接続を常に安全に利用できる Redis: 接続は状態を持てる—PhpRedisの持続接続は状態を持つ ػೳ ίϚϯυ ཹ ڍಈͱϦεΫ τϥϯβΫγϣϯ .6-5* ͠ͳ͍ ࣋ଓଓϦΫΤετऴྃ࣌ʹڧ੍அ ೝূ "65) ͢Δ ϚϧνςφϯτܕΞϓϦέʔγϣϯͰใ࿙Ӯ ָ؍ϩοΫ 8"5$) ͢Δ σʔλࣦτϥϯβΫγϣϯࣦഊ %#Γସ͑ 4&-&$5/ ͢Δ ϚϧνςφϯτܕΞϓϦέʔγϣϯͰใ࿙Ӯ 1VC4VC 46#4$3*#& ͢Δ શͯͷίϚϯυ͕ࣦഊ DB接続の「状態残留リスク」と同じ構造 -
• 3FEJTͷঢ়ଶཹʮ୯७ͳ,74ʹෆཁͳػೳʯʹىҼ • (&54&5%&-&5&͚ͩͳΒঢ়ଶཹ͠ͳ͍ • ͔͠͠'8ϥΠϒϥϦ͕҉తʹ4&-&$5Λൃߦ͍ͯ͠ͳ͍͔ʁ • ͔͠͠কདྷతʹτϥϯβΫγϣϯ1VC4VCΛΘͳ͍อূ͋Δ͔ʁ • SFEJTSFTFU
Ͱ ࠶ར༻લʹඞͣϦηοτ %#࣋ଓଓͱಉ͡ݪଇ • .FNDBDIFEߏతʹঢ়ଶཹ͕ൃੜ͠ͳ͍ ʮෆཁͳػೳʯͷݟۃΊʮඞཁͳػೳʯͱಉ͘͡Β͍ॏཁ 3FEJTͱ.FNDBDIFEͷ࣋ଓଓͱঢ়ଶཧ 2026/3/21 #phperkaigi #b 「接続」— パフォーマンスチューニングの最後の一手 49 ؍ .FNDBDIFE 3FEJT ଓͷঢ়ଶ εςʔτϨε εςʔτϑϧ ࣋ଓଓ ҆શʹར༻Մೳ खಈͰঢ়ଶϦηοτ ଓͷঢ়ଶཧ ෆཁ %#Γସ͑ͰෳࡶԽ -
• Ωϟογϡͷ࣋ଓଓରޮՌ͕ߴ͍ • ߴසΞΫηε͕લఏ ˠ࣋ଓଓͷޮՌ͕ಛʹେ͖͍ • ฒྻॲཧ͕ಘҙ ˠଓΛؾʹͤͣ࣋ଓଓΛ͑Δ • ҆શੑʮଓ͕ঢ়ଶΛ͔࣋ͭʯͰܾ·Δ
• .FNDBDIFEεςʔτϨε ˠ҆શʹར༻Մೳ • 3FEJTεςʔτϑϧ ˠ։ൃऀ͕ঢ়ଶཧΛߦ͏ ͜͜·Ͱͷ·ͱΊ 2026/3/21 #phperkaigi #b 「接続」— パフォーマンスチューニングの最後の一手 50 -
ʮଓʯͷجຊ֓೦ͱ)551 ΞϓϦέʔγϣϯͷʮଓʯ σʔλϕʔεͷʮଓʯ Ωϟογϡͷʮଓʯ ֎෦"1*ͷʮଓʯ
ଓੑೳʹઌཱͭ ΞδΣϯμ 2026/3/21 #phperkaigi #b 「接続」— パフォーマンスチューニングの最後の一手 51 -
)551ϦΫΤετΛʮૹΔʯ߹ಉ͡ߏ • 5$1ଓཱ֬ ˠ5-4ϋϯυγΣΠΫ ˠϦΫΤετ ˠϨεϙϯε • ଓͷίετɺϦΫΤετΛʮૹΔଆʯʹൃੜ ͢Δʢࣗୡ͕خ͍͠ʣ •
ʮૹΔଆʯͷίετݮʮड͚Δଆʢ֎෦"1*ʣʯ ʹӨڹʢ૬ख͕خ͍͠ʣ ֎෦"1*ͷϦΫΤετͱ,FFQ"MJWF 2026/3/21 #phperkaigi #b 「接続」— パフォーマンスチューニングの最後の一手 52 -
(V[[MFͷଓ࠶ར༻ $client = new ¥GuzzleHttp¥Client([ 'base_uri' => 'https://example.com' ]); //
最初のリクエスト: 新規接続確立 $client->get('/users'); // 同一ドメインへ再度: 接続を再利用 $client->get('/orders'); •DVSM (V[[MF,FFQ"MJWFඪ४ରԠ •ಉ͡ϋϯυϥͳΒଓ࠶ར༻͞ΕΔ •ಉҰϦΫΤετͷΈͰ༗ޮ •ϦΫΤετΛލ͙ͱ࠶ར༻͞Εͳ͍ 2026/3/21 #phperkaigi #b 「接続」— パフォーマンスチューニングの最後の一手 53 -
-BSBWFM)551ϑΝαʔυͷଓ࠶ར༻ use GuzzleHttp¥Client; $client = new Client([ 'base_uri' => 'https://example.com',
]); Http::setClient($client)->get('/users'); Http::setClient($client)->get('/orders'); • ,FFQ"MJWFσϑΥϧτඇରԠ • δϣϒϫʔΧʔͳͲͰ5PPNBOZPQFOGJMFT Λ༠ൃ͢ΔΤοδέʔε MBSBWFMGSBNFXPSL • )551%#ͰͷϦιʔεރׇͱಉ͡ߏͷ • ར༻͢Δ߹(V[[MF$MJFOUΛࣗͰཧ 2026/3/21 #phperkaigi #b 「接続」— パフォーマンスチューニングの最後の一手 54 -
1)1DVSM@TIBSF@JOJU@QFSTJTUFOU // リクエストを跨いで再利用可能 $sh = curl_share_init_persistent('my-pool', [ CURL_LOCK_DATA_DNS, CURL_LOCK_DATA_CONNECT, CURL_LOCK_DATA_SSL_SESSION,
]); $client = new ¥GuzzleHttp¥Client([ 'curl' => [CURLOPT_SHARE => $sh], ]); // ❌このコードは ValueError が発生する $sh = curl_share_init_persistent('my-pool', [ /* 省略 */ CURL_LOCK_DATA_COOKIE, ]); ैདྷͷ՝ • DVSMϋϯυϥͷ࣋ଓଓϦΫΤ ετΛލ͍Ͱ࠶ར༻Ͱ͖ͳ͔ͬͨ 1)1 • ϦΫΤετΛލ͙࠶ར༻͕αϙʔ τ͞Εͨ ঢ়ଶʮ࿙Ӯʯͷରॲ • $PPLJFใΛؚΉ࣋ଓଓϦΫ ΤετΛލ͛ͳ͍ʢ҆શʣ (V[[MFͷରԠঢ়گ • ٞதHV[[MFHV[[MF • ཁ͕࣌ؒແ͍ʢ13ܴʣ 2026/3/21 #phperkaigi #b 「接続」— パフォーマンスチューニングの最後の一手 55 -
• ֎෦"1*ͷ)551ϦΫΤετʹʮଓʯͷίετ • গ͠ͷίʔυमਖ਼Ͱ,FFQ"MJWFରԠՄೳ • ࠶ར༻ʹΑΔϦιʔεރׇϦεΫґવͱͯ͠ଘࡏ • (V[[MFσϑΥϧτରԠͯ͠-BSBWFMରԠ͠ͳ͍ཧ༝ • ঢ়ଶͷ࿙ӮϦεΫQIQࣗମͰղܾ͞Ε͍ͯΔ
• ϦΫΤετΛލ͗$PPLJFΛڞ༗͢ΔͱΫϥογϡ ͜͜·Ͱͷ·ͱΊ 2026/3/21 #phperkaigi #b 「接続」— パフォーマンスチューニングの最後の一手 56 -
ʮଓʯͷجຊ֓೦ͱ)551 ΞϓϦέʔγϣϯͷʮଓʯ σʔλϕʔεͷʮଓʯ Ωϟογϡͷʮଓʯ ֎෦"1*ͷʮଓʯ
ଓੑೳʹઌཱͭ ΞδΣϯμ 2026/3/21 #phperkaigi #b 「接続」— パフォーマンスチューニングの最後の一手 57 -
.BY3FRVFTU8PSLFST1)1ϓϩηε Λݻఆͨ͠߹ ࠷ऴతʹεϧʔϓοτΛܾΊΔͷԿ͔ 2026/3/21 #phperkaigi #b 「接続」— パフォーマンスチューニングの最後の一手 60 PHPプロセス数
平均レスポンスタイム 処理可能な秒間リクエスト 100 1ms 100,000 100 10ms 10,000 100 10,000ms 10 100 100,000ms 1 レスポンスタイムをn倍速くすれば、全体のキャパシティもn倍になる -
NFNPSZ@MJNJU͕దʹઃఆ͞Ε͍ͯΕ • Πϯελϯεຖͷڐ༰ՄೳͳଓݟੵΕΔ • ੑೳཁ݅ΑΓΠϯελϯεͷαΠζͱΛݟੵΕΔ ݟੵΕͳ͍ྫ 1)1ϓϩηεͷݶքΛܾΊΔͷԿ͔ 2026/3/21 #phperkaigi #b
「接続」— パフォーマンスチューニングの最後の一手 61 memory_limit MaxRequestWorkers 必要メモリ 32MB 100 3.2GB 1GB 100 100GB NFNPSZ@MJNJUº.BY3FRVFTU8PSLFST࠷େϝϞϦ༻ྔ # エクスポート機能のため上限緩和 memory_limit = 2G -
ඞཁͳ߹͚ͩ૿ྔ͢Δ // php.iniの設定値を一時的に変更するLaravelミドルウェア class PhpIniSet { public function handle( Request
$request, ¥Closure $next, string $name, string $value ): Response { ini_set($name, $value); return $next($request); } } // 特定のルートだけメモリ上限を引き上げ Route::get('/logs/xlsx', ...) ->middleware( PhpIniSet::class . ':memory_limit,2G’ ); શମগͳ͘ɺඞཁͳ͚࣌ͩଟ͘ •NFNPSZ@MJNJUʮయܕతͳॲཧʯͰ ඞཁͳ •ॏ͍ॲཧݸผʹΦϓτΠϯ Πϯϑϥ୲ऀ •NFNPSZ@MJNJUͰ֓ࢉΛݟੵΔ ΞϓϦ୲ऀ •ॲཧʹԠͯ͡ہॴతʹ૿ྔ 2026/3/21 #phperkaigi #b 「接続」— パフォーマンスチューニングの最後の一手 62 -
ܭࢉਖ਼͔͔ͬͨ͠ʁԾઆʹޡΓͳ͔͔ͬͨʁ ܭଌ͢Δ 2026/3/21 #phperkaigi #b 「接続」— パフォーマンスチューニングの最後の一手 64 サーバ 設定項目
Apache mod_log_config nginx ngx_http_log_module php-fpm access-format Laravel RequestHandledイベント サーバ 設定項目 Apache mod_status nginx stub_status php-fpm pm.status_path レスポンスタイムの計測 ワーカー稼働状況の計測 -
ྫ"QBDIFNPE@TUBUVT $ w3m localhost/server-status Apache Server Status for localhost (via
::1) Server Version: Apache/2.4.66 (Debian) Server MPM: prefork Server Built: 2025-12-05T18:52:34 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ Current Time: Saturday, 14-Mar-2026 14:32:04 JST Restart Time: Thursday, 19-Feb-2026 21:15:04 JST Parent Server Config. Generation: 24 Parent Server MPM Generation: 23 Server uptime: 22 days 17 hours 17 minutes Server load: 0.19 0.25 0.15 Total accesses: 4162932 - Total Traffic: 75.7 GB - Total Duration: 198129127 CPU Usage: u787.2 s354.53 cu29342.1 cs9871.63 - 2.06% CPU load 2.12 requests/sec - 40.5 kB/second - 19.1 kB/request - 47.5936 ms/request 31 requests currently being processed, 0 workers gracefully restarting, 80 idle workers K_W_K_K_W__K_R_K_C_K_W_K__K_W__K_R_C_K_W_K__K_W__C_K_W_K_W__K___K...K___K_______ _____________..._______________..._______ Scoreboard Key: "_" Waiting for Connection, "S" Starting up, "R" Reading Request, "W" Sending Reply, "K" Keepalive (read), "D" DNS Lookup, "C" Closing connection, "L" Logging, "G" Gracefully finishing, "I" Idle cleanup of worker, "." Open slot with no current process ಋೖํ๏ -PBE.PEVMFͰ༗ޮԽ 63-ެ։͠ΞΫηε੍ݶΛઃఆ Ӿཡํ๏ • ެ։63-ΞΫηε • BVUPͰςΩετऔಘՄೳ औಘͰ͖Δใ • ্αʔόىಈ͔Βͷྦྷੵใ • Լݱࡏͷεφοϓγϣοτ • ࠓճ4DPSFCPBSEʹ 2026/3/21 #phperkaigi #b 「接続」— パフォーマンスチューニングの最後の一手 65 -
4DPSFCPBSEͷಡΈํ݈શͳঢ়ଶ ه߸ͷҙຯ • ˙_ ϦΫΤετͪ • ˙R ϦΫΤετड৴த • ˙W
Ϩεϙϯεૹ৴த • ˙K ଓҡ࣋த ݈શͳΞϓϦέʔγϣϯ • リクエストが増えても Wಈ͔ͳ͍ • Kͷ૿ݮਖ਼ৗͳڍಈ • _ˠRˠWˠKˠRˠ ,FFQ"MJWF͕݈શʹαΠΫϧ 2026/3/21 #phperkaigi #b 「接続」— パフォーマンスチューニングの最後の一手 66 -
4DPSFCPBSEͷಡΈํোͱͦͷஹީ 4FOEJOH3FQMZͷ૿ՃʢϨεϙϯελΠϜͷѱԽʣ • τϥϑΟοΫʹԠͨ͡8૿ՃཁҙαΠϯ • 8͚ͩٸ૿͢ΔύλʔϯΫϦςΟΧϧ • εϥογϯάɾഉଞϩοΫɾσουϩοΫͳͲΛٙ͏ 8BJUJOH͕θϩʹ͍ۙͮͨΒةݥ •
, 8 ͕࠷େಉ࣌ଓʹഭ͍ͬͯͳ͍͔֬ೝ • ࠷େಉ࣌ଓ౸ୡো 2026/3/21 #phperkaigi #b 「接続」— パフォーマンスチューニングの最後の一手 67 -
ਖ਼ͱෛͷϑΟʔυόοΫϧʔϓ Ϧτϧͷ๏ଇL = λ × W • L: ฏۉཹʢγεςϜͷଓ૯ʣ •
λ: ౸ணʢ୯Ґ࣌ؒ͋ͨΓͷଓཁٻʣ • W: ฏۉࡏ࣌ؒʢड͔Βྃ·Ͱͷॴཁ࣌ؒʣ Е͕Ұఆͷͱ͖ɺ8Λʹ͢Ε-ʹ Ϧιʔεڝ߹ͷ؇ -͕ݮΔͱϓϩηεؒͷୣ͍߹͍͕ݮΓɿ • ίϯςΩετεΠονͷଟൃ͕ऩ·Δ • ϝϞϦஅยԽ͕؇͞ΕΔ • εϥογϯά੍͕͞ΕΔ ϑΟʔυόοΫϧʔϓ • ࣗݾڧԽϧʔϓʢ-ͷݮগ͕8Λߋʹॖͤ͞Δʣ • ٯσεεύΠϥϧʢʮಥવɺݶքΛ͑Δʯݱʣ 2026/3/21 #phperkaigi #b 「接続」— パフォーマンスチューニングの最後の一手 68 自己強化ループ 逆はデススパイラル Wの短縮 Lの減少 リソース競合の緩和 キューイング遅延↓ -
• ʮଓʯͯ͢ͷϦΫΤετʹඞͣొ͢Δ • ϨεϙϯελΠϜʹର͠ੵΈ্͛ࣜʹ࡞༻͢Δ • ࠷దԽͷجຊݪཧڞ௨ʢ࣋ଓɾղ์ɾதؒͰͷ࠷దԽʣ • ࠷ऴతʹεϧʔϓοτΛܾΊΔͷΞϓϦέʔγϣϯ • ଓͷ࠷దԽඞཁ݅Ͱ͋ΓɺͦͷΛ͑Δʮ࠷ޙͷҰखʯ
• ʮಛఆͷՕॴʯͷνϡʔχϯάґવͱͯ͠ॏཁ • ʮ࠷ޙͷҰखʯ࣍ͷվળαΠΫϧͷ • શମ͕࠷దԽ͞Εͯ৽ͨͳϘτϧωοΫ͕ݦࡏԽ͢Δ͜ͱ • ࣌ʹΛඈͼӽ͑ͯશମΛݟΔࢹ࠲ඞཁ ·ͱΊ 2026/3/21 #phperkaigi #b 「接続」— パフォーマンスチューニングの最後の一手 69