Slide 1

Slide 1 text

PHPer͕ ISUCONͰ΍Δ΂͖ࣄ » at: PHPer Tea Night 2023/11/13 » speaker: uzulla » (ҰԠ)PHPͰຊઓग़৔ܦݧऀ » TSɺGoͰͷग़৔΋ܦݧ͍ͯ͠·͢ » ͳ͓ɺࠓ೥͸GoͰग़·͢ʂʂʂʂ » (਎ۙʹPHPerͷISUCONer͕͍ͳ͍)

Slide 2

Slide 2 text

ϙΠϯτ »8ׂ͸ஈऔΓͰܾ·Δ ΍ͬͨ͜ͱ͕ͳ͍͜ͱ͸౰೔΋Ͱ͖ͳ͍ »തଧ͸౰ͨΒͳ͍ »νʔϜϫʔΫ »ޮՌతͳՕॴ͸ ΄ͱΜͲ PHPؔ܎ͳ͍ »ސ٬͕ʮϕϯνϚʔΧʔʯ

Slide 3

Slide 3 text

ஈऔΓീׂ »యܕతͳύϥϝʔλʔνϡʔχϯά͸༻ҙ͓ͯ͘͠ » ϛυϧ΢ΣΞɺΧʔωϧͷνϡʔχϯά » ISUCONҎ֎Ͱ࢖Θͳ͍Α͏ͳΩϨͨઃఆ » ulimit, write cache, memoryपΓ » πʔϧΠϯετʔϧɺϝϯόʔͷssh伴 alp, pt-query-digest, xhprof(or xdebug), dstat »౰೔άάΓͳ͕Β͸࣌ؒͷແବ(࿅शͰ͸ͳ͍)

Slide 4

Slide 4 text

ૉৼΓ »΍ͬͨ͜ͱ͕ͳ͍͜ͱ͸౰೔΋Ͱ͖ͳ͍ɺ࠷௿Ͱ΋Χϯϖ »N+1ͷղফɺීஈ͔Β΍ͬͯ·͔͢ʁ Ωϟογϡ͸ʁ »APCuͱ͔ͷΠϯετʔϧ΍ར༻ɺීஈ͔Β΍ͬͯ·͔͢ʁ »Rewrite΍Cache control౳Λීஈ͔Βॻ͍ͯ·͔͢ʁ »EXPLAINͷಡΈํ΍ALTERΛ(େମ)͓΅͑ͯ·͔͢ʁ »ෳ਺୆σϓϩΠͷࣗಈԽɺDB΁ͷ઀ଓํ๏ͳͲ

Slide 5

Slide 5 text

തଧ͸౰ͨΒͳ͍ »ʮIndexΛுΕ͹উͯΔʂʯʮΩϟογϡ͢Ε͹উͯΔʂʯ (ͱ͍͏࣌୅΋͋Γ·ͨ͠ɺࠓ͸ඞਢՊ໨) »ܭଌ͠ɺ໰୊ͬΆ͍ՕॴΛͪΌΜͱݟ͚ͭͯɺṌ͚ΔॴΛܾΊΔ »উͪ໨ͷ͋ΔॴʹBet͠ɺ༗ݶ࣌ؒʹ௚͖͠ΕΔ͔͕ISUCON »௚ͯ͠΋ಘ఺͸্͕Βͳ͍͜ͱ͸ଟ͍ʮٸॴΛಡΈղ͘ʯͷ͕೉͍͠

Slide 6

Slide 6 text

ޮՌతͳՕॴ͸ݴޠͱؔ܎͕ͳ͍ »৭ʑͳ࣮ྫrepoΛݟΔͱɺΞϓϦͷίʔυมߋ͸શମͷ਺ˋҐ »N+1ղফͱ͔ɺద੾ͳΩϟογϡઃܭ΍ϛυϧ΢ΣΞνϡʔϯ͕ॏཁ »΄΅ݴޠͷػೳͱؔ܎ͳ͍Օॴ͕ಘ఺ͷ8ׂΛ͖ͨͨग़͢ »N+1ͳͲΛ௵͢ఔ౓ͷPHP஌ࣝ͸ඞཁ »PHPͷษڧ͢ΔΑΓɺSQLɺHTTPDɺKVSͷษڧͨ͠ํ͕ྑ͍ »(ͱ͸͍͑ɺPHP͸JSONͱ͔γϦΞϥΠζ͸ૣ͍͕ɺ ReqຖʹίωΫγϣϯுΓ௚͠ɺγϯάϧτϯ͕ແ͍౳͸͋Δ)

