Slide 1

Slide 1 text

Golang @ISUCON y_matsuwitter

Slide 2

Slide 2 text

!Z@NBUTVXJUUFS Gunosy inc., ࣥߦ໾һ ! Goྺ1೥ऑ͘Β͍ ! όϥϯεϘʔϧਖ਼࠲ͷਓ

Slide 3

Slide 3 text

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

Slide 4

Slide 4 text

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

Slide 5

Slide 5 text

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

Slide 6

Slide 6 text

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

Slide 7

Slide 7 text

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

Slide 8

Slide 8 text

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

Slide 9

Slide 9 text

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

Slide 10

Slide 10 text

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

Slide 11

Slide 11 text

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

Slide 12

Slide 12 text

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

Slide 13

Slide 13 text

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

Slide 14

Slide 14 text

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

Slide 15

Slide 15 text

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

Slide 16

Slide 16 text

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

Slide 17

Slide 17 text

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

Slide 18

Slide 18 text

No content

Slide 19

Slide 19 text

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

Slide 20

Slide 20 text

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

Slide 21

Slide 21 text

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

Slide 22

Slide 22 text

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

Slide 23

Slide 23 text

No content

Slide 24

Slide 24 text

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

Slide 25

Slide 25 text

αʔό͕1୆ͷ৔߹

Slide 26

Slide 26 text

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

Slide 27

Slide 27 text

No content

Slide 28

Slide 28 text

αʔό͕ෳ਺୆ͷ࣌

Slide 29

Slide 29 text

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

Slide 30

Slide 30 text

ೋ୆ͷαʔόͰͷmcond

Slide 31

Slide 31 text

ॲཧଆ ಡΈࠐΈଆ

Slide 32

Slide 32 text

ॲཧઌΛৼΓ෼͚Δ

Slide 33

Slide 33 text

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

Slide 34

Slide 34 text

No content

Slide 35

Slide 35 text

ͪͳΈʹ ഊҼ͸Cache-Control HeaderͰͨ͠ IUUQTTV[VSJKQZ@NBUTVXJUUFSUTIJSUNCMBDL

Slide 36

Slide 36 text

࠷ޙʹ

Slide 37

Slide 37 text

ProductionͰ΋࢖͓͏

Slide 38

Slide 38 text

No content

Slide 39

Slide 39 text

ࢀߟ ඪ४ύοέʔδ 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