Slide 1

Slide 1 text

Profiling Go Application Go Conference 2018 Autumn #gocon #gocon_a @orisano

Slide 2

Slide 2 text

ࣗݾ঺հ • @orisano • ۦ͚ग़͠ΞϓϦέʔγϣϯΤϯδχΞ • ޮ཰తͳdocker buildΛ໨ࢦ͍ͯ͠Δ • ύϑΥʔϚϯεʹڵຯ͕͋Δ

Slide 3

Slide 3 text

ࠓ೔࿩͢͜ͱ • ߴ଎Խ΍, ϓϩϑΝΠϦϯάΛߦ͖࣮ͬͯͨྫ • Ͳ͏͍͏վળΛ͢Δͷ͔ • Ͳ͏͍͏ϓϩηεͳͷ͔

Slide 4

Slide 4 text

ը૾ม׵αʔόͷ࿩ kubeletͷ࿩ go-swaggerͷ࿩

Slide 5

Slide 5 text

ը૾ม׵αʔόͷ࿩ kubeletͷ࿩ go-swaggerͷ࿩

Slide 6

Slide 6 text

ৄղ γεςϜɾύϑΥʔϚϯε ྠಡձ

Slide 7

Slide 7 text

୊ࡐͱͯ͠؆୯ͳ ը૾ม׵αʔόΛѻͬͨ

Slide 8

Slide 8 text

ෛՙΛ͔͚Δͱ ΞϓϦέʔγϣϯ͕མͪͨ

Slide 9

Slide 9 text

topΛΈͨ

Slide 10

Slide 10 text

མͪͨݪҼ͸ ϝϞϦͷ࢖༻ྔ

Slide 11

Slide 11 text

ϝϞϦϦʔΫʁ

Slide 12

Slide 12 text

pprofΛ࢖͏ GODEBUG=allocfreetrace=1 ͢Δ

Slide 13

Slide 13 text

runtimeʹखΛೖΕΔ

Slide 14

Slide 14 text

GC͍ͯ͠Δͱ͖ʹ ࢀরgraphΛdump͢ΔΑ͏ ʹͨ͠

Slide 15

Slide 15 text

No content

Slide 16

Slide 16 text

ͪΌΜͱpprofͷmemory goroutineͷ਺ΛݟΔ

Slide 17

Slide 17 text

ಉ࣌ม׵਺ʹ੍ݶΛ͚ͭΔ

Slide 18

Slide 18 text

ແࣄ໰୊͸ղܾͨ͠

Slide 19

Slide 19 text

͋ͱ͸ߴ଎Խ

Slide 20

Slide 20 text

disintegration/imaging

Slide 21

Slide 21 text

Boundary Check Elimination

Slide 22

Slide 22 text

Go͸جຊఴࣈΞΫηε͢Δͱ ൣғνΣοΫ͕ೖΔ

Slide 23

Slide 23 text

ίϯύΠϥ͕҆શͩͱ ൑அ͢Δͱফ͑Δ

Slide 24

Slide 24 text

͜ΕΛ Boundary Check Elimination (BCE)ͱ͍͏

Slide 25

Slide 25 text

͜ΕΛ Boundary Check Elimination (BCE)ͱ͍͏ ref: https://go101.org/article/bounds-check-elimination.html

Slide 26

Slide 26 text

goͷඪ४ϥΠϒϥϦͰ ͦͦ͜͜ݟΔ

Slide 27

Slide 27 text

ը૾ͷಡΈࠐΈ, ม׵ͳͲ heavyʹఴࣈΞΫηε͢Δ ৔߹ͩͱޮՌ͕େ͖͍

Slide 28

Slide 28 text

https://github.com/ disintegration/imaging/ pull/81

Slide 29

Slide 29 text

https://github.com/ disintegration/imaging/ pull/81

Slide 30

Slide 30 text

No content

Slide 31

Slide 31 text

pprofͳͲͰ ݪҼΛಛఆͨ͠Β

Slide 32

Slide 32 text

·ͣ BenchmarkΛॻ͜͏ *testing.B

Slide 33

Slide 33 text

Benchmarkͷ݁ՌΛ ͪΌΜͱݟΔ

Slide 34

Slide 34 text

golang.org/x/tools/cmd/ benchcmp golang.org/x/perf/cmd/ benchstat

