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

Golang @ISUCON

Golang @ISUCON

GoCon 2014 Autmun

y_matsuwitter

November 30, 2014
Tweet

More Decks by y_matsuwitter

Other Decks in Programming

Transcript

  1. Golang @ISUCON
    y_matsuwitter

    View Slide

  2. [email protected]
    Gunosy inc., ࣥߦ໾һ
    !
    Goྺ1೥ऑ͘Β͍
    !
    όϥϯεϘʔϧਖ਼࠲ͷਓ

    View Slide

  3. ීஈͷۀ຿
    GoʹΑΔAPIαʔόߏங (2014.3~)
    iOS/AndroidͷΞϓϦ։ൃ
    Django/RailsʹΑΔWebApp։ൃ

    View Slide

  4. ʊਓਓਓਓਓਓਓਓਓਓਓਓਓʊ
    ʼɹGolangΤϯδχΞืूதɹʻ
    ʉY^Y^Y^Y^Y^Y^Y^Y^Y^Yʉ

    View Slide

  5. ࠓ೔ͷ࿩
    ॳΊͯͷISUCONΛGolangͰઓͬͯΈͨ࿩
    ※GolangҎ֎ͷ࿩͸͠·ͤΜ
    Ґͱத్൒୺ͳ݁ՌͰ͕ͨ͠ʜ

    View Slide

  6. ISUCONͱ͸
    Iikanjini Speed Up CONtest
    !
    8࣌ؒͰ༩͑ΒΕͨWebAppΛग़དྷΔݶΓߴ
    ଎Խ͢Δίϯςετ

    View Slide

  7. ༧બ
    αʔό: 1୆
    େ఍͸MySQLΛDB
    ࠓ೥͸ۜߦͷϩάΠϯϖʔδ͕୊ࡐͰͨ͠

    View Slide

  8. ܾউ
    αʔό: 3~4୆
    ը૾ॲཧ΍ಈըͷ഑৴ͳͲ͋Δఔ౓ෛՙͷߴ
    ͍ॲཧΛؚΉWebApp
    ࠓ೥͸ಈը޿ࠂͷ഑৴αʔόͰͨ͠

    View Slide

  9. ߴ଎ͳWebαʔόͷͨΊʹ
    ϦιʔεΛ࢖͍੾Δ
    CPU … Encode/decode, ը૾ॲཧͳͲ
    Memory … ϓϩηε্ͷσʔλྔ
    Data Transfer … αʔόؒɺαʔόΫϥΠΞϯτؒͷ૯௨৴ྔ
    !
    ͦͷ্Ͱద੾ͳॲཧʹϦιʔεΛׂΓ౰ͯΔ

    View Slide

  10. ݴޠੑೳ͸
    ܾఆతͳࠩʹ͸ͳΒͳ͍

    View Slide

  11. Why Go?
    վળͷޮ཰ͷߴ͞
    - ߏจ͕SimpleͳͨΊ୹࣌ؒͷνʔϜ։ൃ޲͖
    - ฒྻɾฒߦॲཧͰͷϝϞϦपΓͷѻָ͍͕
    - σϓϩΠָ͕
    - ඪ४ύοέʔδ͕ඇৗʹ࣮༻త

    View Slide

  12. औΓ૊Μͩ͜ͱ
    1. ϓϩηεΩϟογϡ
    2. λεΫ෼ࢄॲཧ

    View Slide

  13. ϓϩηεΩϟογϡ
    σʔλΛϓϩηε্ʹશͯอ͓࣋ͯ͘͠
    !
    ӬଓԽ͸ద౓ͳλΠϛϯάͰRedisʹอଘͳ
    ΓϑΝΠϧʹdumpͳΓ͢Δ

    View Slide

  14. ੔߹ੑ
    ౰વɺෳ਺ͷGoroutine͔ΒಡΈॻ͖͞ΕΔ
    ͨΊ஋ͷ੔߹ੑΛอূ͢Δඞཁ͕͋Δ

    View Slide

  15. Race Condition
    ڝ߹͢Δม਺ૢ࡞Λߦ͏ͱෆ҆ఆͳڍಈ
    Goroutine·͍ͨͰڞ༗ͷ஋ΛಡΈॻ͖͢Δ
    ࡍ͸race conditionΛආ͚ΔͨΊLock͕ඞཁ

    View Slide

  16. sync
    ֤छͷϩοΫΛѻ͏ύοέʔδ
    !
    sync.RWMutex
    - ReadΛWriteͰϩοΫϨϕϧΛ෼཭ͨ͠Lock
    sync/atomic
    - Χ΢ϯλͳͲͷॲཧΛ࡞Δͷʹॏๅ

    View Slide

  17. atomic.Value
    from golang1.4
    !
    ϓϩηε্ʹatomicʹσʔλߋ৽Ͱ͖Δετ
    Ξͱͯ͠ઃܭ͞Ε͍ͯ·͢

    View Slide

  18. View Slide

  19. ಡΈࠐΈଆ͸7BMVF͔Β-PBE

    View Slide

  20. ॻ͖ࠐΈଆ͸-PDLऔͬͨ͋ͱ
    7BMVFʹ4UPSF

    View Slide

  21. λεΫͷ෼ࢄॲཧ
    ཁ݅
    - ॲཧʹ͔͔࣌ؒΔ΋ͷΛඇಉظɺ͔ͭฒߦ࣮ߦ
    ਺Λ੍ݶ࣮ͯ͠ߦ͍ͨ͠
    !
    - ը૾ɾಈըͳͲ͸ॏෳͯ͠ॲཧͨ͘͠ͳ͍

    View Slide

  22. Task Queueing
    capacity෇͖ͷchannelΛ࢖͏
    goroutine͕ͦͷ··workerతʹ࢖͑Δ

    View Slide

  23. View Slide

  24. ॏෳॲཧΛආ͚Δ
    ྫ͑͹ը૾ॲཧதʹɺͦͷը૾Λऔಘ͠ʹདྷ
    ΔϦΫΤετΛfailͤͯ͞͸ͳΒͳ͍
    !
    ͔͠͠ɺऔಘ࣌ʹॏෳॲཧ͸͕࣌ؒ໪ମແ͍

    View Slide

  25. αʔό͕1୆ͷ৔߹

    View Slide

  26. sync.Cond
    ॲཧதͷ΋ͷΛબ୒తʹ଴ͭ

    View Slide

  27. View Slide

  28. αʔό͕ෳ਺୆ͷ࣌

    View Slide

  29. y-matsuwitter/mcond
    ෳ਺୆ͷαʔόؒͰsync.CondΛѻ͑ΔΑ͏
    ʹͨ͠΋ͷ
    !
    Redis + net/httpΛར༻

    View Slide

  30. ೋ୆ͷαʔόͰͷmcond

    View Slide

  31. ॲཧଆ
    ಡΈࠐΈଆ

    View Slide

  32. ॲཧઌΛৼΓ෼͚Δ

    View Slide

  33. stathat/consistent
    ίϯγεςϯτϋογϡϥΠϒϥϦ
    !
    Ұఆͷ໊લʹରͯ͠ඞͣಉ͡ॲཧઌΛܾఆ
    ࠓճ͸ଳҬΛ࢖͍௵ͨ͢Ίෳ਺ͷwebdav
    αʔόʹৼΓ෼͚Δ༻్Ͱར༻

    View Slide

  34. View Slide

  35. ͪͳΈʹ
    ഊҼ͸Cache-Control HeaderͰͨ͠
    IUUQTTV[[email protected]

    View Slide

  36. ࠷ޙʹ

    View Slide

  37. ProductionͰ΋࢖͓͏

    View Slide

  38. View Slide

  39. ࢀߟ
    ඪ४ύοέʔδ http://golang.org/pkg/
    go1.4 http://tip.golang.org/doc/go1.4
    mcond https://github.com/y-matsuwitter/mcond
    consistent https://github.com/stathat/consistent

    View Slide