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

ISUCON6本選の裏話 @ ISUCON6裏話Night

ISUCON6本選の裏話 @ ISUCON6裏話Night

003f59d1b2e3b864c744f8eb21f68e82?s=128

Atsushi Takayama

November 23, 2016
Tweet

More Decks by Atsushi Takayama

Other Decks in Technology

Transcript

  1. ISUCON6ຊબͷཪ࿩ ISUCON6ཪ࿩Night ߴࢁԹ @edvakf

  2. ߨධ͸طʹISUCONެࣜϒϩάͷ΄͏ʹدߘͨ͠ͷ Ͱɺࠓ೔͸ཪ࿩తͳ͜ͱΛ࿩͠·͢

  3. ࣗݾ঺հ ߴࢁԹ @edvakf pixivίϛοΫͱ͍͏αʔϏεͷٕज़੹೚ऀͱ
 ձࣾͷΤϯδχΞશһʹؔΘΔΑ͏ͳ࢓૊Έͮ͘Γ͕ओͳ ͓࢓ࣄ ϓϩάϥϛϯάݴޠ͸ JavaScript, PHP, Ruby,

    Go, Scala ͕ कඋൣғͰ͢ 12݄͔ΒCTOʹब೚͢Δ͜ͱʹͳΓ·ͨ͠
  4. ISUCONͱࣗ෼ ISUCON3͔Βࢀઓ ISUCON5·Ͱຖճຊઓग़৔ ISUCON4Ͱ͸2Ґ

  5. ISUCONग़୊ͷܦҢ ڈ೥ͷISUCONͷ࠙਌ձ΍ϞϦεφΠτͰ941͞Μʹ͓ ༠͍Λड͚ͯ ͸ͯͳ͞ΜͱϐΫγϒͰ༧બɾຊબͷͲͪΒΛ୲౰͢ Δ͔ɺͱ͍͏࿩Λࣾ಺ͷڠྗऀͱ࿩͠߹͍ɺ
 ໰୊ͷύλʔϯΛͦΕͧΕߟ͓͍͑ͯͨ 12݄ʹSongmu͞ΜʹʮͲ͕ͬͪຊબ΍Γ·͠ΐ͏͔ Ͷʁʯͱฉ͍ͨΒ

  6. –Songmu “ͦΓΌ΋͏ϐΫγϒ͞ΜͰ”

  7. ୈҰষ ͓ΘΓ

  8. ୈೋষ ࣾ಺ISUCON

  9. ༧બͱຊઓ ༧બ͸ʮ͜ΕͧISUCONʯͱ͍͏໰୊ ຊબ͸ҙ֎ੑͷ͋Δ໰୊ ͱ͍͏ڞ௨ೝ͕ࣝͳΜͱͳ͋͘Δ
 
 ʮ͜ΕͧISUCONʯͱ͍͏໰୊Λ࡞Βͣʹ͍͖ͳΓຊબ໰ ୊Λग़୊͢Δͷ͸ϋʔυϧ͕ߴ͍ →Α͠ɺࣾ಺ISUCON΍Ζ͏

  10. ࣾ಺ISUCONͷ͢ʍΊ ৽ଔݚमͷ࠷ऴ೔ʹ࣮ࢪ ISUCON༧બʹ͋Γͦ͏ͳ໰୊Λ૝ఆͯ͠ɺ৽ଔ޲͚ͷڭҭత ಺༰Λ੝ΓࠐΜͰ࡞੒ ࣾ಺ISUCONΛެ։ͨ͠Β޿͘࢖ΘΕͨ࿩ http://inside.pixiv.net/entry/2016/09/26/130112 ࢀߟ࣮૷ΛҰ௨Γ࡞ͬͨΓηοτΞοϓํ๏ͳͲΛ͔ͬ͠ Γެ։ͨ͠ߕ൹͕͋ͬͨ

  11. ࣾ಺ISUCONͷڭ܇

  12. ॳظσʔλΛૣ͍ஈ֊Ͱ࡞͓ͬͯ͘ͱḿΔ ࢀߟ࣮૷Λ࡞Γͳ͕ΒϕϯνϚʔΧʔΛฒߦͯ͠ਐΊΒΕ Δ ࢀߟ࣮૷ͷҠ২͕ϥΫʹͳΔ E2Eςετ΋͋Δͱࢀߟ࣮૷͕ඇৗʹḿΔ ࣾ಺ISUCONͰ͸Nightmare.jsͰ࡞੒ ຊબͰ͸ϕϯνϚʔΧʔͷॳظνΣοΫΛE2Eςετ ୅ΘΓʹͨ͠

  13. ΞϓϦέʔγϣϯͷҠ২ίετͷ΄ͱΜͲ͸ςϯϓ ϨʔτͷҠ২… JSON͔͠ѻΘͳ͚Ε͹2೔΋͋Ε͹े෼ ຊબͰ͸HandlebarsͷΑ͏ͳݴޠඇґଘͷςϯϓ ϨʔτΤϯδϯΛ࢖͓͏ͱܾ৺ ReactͷαʔόʔαΠυϨϯμϦϯάΛࣾ಺Ͱ΋ ࢖͍ͬͯͨͷͰ࠾༻

  14. ϕϯνϚʔΧʔ͸ͲΕ͚ͩ࣌ؒΛ࢖ͬͯ΋νΣοΫ Λ׬ᘳʹ͢Δ͜ͱ͸ෆՄೳ Ͳ͔͜Ͱଥڠ͠ͳ͚Ε͹͍͚ͳ͍ ϕϯνϚʔΧʔ͕ڐ͢ݶΓԿ΍ͬͯ΋OKͱ͍͏Ϩ ΪϡϨʔγϣϯʹͤ͟ΔΛಘͳ͍

  15. ϓϩϏδϣχϯάͷ੔උʹҙ֎ͱ͕͔͔࣌ؒΔ ΞϓϦέʔγϣϯɺϕϯνϚʔΧʔɺϙʔλϧαΠτ ຊબ͸docker-composeͰϥΫΛ͠Α͏ͱܾΊͨ ϕϯνϚʔΧʔʢෳ਺୆ʣͱϙʔλϧαΠτͷ௨৴ΛͲ ͏ઃܭ͢Δ͔ શ෦ͷίϯϙʔωϯτ͕͋Δఔ౓׬੒͢Δ·Ͱ์ஔ͕͠ ͕ͪͩɺૣΊʹ΍͓͖͍ͬͯͨͱ͜Ζ ݁ہຊબͰ΋ΪϦΪϦʹͳͬͯ͠·ͬͨͷ͸൓ল

  16. ग़୊ऀ͕༻ҙ͢Δ΋ͷ͸ඇৗʹଟ͍ ໰୊ ࢀߟ࣮૷ ϕϯνϚʔΧʔ ϙʔλϧαΠτ ຊ൪؀ڥͷϓϩϏδϣχϯά ϨΪϡϨʔγϣϯ Φʔϓχϯάಈը

  17. Ҏ্Λ౿·͑ͯɺ 5݄ࠒʹ໰୊ͷςʔϚΛվΊܾͯఆ

  18. ʮ2016೥ͷISUCONͱ͸ ͜͏͋Δ΂͖ʯ

  19. Docker ReactαʔόʔαΠυϨϯμϦϯά ΞϓϦέʔγϣϯ͸JSON͔͠ѻΘͳ͍ ϦΞϧλΠϜ௨৴ C10K Server-Sent Events HTTPSલఏ HTTP/2ʹ͢Δͱ͍͍͜ͱ͋Δ͔΋ʁ

  20. ୈࡾষ ຊબ໰୊ͱpixiv

  21. ຊબ໰୊ͷ͓͞Β͍ ࠷ॳʹϖʔδΛදࣔ͢Δ ͢Δͱ͖͸ɺNodeJSͰϨ ϯμϦϯά͞ΕͨHTMLΛ ϩʔυ͢Δ ͦΕҎ߱͸APIͱ௚઀΍Γ ͱΓ

  22. pixiv Sketch

  23. ຊબ໰୊ͷϞσϧ Web൛͸ReactͷϑϩϯτΤϯυͰαʔόʔαΠυϨ ϯμϦϯά όοΫΤϯυAPI͸Rails ಉ͡APIΛεϚϗΞϓϦ͔Β΋࢖͏ NodeJSͷϑϩϯτΤϯυ͸εϚϗΞϓϦͳͲͱಉ ͡Α͏ͳ1ͭͷΫϥΠΞϯτɺͱ͍͏Ґஔ͚ͮ

  24. AIʹഃ౗͞ΕΔ12೔ؒ ʰഃ౗গঁʱ

  25. WebSocketαʔόʔ ࠓ೥ͷ8݄ͱ9݄ʹظؒݶఆاըͰߏங αʔόʔ͸Java (Spark) ࠷େ1ສਓఔ౓͕ಉ࣌ར༻ ͜͜Ͱಘͨಉ࣌઀ଓ਺·ΘΓͷϊ΢ϋ΢Λຊબ໰୊ ʹ΋ϑΟʔυόοΫ

  26. ୈ࢛ষ ίωΫγϣϯΛେྔʹுΔ࿩

  27. C10KʙC100K 1ͭͷαʔόʔͰTCPίωΫγϣϯΛେྔʹड͚෇͚ΔͨΊʹ ͸ɺΧʔωϧύϥϝʔλΛద੾ʹ͢Δඞཁ͕͋Δ net.ipv4.tcp_max_orphans, net.core.somaxconn, net.ipv4.ip_local_port_range, fs.file-max ͦΕͱ͸ผʹɺ1ͭͷΫϥΠΞϯτ͸1ͭͷαʔόʔʹର͠ɺ 65535ίωΫγϣϯ·Ͱ͔͠ಉ࣌઀ଓͰ͖ͳ͍ ͭ·Γɺ100KίωΫγϣϯΛ௒͚͑ͨΕ͹ෳ਺୆ͷαʔόʔ

    ͔ΒϕϯνϚʔΫΛ͔͚ͳ͚Ε͹͍͚ͳ͍
  28. ϘπҊ1 Azure FunctionsͰαʔόʔϨε෼ࢄϕϯνϚʔΧʔ ಉ͡Function͕Ұ౓ʹ6ݸ͔࣮͠ߦͰ͖ͳ͍ʢଞ͸଴ ͨ͞ΕΔʣ໰୊ΛղܾͰ͖ͳ͔ͬͨͷͰෆ࠾༻ HTTPΤϯυϙΠϯτΛॻ্͘Ͱ͸AWS LambdaΑΓ γϯϓϧͰྑ͍ Dropbox͔ΒσϓϩΠͰ͖Δศརػೳʢʁʣ

  29. ϘπҊ2 ਌ϕϯνϚʔΧʔ͕ผͷαʔόʔͷࢠϕϯνϚʔΧʔ Λ࣮ߦ͠ɺࢠϕϯνϚʔΧʔ͕ड͚औͬͨϩάΛ਌ ϕϯνϚʔΧʔ͕ूܭ͢Δ ϕϯνϚʔΧʔ͕ෳࡶʹͳΓ͗ͯ͢༧ظ͠ͳ͍ͱ͜ ΖͰࣦഊ͢Δ֬཰͕૿͑ΔͷͰ٫Լ

  30. ࠾༻Ҋ nginxͷstreamϞδϡʔϧͰL4ϑΥϫʔυϓϩΩγ HTTPSͳͷͰTCPϨϕϧͰϓϩΩγ ͜ͷޙ@catatsuy͕ৄ͘͠࿩͠·͢

  31. ෛՙΛ͔͚Δ ࠷ॳʹNຊͷίωΫγϣϯΛுΔ 5ඵޙʹ৽ͨʹ N - (a + b) ຊͷ઀ଓΛࢼΈΔ
 a:

    ·ཱͩ֬͞Ε͍ͯͳ͍ίωΫγϣϯ਺
 b: طʹ੾அࡁΈͷίωΫγϣϯ਺
 N = N + N - (a + b) ͱ͢Δ ҎԼϧʔϓ ʢ͜Εͩͱݱࡏཱ͍֬ͯ͠ΔίωΫγϣϯ਺ͱಉ͡਺ͷίωΫγϣϯΛ5ඵ ͝ͱʹషΖ͏ͱͯ͠ɺͲΕ͚ͩ࠷దԽͯ͠΋Too many connections͕ग़Δͱ ຊબޙʹࢦఠ͞Εͨʣ
  32. ୈޒষ ϕϯνϚʔΧʔΛ2ճ࡞ͬͨ࿩

  33. ͜Ε·ͰͷϕϯνϚʔΧʔ ISUCON4: Go, ISUCON5: Java ͍ͣΕ΋࠶ར༻Λߟ͑ΒΕ͍ͯͨΑ͏Ͱ͕͢ɺϑϧεΫϥονͨ͘͠ ͳΔͷ͕ϓϩάϥϚʔͷਓ৘ ISUCON6: Go ࣾ಺ISUCONͷͱ͖ʹcatatsuy͕࡞ͬͨ΋ͷ͕ϕʔε

    ISUCON6༧બ΋͜ͷ࣮૷Λ౿ऻ͍ͯͨ͠ ࣾ಺ISUCONͷϕϯνϚʔΧʔ͸͚ͬ͜͏ྑ͔͕ͬͨɺ͍͔ͭ͘ؾʹ ೖΒͳ͍ͱ͜Ζ͕͋ͬͨͷͰɺ࣮͸ຊબʹ޲͚ͯ·ͨ࠶࣮૷ͨ͠
  34. ڈ೥ʹ฿ͬͨ͜ͱ ॳظνΣοΫͰΤϥʔʹͳΕ͹ͦΕҎ্࣮ߦ͠ͳ͍ ͜ΕʹΑΓΩϡʔ͕٧·Δ͜ͱΛ͋Δఔ౓ආ͚ΒΕΔ ιϑτλΠϜΞ΢τͱϋʔυλΠϜΞ΢τ ιϑτλΠϜΞ΢τ: ϕϯνϚʔΧʔͷϓϩηε͕ࣗ෼Ͱऴྃ͢Δ΂͖࣌ؒ ϋʔυλΠϜΞ΢τ: ͦΕΑΓ͋Δఔ౓௕͍࣮࣌ؒߦ͞Ε͍ͯΔͱɺϕϯν ϚʔΧʔΛىಈ͢Δϓϩηε͕ҟৗͱ൑அͯ͠ϕϯνϚʔΧʔϓϩηεΛ ࡴ͢

    workloadύϥϝʔλͳ͠
  35. ৽͍͠ཁૉ Ճ఺͸͋ͬͯ΋ݮ఺͸ͳ͍ ࣾ಺ISUCONͰ͸ΤϥʔͰݮ఺্ͨ͠Ͱɺ0఺ҎԼ͸0఺ʹ੾Γ্͍͛ͯͨ ͜ΕͩͱࠓͲΕ͚ͩϚΠφεͳͷ͔͕෼͔Βͳͯ͘ํ਑ཱ͕ͯʹ͍͘ Τϥʔ͕ग़ͨΒϕϯνϚʔΧʔͷฒྻ౓ΛԼ͛Δ ॳظ࣮૷ͱ࠷దԽ͞Ε࣮ͨ૷ͷ྆ํͰ໰୊ͳ͘ಈ͘ϕϯνϚʔΧʔΛ໨ࢦ ͨ͠ ʢ͕ɺ࠷దԽ͢Δͱεϧʔϓοτ্͕͕ͬͯٯʹΤϥʔ͕૿͑Δɺͱ͍͏ έʔε͕͋Δͱͷࢦఠʣ

  36. ϕϯνϚʔΧʔͷ։ൃ ϕϯνϚʔΧʔ͸ಠཱͨ͠ίϚϯυͱ࣮ͯ͠ߦͰ͖Δͱ ։ൃ͕ϥΫ ඪ४ग़ྗʹ͸είΞ΍ϝοηʔδ౳ͷೖͬͨJSONΛग़͢ ࣮ߦதͷϩάͳͲ͸ඪ४Τϥʔग़ྗʹग़͢͜ͱͰɺ࣮ߦ ऴྃΛ଴ͨͳͯ͘΋༷ࢠ͕Θ͔ΔͷͰḿΔ ࣾ಺ISUCONͷͱ͖͸͜Ε͕ແ͔ͬͨͷͰਏ͔ͬͨ

  37. GoͰϕϯνϚʔΧʔΛॻ͘ ʢҰॠVert.xΛࢼ͕ͨ͠ɺJavaಛ༗ͷSSLূ໌ॻͷѻ͍ʹϋϚͬͯ ࠳ંʣ GoͩͱIOॲཧ΍ผεϨουॲཧΛߦ͏ͨͼʹϓϩάϥϜΛෳࡶʹ ͠ͳͯ͘΋ྑ͍ͷͰγφϦΦ্͕͔ΒԼʹҰ௚ઢʹॻ͚Δ γφϦΦ͝ͱʹฒྻ౓Λࢦఆ͢Δॲཧ͕εοΩϦॻ͚ͨͷͰؾʹ ೖ͍ͬͯΔʢ࣍ͷϖʔδʣ ຊબͰ͸γφϦΦ͝ͱʹཧ࿦্ͷ࠷େεϧʔϓοτΛઃఆͯ͠ ͍ͨ

  38. ch1 := makeChan(10) ch2 := makeChan(2) timeoutCh := time.After(60* time.Second)

    L: for { select { case <-ch1: go func() { scenario.LoadIndexPage(origins) time.Sleep(500 * time.Millisecond) ch1 <- struct{}{} }() case <-ch2: go func() { scenario.DrawOnRandomRoom(origins) time.Sleep(500 * time.Millisecond) ch2 <- struct{}{} }() case <-timeoutCh: break L } }
  39. ୈࣣষ ϙʔλϧαΠτ

  40. ༧બͷϙʔλϧαΠτΛϑΥʔΫ ༧બͷॳ೔ʹώϚͩͬͨͷͰɺάϥϑΛ࣮૷͕ͨ͠ɺॳ೔ͱ2೔ ໨ͰڍಈΛม͑ͳ͍΄͏͕͍͍ͩΖ͏ͱ͍͏͜ͱͰ͓ଂೖΓʹ ͞ΒʹϩάΠϯ͍ͯ͠ͳ͍ਓʹ΋άϥϑΛݟΒΕΔΑ͏ʹͨ͠ ্ͰຊબͷϙʔλϧαΠτͱͨ͠ ಺෦ͷσʔλߏ଄΋େϦϑΝΫλϦϯά ϕϯνϚʔΧʔͷඪ४Τϥʔग़ྗΛ֨ೲ͢ΔΧϥϜΛ࡞ͬͯ ؅ཧը໘ͰݟΒΕΔΑ͏ʹͨ͠Γ ڝٕऀ޲͚ϝοηʔδΛ؅ཧը໘͔Βग़ͤΔΑ͏ʹͨ͠Γ

  41. ୈീষ ຊ൪؀ڥͷ࿩

  42. ਖ਼௚ɺຊ൪؀ڥ·ΘΓ͸ matsuu͞Μʹ೚͖ͤͬΓͰ͕ͨ͠ɺ Ұͭݴ͑Δ͜ͱ͸

  43. ෳ਺୆ߏ੒Ͱ͋Δ ඞવੑ͕ແ͍

  44. Ϋϥ΢υͩͱ8ίΞx1୆ͱ2ίΞx4୆ͷ஋ஈ͕ಉ͡ ISUCONͷΑ͏ͳ୹ظͰύϑΥʔϚϯεΛग़͞ͳ͍ͱ ͍͚ͳ͍؀ڥʹ͓͍ͯɺෳ਺୆ߏ੒Λબ୒͢Δཧ༝ ͕ແ͍ ຊબͰ͸ΦʔϓχϯάεϥΠυʹϦΞϦςΟΛ࣋ͨͤ ΔͨΊʹɺʮ߹ܭίΞ਺੍ݶΛ૿΍͢·Ͱͷਏ๊ͩʯ ͱ͍͏͍ۤ͠ઃఆʹ͕ͨ͠… ࠓޙͲ͏͢Δ΂͖ͳͷ͔

  45. ࠷ऴষ ग़୊ऴΘͬͯΈͯ

  46. ৭ʑߟ͑ͯࢼߦࡨޡ͠·͕ͨ͠ɺຊબʹ੝ΓࠐΊͨͷ͸͘͝Ұ෦ 1೥ؒ୭ʹ΋ݴ͑ͳ͍ͷ͕͍ۤ͠ͱ͜Ζ ৭Μͳօ͞Μʹॿ͚ΒΕͯग़୊Ͱ͖·ͨ͠ ͜ͷ͙Β͍ͷਓ਺ͰӡӦ͠ͳ͚Ε͹৺͕ંΕ͍͔ͯͨ΋… ࠷ऴతʹશ෦ࣗ෼Ͱ΍Γͨ͘ͳͬͯ͠·͏ѱ͍บ͕w ׬ᘳΛ໨ࢦͤ͹ͲΕ͚ͩͰ΋΍Δ͜ͱ͕͋ΔͷͰɺ࣌ؒ͸͍͘Β͋ͬ ͯ΋଍Γͳ͍ ৭ʑ٧ΊࠐΈ͍ͨཉ΍ɺείΞʹ͕ࠩग़ͳ͍Μ͡Όͳ͍͔ͱ͍͏ڪා Λ཈੍͢Δͷ͕ͱͯ΋೉͍͠