Slide 7

Slide 7 text

νʔϜϫʔΫ »աڈ͠Β΂ͨΒ…ʮಉ྅νʔϜʯͷউ཰͸ߴ͍ʂʂ »ಘҙ෼໺Λ૬ޓʹཧղ͍ͯ͠Δͱ ୲౰ΛܾΊΔɺതଧΛଧͭͷʹ໎Θͳ͍ͷ͔΋ »ଉ͕͍͋ͬͯΔͱɺίϯϑϦΫτͨ͠ͱ͖ͷղফ͕͸΍͍ »য૩ײ͔Βίϛϡχέʔγϣϯ΍৺ཧత҆શੑͷܽ೗ ϋΠίϯςΩετͳίϛϡχέʔγϣϯ(ແݴ͸ूதʁࠔ࿭ʁ)

Slide 8

Slide 8 text

ʮϢʔβʔʯ͸ϕϯνϚʔΧʔ »PASS͢Ε͹ྑ͍ FAIL͢Δͱ0఺ »ʮ͜Εɺී௨͸ڐ͞ΕΔͩΖʯ ʮ͜Εɺී௨͸͋Γ͑ͳ͍ͩΖʯ=> ߟ͑ͳ͍Α͏ʹ »FAIL͠ͳ͍Α͏ʹमਖ਼͢Δ is ೉͍͠ॴ »શ෦͕଎͍ඞཁ͸ͳ͍ɺಘ఺ͷՕॴ͕͋Δ(໌ه͞Ε͍ͯΔࣄ͕ଟ͍) ͦΕҎ֎΋վળ͞Εͳ͍ͱɺෛՙ(=ಘ఺)͕͕͋Βͳ͍͜ͱ͸͋Δ »࠷ॳʹ͔ͬ͠ΓϧʔϧϒοΫΛݟ·͠ΐ͏

Slide 9

Slide 9 text

·ͱΊ »ࠓ͙͢ɺશһͰ࿅शΛ͢Δɻ࣮͸ʮૉৼΓ͢Β೉͍͠ʯࣄ΋ »ʮ୭΋஌Βͳ͍ຐ๏ʯ͸΄΅ͳ͍ɺେମৗࣝͷൣᙝ »্ҐΛૂ͏ͳΒɺ࠷௿ݶʮ౴͑ʯΛΈͳ͕Βɺ લ೥౓༏উऀείΞ͸௒͑ΒΕΔΑ͏ʹ͠Α͏ »ϓϩҎ֎͸ɺϓϩϑΝΠϥ(PHPɺDBɺaccess log…)͕ඞਢ »͜·ΊʹσϓϩΠˍϕϯν͕٢ɺյΕΔͱ௚͢ͷେม »࠶ىಈࢼݧͱɺෳ਺୆ߏ੒ઃఆ͸ૣΊʹ΍Δ

Slide 10

Slide 10 text

͓·͚

Slide 11

Slide 11 text

Կ͕ʮॏ͍ʯͷ͔ʁ »ܭࢉɾregex »ϑΝΠϧͷΦʔϓϯɾΫϩʔζ »γϦΞϥΠζɾσγϦΞϥΠζɾύʔε(json౳ؚ) »ผαʔόͱͷ઀ଓɾ௨৴ɾసૹ »Fork(ผϓϩηεͷىಈ) »ഉଞతॲཧ »ݕࡧ(B-treeΛআ͘)ɺσʔλΛFilterɺScan͢ΔΑ͏ͳ͜ͱ

Slide 12