Slide 35

Slide 35 text

https://github.com/ disintegration/imaging/ pull/81

Slide 36

Slide 36 text

ը૾ม׵αʔόͷ࿩ kubeletͷ࿩ go-swaggerͷ࿩

Slide 37

Slide 37 text

kubeletͷCPU͕ෛՙ͕ߴ͍ ͱ૬ஊΛड͚ͨ

Slide 38

Slide 38 text

Datadog͕ୟ͍ͯΔ Metrics༻ͷEndpoint͕ ݪҼͳͷͰ͸ͱ͍͏࿩ͩͬͨ

Slide 39

Slide 39 text

kubelet͸net/http/pprofΛ import͍ͯ͠Δ

Slide 40

Slide 40 text

໰୊͕ى͖͍ͯΔ؀ڥͷ ৘ใ͕औͬͯ͜ΕΔ

Slide 41

Slide 41 text

No content

Slide 42

Slide 42 text

prometheus/common google/cadvisor ͷҰ෦͕ॏ͍

Slide 43

Slide 43 text

No content

Slide 44

Slide 44 text

౰֘Օॴ https://github.com/prometheus/ common/pull/148 ൃ֮ͷ1िؒલ͘Β͍ʹ allocation freeʹͳͬͯ 2ഒ͘Β͍ૣ͘ͳ͍ͬͯͨ

Slide 45

Slide 45 text

No content

Slide 46

Slide 46 text

ͳΜ͔չ͔ͬͨ͠ͷͰ https://github.com/prometheus/ common/pull/150 ߋʹͦΕΛ2ഒ͘Β͍ૣ͘͠·ͨ͠

Slide 47

Slide 47 text

No content

Slide 48

Slide 48 text

७ਮʹWrite͕ଟ͔ͬͨ

Slide 49

Slide 49 text

strings.Replacerʹ͸ WriteString͕͋Γ·͢

Slide 50

Slide 50 text

ஔ׵ର৅ՕॴҎ֎͸ ·ͱΊͯWriteͯ͘͠ΕΔ

Slide 51

Slide 51 text

allocation΋ى͜Βͳ͍ͷͰ࠷ߴ

Slide 52

Slide 52 text

࣍ʹ

Slide 53

Slide 53 text

google/cadvisorͷ ListContainers͕ॏ͍

Slide 54

Slide 54 text

No content

Slide 55

Slide 55 text

google/cadvisorͷ ListContainers͕ॏ͍ https://github.com/google/cadvisor/blob/8faf19092784b75fce10ce190d37e66f89de3612/container/common/helpers.go

Slide 56

Slide 56 text

ioutil.ReadDirͱsyscall ͕ॏ͍ʁ

Slide 57

Slide 57 text

ioutil.ReadDirͷத਎ΛݟͯΈΔ

Slide 58

Slide 58 text

ref: https://golang.org/src/io/ioutil/ioutil.go

Slide 59

Slide 59 text

ref: https://golang.org/src/os/dir_unix.go

Slide 60

Slide 60 text

ͳΜ͔ҎԼʹ͋ΔϑΝΠϧશ෦ʹ lstatൃߦ͍ͯ͠Δ

Slide 61

Slide 61 text

ref: https://golang.org/src/os/dir_unix.go

Slide 62

Slide 62 text

readdirentͬͯ΍͕ͭ͋Δ

Slide 63

Slide 63 text

Ͳ͏΍Β͜Ε͸ entryͷtypeΛฦͯ͘͠ΕΔΒ͍͠

Slide 64

Slide 64 text

google/cadvisorͷ ListContainers͕ॏ͍ https://github.com/google/cadvisor/blob/8faf19092784b75fce10ce190d37e66f89de3612/container/common/helpers.go

Slide 65

Slide 65 text

readdirentΛ͏·͘࢖͑Ε͹ syscallͷճ਺ΛݮΒͤΔ

Slide 66

Slide 66 text

͔͠͠ golangඪ४ͷreaddirent͸ typeΛऔಘͰ͖ͳ͍

Slide 67

Slide 67 text

͔͠΋ ࣮૷ʹඞཁͳॾʑ͕ privateʹͳ͍ͬͯΔ

Slide 68

Slide 68 text

