Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Speaker Deck
PRO
Sign in
Sign up for free
goのメモリアロケーターの話
nasa
June 29, 2022
Technology
0
260
goのメモリアロケーターの話
https://bitkey.connpass.com/event/248608で10分LTしたやつ
。
Goのメモリアロケーターの構造について軽く話した。
nasa
June 29, 2022
Tweet
Share
More Decks by nasa
See All by nasa
GoとRust - 並行処理編
nasa_desu
5
3.4k
Self intro
nasa_desu
0
160
Flutter触ってみた
nasa_desu
0
44
Other Decks in Technology
See All in Technology
AI Services 概要 / AI Services overview
oracle4engineer
PRO
0
180
もし本番ネットワークをまるごと仮想環境に”コピー”できたらうれしいですか? / janog51
corestate55
0
400
CSS Variable をもっと活用する / Kyoto.js 18
spring_raining
2
1.1k
都市ARの作り方 PLATEAU ✖︎ Geospatial API
41h0_shiho
1
330
OpenShiftのリリースノートを整理してみた
loftkun
2
460
私見「UNIXの考え方」/20230124-kameda-unix-phylosophy
opelab
1
180
Oracle Transaction Manager for Microservices Free 22.3 製品概要
oracle4engineer
PRO
5
120
Oracle Base Database Service 技術詳細
oracle4engineer
PRO
3
16k
re:Inventで発表があったIoT事例の紹介と考察
kizawa2020
0
200
JAWS-UG 横浜 #54 資料
takakuni
0
220
クックパッドがRubyKaigiに20名以上の社員で参加するわけ
midorikawa
0
560
PHPのimmutable arrayとは
hnw
1
180
Featured
See All Featured
GitHub's CSS Performance
jonrohan
1020
430k
Build your cross-platform service in a week with App Engine
jlugia
221
17k
A Philosophy of Restraint
colly
193
15k
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
7
590
Optimizing for Happiness
mojombo
365
64k
Six Lessons from altMBA
skipperchong
15
2.3k
How to Ace a Technical Interview
jacobian
270
21k
Embracing the Ebb and Flow
colly
75
3.6k
GraphQLとの向き合い方2022年版
quramy
20
9.9k
Documentation Writing (for coders)
carmenintech
51
2.9k
Clear Off the Table
cherdarchuk
79
290k
Visualization
eitanlees
129
12k
Transcript
©2022 Wantedly, Inc. GoͷϝϞϦΞϩέʔλʔ Bitkey × Voicyओ࠵ ~ Goษڧձ ~
2022/06/29 nasa (Asan Kondo)
©2022 Wantedly, Inc. ࣗݾհ • nasa Ͱ͢ • Wantedly, inc.
৽ଔ2 • ਪનج൫ͷӡ༻ɾ։ൃ • σʔλαΠΤϯςΟετͷੜ࢈ੑര্͛ • কདྷͷເnasaͱ͍͏ϋϯυϧωʔϜΛ͗औΔ͜ͱ • GitHub: k-nas a • Twitter: nasa_desu • Zenn: nasa 🎉 🎉 🎉 🎉 🎉
©2022 Wantedly, Inc. -5ͷඪ • ϝϞϦΞϩέʔλʔ͕ԿΛ͍ͯ͠Δ͔͔Δ • GoݴޠͷΞϩέʔλͷߏ͕গ͔͠Δ • RuntimeύοέʔδΛ͍ͯΈΔʂͱ͍͏ؾ࣋ͪʹͳΔ
©2022 Wantedly, Inc. ࣍ 1. ϝϞϦΞϩέʔλʔͱ 2. GoͷϝϞϦΞϩέʔλʔͷઃܭ 3. ·ͱΊ
©2021 Wantedly, Inc. ϝϞϦΞϩέʔλʔͱʁ
©2022 Wantedly, Inc. • ༻ՄೳͳώʔϓϝϞϦͷཧΛߦ͏ ϓϩάϥϜʮ3byteͩ͘͞ʔ͍ʯ Ξϩέʔλʔʮ͍ɺ͓ͪʂ(3byteۭ͍ͯΔ͔Β͋ͦ͜Λฦͦ͏)ʯ ϝϞϦΞϩέʔλʔͱʁ
©2022 Wantedly, Inc. • ༻ՄೳͳώʔϓϝϞϦͷཧΛߦ͏ ଞͰ༻͍ͯ͠ΔϝϞϦΛฦͪ͠Ό͍͚ͳ͍ Ξϩέʔλʔະ༻ྖҬΛ͍ͬͯΔඞཁ͕͋Δ ղ์͞ΕͨϝϞϦΛ࠶ར༻͢Δ ϝϞϦΞϩέʔλʔͱʁ
©2022 Wantedly, Inc. ༨ஊIFBQ TUBDLͲͪΒ͕ΘΕ͍ͯΔ͔ package main import "fmt" func
main() { slice := make([]int64, 0, 0) fmt.Println(slice) c := make(chan string) fmt.Println(c) s := "string" fmt.Println(s) } :) % go build -gcflags '-m' alloc_playground.go # command-line-arguments ./alloc_playground.go:7:13: inlining call to fmt.Println ./alloc_playground.go:10:13: inlining call to fmt.Println ./alloc_playground.go:13:13: inlining call to fmt.Println ./alloc_playground.go:6:15: make([]int64, 0, 0) escapes to heap ./alloc_playground.go:7:13: slice escapes to heap ./alloc_playground.go:7:13: []interface {}{ ... } does not escape ./alloc_playground.go:10:13: []interface {}{ ... } does not escape ./alloc_playground.go:13:13: s escapes to heap ./alloc_playground.go:13:13: []interface {}{ ... } does not escape <autogenerated >: 1: .this does not escape • -gcflags “-m”Λ͚ͭΔͱ͔Δ
©2022 Wantedly, Inc. ਖ਼֬ʹϝϞϦΛฦ͚ͩ͢Ͱ͍͍ͷ͔ʁ • ਖ਼֬͞MustͰ࣍ͷ̎ͭٻ͍ͨ͠ • • ͍΄͏͕ͦΓΌخ͍͠ΑͶʂ
• அยԽ • ϝϞϦΛແବͳ͘ར༻͍ͨ͠ΑͶʂ
©2022 Wantedly, Inc. ਖ਼֬ʹϝϞϦΛฦ͚ͩ͢Ͱ͍͍ͷ͔ʁ • அยԽʹ͍ͭͯܰ͘͢ ϓϩάϥϜʮ8byteͩ͘͞ʔ͍ʯ ΞϩέʔλʔʮΕͰ͢ɺɺɺʯ
©2022 Wantedly, Inc. ਖ਼֬ʹϝϞϦΛฦ͚ͩ͢Ͱ͍͍ͷ͔ʁ • ༻ՄೳͳώʔϓϝϞϦͷཧΛߦ͏ • ߴͰஅยԽ͕ى͜ΓͮΒ͍Ξϩέʔλʔ͕ྑ͍
©2021 Wantedly, Inc. (PͷϝϞϦΞϩέʔλʔ
©2022 Wantedly, Inc. (PΞϩέʔλʔͷߏཁૉ • ͋ͱ͔Βৄ͘͠ݟ͍͕ͯͬ͘͘͟Γઆ໌ͯ͠ΈΔ • G : ΰϧʔνϯ
• mcache: OSεϨου͝ͱͷΩϟογϡ • mcentral: ۭ͖ྖҬΛཧ͢Δ • mheap: OS͔ΒϝϞϦΛऔಘ͠ཧ
©2022 Wantedly, Inc. • mcach e • mcacheϚϧνεϨουͰੑೳΛग़ͨ͢Ίʹଘࡏ • mcentral͔ΒϝϞϦͷׂ͕ߦΘΕΔ
• 1 threadʹ1mcacheͱ͍͏ߏͳͷͰϩοΫΛऔΒ ͳͯ҆͘શʹѻ͑Δ (PΞϩέʔλʔͷߏཁૉ
©2022 Wantedly, Inc. • mcentra l • mheap͔ΒϝϞϦׂ͕ߦΘΕΔ • (ຊϝϞϦͰͳ͍͕Ұ୴ંͬͯઆ໌͢Δ
) • ෳεϨου͔Βࢀর͞ΕΔͷͰϩοΫΛऔΔඞཁ͕͋Δ • ͕ॏཁͳͷͰϩοΫͷ୯Ґ࠷খʹͳΔΑ͏ʹઃܭ͞ Ε͍ͯΔ • mhea p • OS͔ΒϝϞϦΛಘΔ • ॏ͍ॲཧʹͳΔͷͰҰͰΨοπϦϝϞϦΛऔಘ͢Δ (PΞϩέʔλʔͷߏཁૉ
©2022 Wantedly, Inc. TQBO • OS͔Βऔಘͨ͠ϝϞϦ༧ΊܾΊΒΕͨαΠζʹ۠Β Εཧ͞ΕΔ • ͜ͷαΠζ͝ͱʹ۠ΒΕͨϝϞϦΛspanͱݺͿ •
mcache, mcentral͜ͷspanΛཧ͢Δ
©2022 Wantedly, Inc. TQBO • αΠζͲ͏ܾ·͍ͬͯΔͷ͔ ? • sizeclass.goʹఆٛͯ͋͠Δ •
࣮ࡍʹׂΓͯΒΕΔΦϒδΣΫ τ͜ͷαΠζϐολϦʹͳΒ ͳ͍ • ͋Δఔແବڐ༰͞Ε͍ͯΔ package runtime / / class bytes/obj bytes/span objects tail waste max waste min align / / 1 8 8192 1024 0 87.50% 8 / / 2 16 8192 512 0 43.75% 16 / / 3 24 8192 341 8 29.24% 8 / / 4 32 8192 256 0 21.88% 32 / / 5 48 8192 170 32 31.52% 16 / / 6 64 8192 128 0 23.44% 64 / / 7 80 8192 102 32 19.07% 16 / / 8 96 8192 85 32 15.95% 32 / / 9 112 8192 73 16 13.56% 16 / / 10 128 8192 64 0 11.72% 128 / / 11 144 8192 56 128 11.82% 16 / / 12 160 8192 51 32 9.73% 32 / / 13 176 8192 46 96 9.59% 16 / / 14 192 8192 42 128 9.25% 64
©2022 Wantedly, Inc. TQBO • mcache, mcentral͜ͷspanΛཧ͢Δ
©2022 Wantedly, Inc. TQBO • GoΦϒδΣΫτspanʹׂΓͯΒΕΔ
©2022 Wantedly, Inc. • ϝϞϦ͕ඞཁʹͳͬͨΒ͜ͷਤͷྲྀΕͰׂ͕ߦΘΕΔ 1. mcacheʹ͋Δspanʹۭ͖͕͋ΔͳΒͦ͜Λ͏ 2. mcentral͔ΒspanΛͬͯ͏ 3.
OS͔ΒϝϞϦΛଟΊʹͬͯspanʹׂͯ͠͏ TQBO౿·ׂ͑ͨ
©2021 Wantedly, Inc. ·ͱΊ
©2022 Wantedly, Inc. • Ξϩέʔλʔ • ༻ՄೳͳώʔϓϝϞϦͷཧΛߦ͏ • ߴͰஅยԽ͕ى͜ΓͮΒ͍Ξϩέʔλʔ͕ྑ͍ GoΞϩέʔλʔ
• εϨου͝ͱʹΩϟογϡΛઃ͚ͯCPUʹରͯ͠εέʔϧ͢ΔΑ͏ʹͳ͍ͬͯΔ • OS͔Βऔಘͨ͠ϝϞϦΛϒϩοΫʹ͚ͯߴͳׂΛ࣮ݱ͍ͯ͠Δ ·ͱΊ