WebシステムのパフォーマンスとGo

F184d9a69a53293895f36730ca0b8289?s=47 karupanerura
November 01, 2019

 WebシステムのパフォーマンスとGo

DeNA.go #3

F184d9a69a53293895f36730ca0b8289?s=128

karupanerura

November 01, 2019
Tweet

Transcript

  1. WebγεςϜͷ ύϑΥʔϚϯεͱGo DeNA.go #3 id:karupaneura

  2. id:karupanerura • ιϑτ΢ΣΞΤϯδχΞ @ DeNA, Co,. LTD. • ͓࢓ࣄ: ϓϥοτϑΥʔϜ։ൃ

    (Perl/Go/Java/etc..) • ISUCON8: ༧બग़୊νʔϜ (࡞໰ɺϕϯνϚʔΧʔ) • αϚʔΠϯλʔϯγοϓ2019: ΤϯδχΞ޲͚ίʔε։ൃ • ୅දཧࣄ @ Japan Perl Association
  3. Goal

  4. WebγεςϜʹ͓͚Δຊ౰ͷGoͷڧΈ Λߟ͑௚ͯ͠΋Β͏

  5. ໰୊ҙࣝ • ʮͱΓ͋͑ͣGoͰॻ͍͓͚ͯ͹଎͍ΜͰ͠ΐʁʯ • ͍͘ΒLLͱൺ΂ͯϕϯνϚʔΫ͕༏ल͔ͩΒͱ͍ͬͯͦΓΌ… • ʮͰ΋ISUCONͰ༧બ௨աͯ͠ΔͷGoͷνʔϜ͹͔Γ͡ΌΜʯ • ༗རͳଆ໘͸ͨ͘͞Μ͋Δ͚Ͳ…είΞ͕௿͍νʔϜ΋…

  6. ݱ࣮ΛݟΑ͏

  7. ໰୊ͱ͔ͬ͠Γ޲͖߹͓͏

  8. ࠓճ࿩͢͜ͱ • WebγεςϜʹ͓͚ΔύϑΥʔϚϯεͱ͸ͳʹ͔ • Ͳ͏͍ͬͨ΋ͷ͕ϘτϧωοΫʹͳΔͷ͔ • ͦͷͨΊʹGoͷػೳΛͲͷΑ͏ʹ׆༻͢Δͱྑ͍ͷ͔

  9. ࠓճ࿩͞ͳ͍͜ͱ • DeNAαϚʔΠϯλʔϯγοϓͷৄࡉ • ͲͷΑ͏ʹܭଌͯ͠ϘτϧωοΫΛൃݟ͢ΔͱΑ͍͔

  10. ͦ΋ͦ΋ύϑΥʔϚϯεͬͯͳΜ͚ͩͬʁ

  11. WebγεςϜʹ͓͚Δཧ૝తύϑΥʔϚϯε • γεςϜશମͰߟ͑ͨͱ͖... • ୯Ґ࣌ؒ౰ͨΓʹͨ͘͞ΜͷϦΫΤετΛॲཧͰ͖Δ • ಉ࣌ʹෳ਺ͷϦΫΤετΛޮ཰Α͘ॲཧͰ͖Δ • ϦΫΤετ୯ҐͰඞཁͱ͢ΔϦιʔε͕গͳ͘ࡁΉ •

    ͋·ΓແବʹϦιʔεΛফඅ͠ͳ͍
  12. ҰํͰݱ࣮ͷγεςϜͷଟ͘͸ ཧ૝తͳύϑΥʔϚϯεͰ͸ͳ͍

  13. ͳͥύϑΥʔϚϯε͸௿Լ͢Δ͔ • γεςϜશମͰߟ͑ͨͱ͖ʹ... • ୯Ґ࣌ؒ౰ͨΓʹͨ͘͞ΜͷϦΫΤετΛॲཧͰ͖ͳ͍ • ಉ࣌ʹෳ਺ͷϦΫΤετΛॲཧ͢Δޮ཰͕ѱ͍ • ϦΫΤετ୯ҐͰඞཁͱ͢ΔϦιʔε͕ଟ͍ •

    ແବʹϦιʔεΛফඅͯ͠͠·͏
  14. ύϑΥʔϚϯεͷ௿ԼཁҼΛഉআ͢Ε͹ ύϑΥʔϚϯε͸޲্Ͱ͖Δ

  15. ύϑΥʔϚϯεͷ௿ԼཁҼΛഉআ͢Ε͹ ύϑΥʔϚϯε͸޲্Ͱ͖Δ γεςϜશମͷϘτϧωοΫʹ஫໨͢Δ΂͖

  16. ۩ମྫΛҎͯߟ͑ͯΈΔ

  17. DeNA αϚʔΠϯλʔϯγοϓ2019 ΤϯδχΞίʔε

  18. ՝୊: ΞϓϦέʔγϣϯΛ͍͍ײ͡ʹͤΑ (͍͍ײ͡ʹ͸ύϑΥʔϚϯε΋ؚ·ΕΔ)

  19. ΞϓϦέʔγϣϯ঺հ (demo)

  20. ύϑΥʔϚϯεཁ݅ ʮ֨҆εϚϗͷൃചΛه೦͠CMʹग़ԋதͷਓؾܳਓ͕ϦΞϧλ ΠϜͰ࣭໰Λड͚෇͚Δઐ໳νϟϯωϧΛ։ઃ͠·͢ɻʯ ͜͜·Ͱ଱͑ΒΕΕ͹ޚͷࣈɺഒͰ΋େৎ෉ͳΒ҆຾Մೳɿ • 5000ൃݴ/ඵ (x2: 10000ൃݴ/ඵ) • 5ສਓͷಉ࣌઀ଓ

    (10ສಉ࣌઀ଓ)
  21. γεςϜߏ੒ਤ • EC2 1୆ • AppͱDBಉډ • ALBͰTLSΛॲཧ • S3/Cloud

    Frontະ࢖༻
  22. ύϑΥʔϚϯεվળͷྲྀΕ for { • ܭଌ • ϘτϧωοΫΛಛఆ • ϘτϧωοΫΛղফ }

  23. ύϑΥʔϚϯεվળͷྲྀΕ for { • ܭଌ • ϘτϧωοΫΛಛఆ • ϘτϧωοΫΛղফɹˡɹࠓճ͸͜͜ʹ஫໨ }

  24. ࣮ࡍͷύϑΥʔϚϯεվળ

  25. վળޙͷγεςϜߏ੒ਤ • App/DB෼཭ • S3/Cloud Front׆༻ • ΄͔MySQLνϡʔχϯά౳

  26. ൃݴ͕ଟ͘ͳΔ໰୊΁ͷରࡦ

  27. ൃݴ͕ଟ͘ͳΔ໰୊΁ͷରࡦ • νϟοταʔϏεͷൃݴ͕ଟ͍ͱͲ͏ͳΔ͔ • DBͷinsert͕٧·Δ (MySQLͷνϡʔχϯάͰ΋Ұఆվળ͢Δ) • insert͕ͳͥ٧·Δ͔ • DBͷϩοΫΛಉ࣌ଟൃతʹऔΔ͜ͱʹͳΔ͔Β

  28. insertͷϩοΫڝ߹ʹͲ͏ରॲ͢Δ͔ • insert͸DBͷϩοΫΛऔΔ͜ͱʹͳΔ • ϩοΫΛऔΔػձΛ΁Β͢͜ͱʹΑͬͯϩοΫڝ߹ΛݮΒͤΔ • ෳ਺ͷൃݴΛ·ͱΊͯinsert͢Δͱ... • 1ճͷϩοΫͰෳ਺ͷൃݴ͕insertͰ͖͓ͯಘ

  29. insertΛbufferingͯ͠·ͱΊͯ΍Δ • ൃݴΛόοϑΝϦϯάͯ͠insert͢Δworker goroutineΛ࡞੒ • ϦΫΤετΛॲཧ͢Δgoroutine͔Βchannelܦ༝Ͱ౤͛Δ • channelͰinsertͷ݁ՌΛड͚औΔ • worker͸buffer͕Ұఆ݅਺ཷ·ͬͨͱ͖͔ҰఆͷintervalͰॲཧ

  30. ࣮ࡍͷίʔυ • ʢDBνϡʔχϯά͚ͩͰ໰୊Λղফͯ͠͠·ͬͨͷͰະ࣮૷ʣ • DeNA.goͷͨΊʹॻ͖ԼΖͦ͏ͱࢥ͚ͬͨͲؒʹ߹Θͳ͔ͬͨ

  31. ಉ࣌઀ଓ਺͕ଟ͘ͳΔ໰୊΁ͷରࡦ

  32. ಉ࣌઀ଓ਺͕ଟ͘ͳΔͱ • ൃݴͷऔಘ͕ଟ͘ͳΔ • ࠩ෼͚ͩऔಘ͍ͨ͠ • ͔͠͠৽ணΛpolling͢Δͱൃݴͷগͳ͍νϟϯωϧ͕ਏ͍ • ʢॳظ࣮૷͸શൃݴΛऔΔAPIΛpollingͯ͠Δʣ

  33. Server Sent Events • ҰੲલͷComet͕࢓༷Λ੔ཧͯ͠ਖ਼نԽ͞Ε·ͨ͠తͳ΍ͭ • WebSocketΑΓѻ͍͕؆୯ • αʔόʔͱΫϥΠΞϯτͰίωΫγϣϯΛషΓଓ͚Δ •

    αʔόʔ͔ΒΫϥΠΞϯτʹσʔλΛpushͰ͖Δ (ٯ͸ෆՄ)
  34. DBʹϦΫΤετΛඈ͹͞ͳ͍ • ͖ͬ͞ͷ΍ͭͱಉ͡ཁྖͰworker͕࠷৽ͷൃݴΛbuffering͢Δ • DB΁͸worker͚͕ͩpollingͯ͠bufferΛߋ৽͍ͯ͘͠ • client͝ͱʹ࠷ޙͷൃݴΛอ͓͍࣋ͯͯͦ͠ΕҎ߱ͷ෺Λ௨஌ • ௨஌͞Εͨ΋ͷΛServer Sent

    EventsͰclientʹૹΔ
  35. ࣮ࡍͷίʔυ (worker goroutine)

  36. ࣮ࡍͷίʔυ (worker goroutine)

  37. ࣮ࡍͷίʔυ (worker goroutine)

  38. ࣮ࡍͷίʔυ (http handler)

  39. ͦͷଞ

  40. sync.Pool • ϦΫΤετͷbytes.BufferͳͲΛৗʹ࡞ΔͱGC͕ਏ͍ • sync.PoolΛ࢖͏ͱgoroutine͝ͱʹڝ߹͠ͳ͍Pool͕࡞ΕΔ • ϝϞϦޮ཰͸ྑ͍͕ϝϞϦ͸ফඅ͍ͯ͘͠ͷͰѻ͍ʹ͸஫ҙ

  41. encoding/json • ϨεϙϯεΛ࡞Δͷʹඞͣ͠΋ͦΕͱಉαΠζͷόοϑΝΛ࡞ Δඞཁ͸ͳ͍ • ࡞ͬͨͿΜ͔Βૹ͍͚ͬͯ͹Α͍ • ͨͩ͠ (*json.Encoder).Write ͸్தͰerrorΛฦ͠ࢭ·Δ͜ͱ

    ͕͋Δ • ਖ਼͘͠ϨεϙϯεΛฦͨ͢Ίʹ͸buffer͸ඞཁ
  42. io • sync.PoolͰอ࣋ͨ͠bytes.BufferΛhttp.ResponseWriter΁ • bytes.Buffer͸io.WriterToΛ࣮૷͍ͯ͠ΔͷͰWriteToͰ͖Δ • bytes.BufferͷWriteTo͸bytes.Bufferͷposition͚ͩม͍͑ͯ ͖ޮ཰Α͘WriteͰ͖Δ • io.CopyBufferͳͲ΋ศར

  43. database/sql • σϑΥϧτͰDBͱͷ઀ଓΛόοϑΝϦϯάͯ͘͠ΕΔ • SetMaxIdleConns/SetMaxOpenConns/SetConnMaxLifetime • ࣮ࡍͷن໛ʹ͋Θͤͯௐ੔͢Δͱ઀ଓ͕࠷దԽͰ͖Δ • SetMaxIdleConnsͷσϑΥϧτ͸2

  44. ·ͱΊ

  45. ·ͱΊ • Goʹ͚ͨͩ͠Ͱ͸଎͘ͳΒͳ͍ͷͰϦιʔεΛޮ཰Α͘࢖͓͏ • ಛʹϘτϧωοΫʹͳΓ΍͍͢Ϧιʔεʹ஫ҙ • ༨༟͕͋ΔϦιʔεΛ׆༻ͯ͠޻෉͠Α͏ • جຊػೳ΍io, syncͳͲศརͳඪ४ύοέʔδΛ·ͣ׆༻͠Α͏

    • ݶΓ͋ΔϦιʔεΛޮ཰Α͘׆༻͢Δϊ΢ϋ΢ͷๅݿ