ඪ४͔Βͦ͜Λίϐϖ͢Δͱ cadvisorͷ LICENSE Checkʹ௨Βͳ͍

Slide 69

Slide 69 text

࣮͸͜ͷํ๏ ͍ΖΜͳϥΠϒϥϦͰ࢖ΘΕ͍ͯΔ goimports/internal/fastwalk ֎෦͔Βར༻Ͱ͖ͳ͍

Slide 70

Slide 70 text

ѹ౗తʹ֎෦͔Βར༻Ͱ͖ͳ͍

Slide 71

Slide 71 text

github.com/karrick/godirwalk Α͏΍͘ݟ͚ͭͨ

Slide 72

Slide 72 text

https://github.com/google/ cadvisor/pull/2085

Slide 73

Slide 73 text

No content

Slide 74

Slide 74 text

Memoryܥͷऔಘ͚ͩ΍ͨΒ஗͍

Slide 75

Slide 75 text

https://lkml.org/lkml/ 2018/7/3/101 cgroups v1ܥͷ໰୊Β͍͠ kernelͷversionΛ͋͛Α͏

Slide 76

Slide 76 text

ը૾ม׵αʔόͷ࿩ kubeletͷ࿩ go-swaggerͷ࿩

Slide 77

Slide 77 text

ࣗಈੜ੒Λ݁ߏ࢖͍ͬͯΔͷͰ͕͢

Slide 78

Slide 78 text

go-swagger͕஗͍

Slide 79

Slide 79 text

ૣ͘͠Α͏

Slide 80

Slide 80 text

cliܥͷϓϩϑΝΠϦϯάʹ͸ pkg/profile͕ศར

Slide 81

Slide 81 text

No content

Slide 82

Slide 82 text

https://github.com/go-openapi/ swag/pull/25

Slide 83

Slide 83 text

No content

Slide 84

Slide 84 text

಺෦Ͱຖճ MustCompileͯͨ͠

Slide 85

Slide 85 text

No content

Slide 86

Slide 86 text

https://github.com/go-openapi/ loads/pull/19

Slide 87

Slide 87 text

No content

Slide 88

Slide 88 text

஗͍json.UnmarshalΛ deepcopyͷͨΊʹ2ճͯͨ͠

Slide 89

Slide 89 text

json.Unmarshal 1ճ {de,en}coding/gob Ͱ͓஡Λ୙ͨ͠

Slide 90

Slide 90 text

No content

Slide 91

Slide 91 text

·ͱΊ

Slide 92

Slide 92 text

ීஈ࢖͍ͬͯΔ΋ͷͰ΋ ΧϦΧϦʹνϡʔχϯά ͞Ε͍ͯΔΘ͚Ͱ͸ͳ͍

Slide 93

Slide 93 text

ࣗ෼͕஗͍ͱײͨ͡Β ܭଌͯ͠ΈΔ վળͯ͠ΈΔ

Slide 94

Slide 94 text

cliͳΒpkg/profileΛ࢓ࠐΜͰݟΔ

Slide 95

Slide 95 text

serverͳΒnet/http/pprofΛ࢖͏

Slide 96

Slide 96 text

ݪҼͷಛఆͷखॿ͚ͷͨΊʹ svgʹͨ͠Γ uber/go-torchΛ࢖ͬͯ flamegraphʹͨ͠Γ flamescopeΛ࢖ͬͨΓ

Slide 97

Slide 97 text

ݪҼΛಛఆͨ͠Β BenchmarkΛॻ͘

Slide 98

Slide 98 text

-count=10ͳͲΛ࢖ͬͨ͋ͱʹ benchcmp or benchstat ͯ͠ޮՌ͕ग़͍ͯΔ͜ͱΛ֬ೝ

Slide 99

Slide 99 text

͋ͱ͸PRΛ౤͛Δ

Slide 100

Slide 100 text

͜Μͳʹ ύϑΥʔϚϯενϡʔχϯά ͠΍͍͢ݴޠଞʹͳ͍

Slide 101

Slide 101 text

΍͍ͬͯ͜͏

Slide 102

Slide 102 text

ඞཁΛײ͡Δ·Ͱ͸ νϡʔχϯά͠ͳ͍

Slide 103

Slide 103 text

Ͱ΋ ܭଌ͕Ͱ͖Δ؀ڥ͸༻ҙ͢΂͖