Slide 12 text

ͷͰ… »ઃఆΛίʔυ(Ωϟογϡ͞ΕΔ)΍؀ڥม਺ʹ͢Δ(ྫ dotenv͸஗͍) »௨৴ͤ͞ͳ͍(Cache ControlɺhttpdͰฦ͢) »ܭࢉ݁Ռ(αϚϦ)౳ΛΩϟογϡ͢Δ »B-treeΛ࢖͏(ϧʔϓͰ୳ࡧ͠ͳ͍ɺindexΛ͔ͭ͏) »RedisΑΓAPCuͳͲΛ͔ͭ͏(γϦΞϥΠζ͕ͳ͍) » (fcgi+redis+pconnectͱ͔΋͋Δ͕) »ϩοΫ͕ෆཁͳΑ͏ʹϩδοΫʹॻ͖׵͑Δ

Slide 13

Slide 13 text

యܕతͳଧͪख »Ұਓ͕؀ڥߏங(λϨɺσϓϩΠɺgit)ͱϓϩϑΝΠϧΛऔΔ ଞೋਓ͕ϧʔϧϒοΫͱίʔυΛಡΈɺ೺Ѳ͢Δ »ͱΓ͋͑ͣṌ͚ΒΕͦ͏ͳՕॴΛ͖ΊɺṌ͚ΔॴΛܾΊΔ »ʮ؆୯ʹ௚ͤΔʯॴ͸ॳख௚͢ʮ؆୯ʹ௚ͤͦ͏ʯ͸ޙͰ΋௚ͤΔ »վળτϥΠɺ݁Ռ͸౎౓౎౓ͱͬͯޮՌΛ֬ೝ͢Δ »গ͢͢͠ΊͨΒཱͪࢭ·ΓɺṌ͚Δ৔ॴΛௐ੔͢Δ ʮ೉ͦ͠͏ͳॴʯΛආ͚ͯ΋େ఍είΞ্͕Βͳ͍ɺ͕Μ͹Ε

Slide 14

Slide 14 text

PHPͷڧΈ »࣮͸1req͋ͨΓͷॲཧ଎౓͸଎͍ɺjsonɺregex͕଎͍ »֤छσʔλΛ͜ͶΔͷ͸ָ(഑ྻ࠷ߴʂʂʂ) »ඇৗʹϓϩϑΝΠϦϯά͕͠΍͍͢ »σόοάίʔυΛಥͬࠐΈ΍͍͢(ҰॠσόοάίʔυೖΕΔͱ͔) »ૉ௚ͳOOPͳͷͰɺ࣮͸ίʔυ͕ಡΈ΍͍͢ (͕ɺٯʹॳظ࣮૷͸νϡʔϯ͢Δ༨஍͕ଟ͗͢Δ͔΋)

Slide 15

Slide 15 text

PHPͷऑΈ »σϓϩΠࣗಈԽ͕एׯෳࡶ »PHPer͸ීஈνϡʔχϯάͤͣɺDB౳͕FW೚ͤͳࣄ͕ଟ͍ »(উͭͳΒ)Ωϟογϡ࣮૷͕໘౗ɾऑ͍ »(উͭͳΒ)γϯάϧτϯ͕ͳ͍ » DB౳ͷ઀ଓΛڞ༗Ͱ͖ͳ͍ ϩΨʔ΍ςϯϓϨʔτͳͲͷॳظԽ͕ຖճ૸Δ »php.ini΍httpdͳͲͰνϡʔχϯάඞਢՕॴ͕ଞݴޠΑΓଟ͍

Slide 16

Slide 16 text

νϡʔϯϨϕϧ௿ »֤छϓϩϑΝΠϦϯά(εϩʔΫΤϦɺॏ͍End pointͷಛఆ) »php.ini(Opcache)ͷௐ੔ɺdump-autoload --optimize »DB indexͷ௥ՃɺWhereͷௐ੔(ͱʹ͔͘index͸ޮ͔ͤΔ) »ϛυϧ΢ΣΞɺOSͷయܕύϥϝʔλνϡʔϯ(ൿ఻ͷλϨ) »Cache Controlɺgzip༗ޮԽͳͲ(࣮ޮՌ͸ݟΔࣄʂ) »3୆ߏ੒ͳͲͷόϥϯεɺϫʔΧʔ਺ͳͲͷνϡʔϯ »֎෦ίϚϯυىಈΛPHPωΠςΟϒʹ

