PHPerが ISUCONでやるべき事
by
uzulla
×
Copy
Open
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
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ͱ͔ͷΠϯετʔϧར༻ɺීஈ͔Βͬͯ·͔͢ʁ »RewriteCache 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ͷษڧͨ͠ํ͕ྑ͍ »(ͱ͍͑ɺPHPJSONͱ͔γϦΞϥΠζૣ͍͕ɺ 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.inihttpdͳͲͰνϡʔχϯάඞਢՕॴ͕ଞݴޠΑΓଟ͍
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ͷվળ »σʔλͷඇਖ਼نԽ »redisAPCuͳͲͰαϚϦσʔλΩϟογϡ »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_phpphp-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