Slide 17

Slide 17 text

νϡʔϯϨϕϧத »ΫΤϦΛݟͯN+1ղফɺLIMIT OFFSETͷվળ »σʔλͷඇਖ਼نԽ »redis΍APCuͳͲͰαϚϦσʔλΩϟογϡ »Pure PHP࣮૷ΛC֦ுͳͲʹมߋ(ྫ:markdownɺredis driver) »Մೳͳ͔͗ΓUnixDomainSocketͷར༻ »DBߏ੒ͷվֵɺSQLͷ׬શॻ͖׵͑

Slide 18

Slide 18 text

νϡʔϯϨϕϧߴ »ϓϦϩʔυ΍ϓϦΩϟογϡɺ(σʔλ)ϓϦϓϩηε »ϫʔΧʔʹΑΔαϚϦੜ੒ɺTTLΛߟྀͨ͠୹ظؒΩϟογϡ »σʔλετΞͷมߋ(Redisࡌͤସ͑౳) »Ҿ਺ͱ͔ͷܕఆٛΛશ෦ফ͢ɺΫϥεΛࣺͯͯ഑ྻԽ »ΞϧΰϦζϜͷվળɾ׆༻ʹΑΔॲཧͷࢬ੾Γ »httpd(or Vanish,etc)౳ɺPHPΑΓલͰॲཧͰ͖Δ͜ͱΛ͢Δ

Slide 19

Slide 19 text

νϡʔϯϨϕϧതଧ »fastcgi_finish_requestͳͲͷීஈ࢖Θͳ͍ॲཧ »mod_php΍php-fpmΛࣺͯΔ »mysqlͳͲͰPersistent઀ଓ༗ޮԽ »ʮϕϯνͷൈ͚݀Λ୳͢ʯ »PHPΛࣺͯΔ

Slide 20

Slide 20 text

ͱ͜ΖͰɺChatGPT(౳)͸໾ཱ͔ͭʁ »ӕΛӕͱݟൈ͚ΔͳΒɺͱͯ΋໾ग़ͭ ӕʹϋϝΒΕΔ͜ͱ͕·Εʹ͋Δ »ChatGPTͷίʔυΛಈ͘ίʔυʹ௚ͤΔఔ౓ʹ஌͕ࣝ͋ΔͳΒ௒༗༻ »ʮ͜ͷ৘ใ͕΄͍͠ʯͱݴ͏ͱ͖͸άάͬͯ୳͢ΑΓૣ͍৔߹͸ଟ͍ »ʮλϨʯͷੜ੒ʹ͸͋·Γ໾ཱͨͳ͍ؾ͕͢Δ (ISUCONͰ࢖ΘΕΔઃఆ͸ۃ୺ա͗ΔͷͰɺҰൠతͰ͸ͳ͍) »ීஈ͔Β࢖͍ͬͯͳ͍ͳΒɺͦ͜·Ͱ͓קΊ͠·ͤΜ

Slide 21

Slide 21 text

ͦͷଞॳ৺ऀ޲͚Ϧιʔε »ʮISUCON λϨʯʮISUCON ༏উ͠·ͨ͠ʯͰάάΕɻ ͨͩ͠ɺಡΉ͚ͩͰͳ͘ɺૉৼΓ͠ɺλϨ͸࢖ͬͯΈΔ͜ͱ »GitHubΛISUCONͰݕࡧͯ͠ΈΑ͏ »https://speakerdeck.com/soudai/web-tuningperformance (soudai) »https://speakerdeck.com/seike460/introduction-to- measurement-to-know-the-application (seike460) »https://slideshare.net/techblogyahoo/mysql-58540246