TDC2018SP | Trilha Go - Entendendo alocacao de memoria no Go

Entendendo alocação de
memória no Go
André Carvalho
@andresantostc
1
Desenvolvedor @ Globo.com
tsuru.io
https://andrestc.com
2
3
Por que?
● Conhecer os trade-offs
● Conhecer uma camada de abstração abaixo
● Porque não?
4
func main() {
rand.Seed(time.Now().UnixNano())
i := rand.Intn(100)
fmt.Printf("%v at %pn", i, &i)
for {
}
}
5
6
$ ./vmemory
53 at 0xc420016110
$ ./vmemory
68 at 0xc420016110
Rodando o programa duas vezes ao mesmo
tempo...
Mesmo endereço
Memória Virtual
● Processos não leem diretamente da memória física
○ Segurança
○ Coordenação entre múltiplos processos
● Memória Virtual abstrai isso dos processos
○ Segmentation
○ Page tables
7
Memória Virtual
8
Frame 0
Frame 1
Frame 2
Frame 3
Frame 4
Frame 5
Frame 6
Frame 7
RAM
Disk
Other process
Page 0
Page 1
Page 2
Page 3
Page 4
Page 5
Page 6
Page 7
Page
Process
Frame
Page Table
3
6
Layout de um Processo
9
Text
Data
Heap
BSS
Stack
Program Break
Code
Initialized static variables
Uninitialized static variables
Dynamic allocated variables
Function stack frames
Alocação na Stack
10
Stack Used
Stack Pointer (SP)
Unused
Allocation
SP += size;
return Stack[SP-size];
Deallocation
SP -= size;
Alocação na Heap
● Objetos com tamanho conhecido apenas em tempo de
execução
● C tem malloc e free
● C++ tem new e delete
● Go usa escape analysis e garbage collection
11
Alocador Simples
12
Alocador Simples
Precisamos implementar duas funções
13
void* malloc(size_t size)
void free(void *ptr)
Alocador Simples
14
Application Allocator OS
malloc
mmap
Alocador utiliza syscalls como mmap/munmap para falar com o OS
munmap
madvisefree
Alocador Simples
Lista encadeada de objetos disponíveis
size=n
next=*
Header n bytes
size=m
next=nil
m bytes
15
Head
Alocador Simples - Alocação
malloc(10)
16
Head
NULL
Alocador Simples
17
Virtual Address Space
0x000000c000000000
mmap(
0x000000c000000000,
4096,
PROT_WRITE | PROT_READ,
MAP_PRIVATE | MAP_ANONYMOUS,
...)
Start Address
Size
Permission
Flags
Alocador Simples - Alocação
malloc(10)
18
4084
12 4084
4096
Head
Alocador Simples - Alocação
malloc(10)
19
4062Head 10
22
Alocador Simples - Alocação
malloc(10)
20
4062Head 10
P
Allocator returns p, which points right after the header
21
Alocador Simples - Desalocação
4062Head
free(p)
10
free(p)
10
p - size(header)
22
Alocador Simples - Desalocação
4062Head
Alocador Simples
● Pode ser implementado em algumas centenas de LOCs
● Questões não endereçadas
○ Fragmentação
○ Devolver memória para o OS
■ Quando?
■ Como? munmap, madvise...
○ Multi-thread
○ ...
23
Go Runtime
Allocator
24
● TCMalloc
● Invocando o Alocador
● Go’s Allocator
Thread-Caching Malloc (TCMalloc)
● Implementado originalmente em C pelo Google
● Serve como base para o algoritmo usado pelo Go
● Diminui lock-contention em programas multi-threaded
25
TCMalloc
● Cada thread tem um cache local
● Dois tipos de alocação
○ Small allocations (<= 32 kB)
○ Large allocations
26
TCMalloc - Small Allocations
● Atendidas pelo cache local da thread
● Tamanho é arredondado para o de uma das classes
27
malloc(965 bytes) ⇒ malloc(1024 bytes)
malloc(1023 bytes) ⇒ malloc(1024 bytes)
TCMalloc - Small Allocations
Class 0
Class 1
Class 2
...
Local Thread Cache
28
TCMalloc - Small Allocations
Class 0
Class 1
Class 2
...
Local Thread Cache
29
TCMalloc - Small Allocations
Class 0
Class 1
Class 2
...
Local Thread Cache
Span
Span
Span
...
Central Free List
Class 1
30
Run of contiguous pagesSpan
TCMalloc - Small Allocations
Class 0
Class 1
Class 2
...
Local Thread Cache
Span
Span
Span
...
Central Free List
Class 1
31
TCMalloc - Small Allocations
Span
Span
Span
Central Free List
Class X
Span
1 page
2 pages
...
> 255
pages
Span Span
Span Span Span
Span Span
Central Heap
32
TCMalloc - Small Allocations
Span
Span
Span
Central Free List
Class X
Span
1 page
2 pages
...
> 255
pages
Span Span
Span Span
Span Span
Central Heap
Span
...
33
Span
TCMalloc - Small Allocations
Application Local Thread Cache
Central Free List
Central Heap
4 bytes
N 8-byte
objects
X pages
OS
Y*X pages
34
X pages
N 8-byte
objects
Y*X pages
TCMalloc - Large Allocations
● Atendidas pela Heap central
● Tamanho é arredondado para numero de paginas
35
malloc(34 kB) ⇒ malloc(36 kB) ⇒ 9 pages
malloc(33 kB) ⇒ malloc(36 kB) ⇒ 9 pages
TCMalloc - Large Allocations
1 page
2 pages
...
> 255
pages
Span Span
Span Span
Span Span
Central Heap
Span Span
36
TCMalloc - Deallocation
Page 1 Page 2 Page 3 Page 4 Page 5 Page 6
Span A Span B Span C
37
TCMalloc - Deallocation
free( ) Page Span
38
TCMalloc - Deallocation
free( ) Page Span
Class 0
Class 1
Class 2
...
Local Thread Cache
Small object
39
TCMalloc - Deallocation
free( ) Page Span
Large object
Page 1 Page 2 Page 3 Page 4
Span A Span B Span C
40
TCMalloc - Deallocation
free( ) Page Span
Large object
Page 1 Page 2 Page 3 Page 4
Span A Span B
41
TCMalloc - Deallocation
free( ) Page Span
Large object
1 page
2 pages
...
> 255
pages
Span B
Central Heap
42
TCMalloc - Deallocation
free( ) Page Span
Large object
1 page
2 pages
...
> 255
pages
Span B
Central Heap
43
Go Runtime
Allocator
44
● TCMalloc
● Invocando o Alocador
● Go’s Allocator
package main
func main() {
f()
}
//go:noinline
func f() *int {
i := 10
return &i
}
45
package main
func main() {
f()
}
//go:noinline
func f() *int {
i := 10
return &i
}
46
$ go build -gcflags "-m -m" main.go
# command-line-arguments
./main.go:8:6: cannot inline f: marked
go:noinline
./main.go:3:6: cannot inline main: non-leaf
function
./main.go:10:9: &i escapes to heap
./main.go:10:9: from ~r0 (return) at
./main.go:10:2
./main.go:9:2: moved to heap: i
47
$ go tool compile -S main.go
...
0x001d 00029 (main.go:9) LEAQ type.int(SB), AX
0x0024 00036 (main.go:9) MOVQ AX, (SP)
0x0028 00040 (main.go:9) PCDATA $0, $0
0x0028 00040 (main.go:9) CALL runtime.newobject(SB)
...
48
$ go tool compile -S main.go
...
0x001d 00029 (main.go:9) LEAQ type.int(SB), AX
0x0024 00036 (main.go:9) MOVQ AX, (SP)
0x0028 00040 (main.go:9) PCDATA $0, $0
0x0028 00040 (main.go:9) CALL runtime.newobject(SB)
...
func newobject(typ *_type) unsafe.Pointer {
return mallocgc(typ.size, typ, true)
}
Go Runtime
Allocator
49
● TCMalloc
● Invoking the Allocator
● Go’s Allocator
Go’s Allocator
● Acoplado ao GC e outras partes do runtime
○ Difícil de trocar por outras implementações
● Três tipos de alocação
○ Tiny Allocations (no pointers, size < 16 bytes)
○ Small Allocations (size <= 32 kbytes)
○ Large Allocations
50
Go’s Allocator - Large Allocations
51
1 page
2 pages
...
> 255
pages
Span Span
Span Span Span Spanmheap
Busy
Spans Span Span Span
Antes de alocar, mheap faz o sweep do mesmo número de paginas
Go’s Allocator - Large Allocations
52
1 page
2 pages
...
> 255
pages
Span Span
Span Span
Span
Span
Span Span
Span
Span
Span
mheap
Free
Spans
Go’s Allocator - Large Allocations
53
1 page
2 pages
...
> 255
pages
Span Span
Span Span
Span
Span
mheap
Free
Spans
Span Span
Span
Span
Span
mtreap ⇒ randomized binary tree
Go’s Allocator - Large Allocations
54
Depois de alocar, dependendo da quantidade de memória em
uso...
● A goroutine pode ter que trabalhar para o GC
● Stop the World
Go’s Allocator - Small Allocations
55
P1
mcache
Cada processador lógico (P) tem um cache local (mcache)
P2
mcache
Go’s Allocator - Small Allocations
56
P1
P2
mcache
mcache
Cada mcache mantem um span para cada tamanho (size class)
Span
Span
...
class 1
class 2
Span
Span
...
class 1
class 2
Go’s Allocator - Small Allocations
57
class bytes/obj bytes/span objects
1 8 8192 1024
2 16 8192 512
3 32 8192 256
4 64 8192 170
...
65 28672 57344 2
66 32768 32768 1
Go’s Allocator - Small Allocations
58
P1
mcache
mcache retorna o endereço de um objeto livre no span
Span
Span
...
class 1
class 2
Span
Go’s Allocator - Small Allocations
59
P1
mcache
mcache pede um novo span para o mcentral dessa size class
Span
Span
...
class 1
class 2
Span
Go’s Allocator - Small Allocations
60
P1
mcache
Cada mcentral tem duas listas, empty e nonempty spans
Span
Span
...
...
class 1
class 2
mcentral
mcentral
Span Span
Span Span
Go’s Allocator - Small Allocations
61
P1
mcache
Span com objetos livres vai ser entregue ao mcache
Span
...
...
class 1
class 2
mcentral
mcentral
Span
Span
Span Span
Go’s Allocator - Small Allocations
62
P1
mcache
mcentral vai tentar fazer sweep de spans vazios
Span
Span
...
...
class 1
class 2
mcentral
mcentral
Span Span
If there are no
nonempty spans….
Go’s Allocator - Small Allocations
63
Se nada funciona, mcentral vai pedir um novo span para a mheap
class 0 mcentral
Span Span
mheap
Go’s Allocator - Small Allocations
64
mcentral vai dar esse span para a mcache
class 0 mcentral
Span Span
mheapSpan
Go’s Allocator - Tiny Allocations
Alocações para objetos sem pointers menores que < 16 bytes
The main targets of tiny allocator are small strings and
standalone escaping variables. On a json benchmark the
allocator reduces number of allocations by ~12% and
reduces heap size by ~20%.
65
66
Go’s Allocator - Tiny Allocations
64 bytes
Allocated Free Allocated Free
● Cada P mantem um objeto de 64-bytes que foi alocado de um
span
● Cada tiny allocation adiciona um subobjeto ao final do objeto
● O GC não sabe sobre esses subobjetos!
67
Go’s Allocator - Tiny Allocations
Allocated Free
mcache
P1
● Pega um novo bloco do mcache ≃ small allocation
● Eventualmente, o GC vai coletar o bloco antigo
FreeP1
mcache
Garbage Collector ⇒ Concurrent mark and sweep
68
Go’s Allocator - Sweeping
1. Scan all objects
2. Mark objects that are live
3. Sweep objects that are not live
● Runtime periodicamente devolve memória ao OS
● Devolve spans que foram garbage collected a mais de 5
minutos
● No Linux, usa a syscall madvise(2)
69
Go’s Allocator - Devolvendo memória ao OS
madvise(addr, size, _MADV_DONTNEED)
Analisar alocações
● runtime.ReadMemStats
● pprof
● go tool trace
70
71
stats := runtime.MemStats{}
runtime.ReadMemStats(&stats)
type MemStats struct {
...
// Heap memory statistics.
HeapAlloc uint64
HeapSys uint64
HeapIdle uint64
HeapInuse uint64
HeapReleased uint64
HeapObjects uint64
...
}
Referências
1. http://goog-perftools.sourceforge.net/doc/tcmalloc.html
2. https://www.ardanlabs.com/blog/2017/05/language-mechanics-on-stacks-and-pointers.html
3. https://gabrieletolomei.wordpress.com/miscellanea/operating-systems/in-memory-layout/
4. Lec 10 | MIT 6.172 Performance Engineering of Software Systems, Fall 2010
5. https://faculty.washington.edu/aragon/pubs/rst89.pdf
6. http://man7.org/linux/man-pages/man2/mmap.2.html
7. http://man7.org/linux/man-pages/man2/madvise.2.html
8. https://github.com/andrestc/linux-prog/blob/master/ch7/malloc.c
72
Obrigado!
andrestc.com
@andresantostc
73
1 of 73

Recommended

Funcionamento interno do node.js e boas práticas by
Funcionamento interno do node.js e boas práticasFuncionamento interno do node.js e boas práticas
Funcionamento interno do node.js e boas práticasKirmayr tomaz
175 views74 slides
Criptgrafia algoritmos by
Criptgrafia   algoritmosCriptgrafia   algoritmos
Criptgrafia algoritmosdigobfpc
107 views44 slides
KNN - CUDA - Categorizador de rótulos automatizado by
KNN - CUDA - Categorizador de rótulos automatizadoKNN - CUDA - Categorizador de rótulos automatizado
KNN - CUDA - Categorizador de rótulos automatizadoRichiely Paiva
682 views26 slides
Desempenho e Escalabilidade de Banco de Dados em ambiente x86 by
Desempenho e Escalabilidade de Banco de Dados em ambiente x86Desempenho e Escalabilidade de Banco de Dados em ambiente x86
Desempenho e Escalabilidade de Banco de Dados em ambiente x86Rodrigo Campos
1.7K views32 slides
Funcionamento e otimização da Garbage Collection na Oracle Hotspot JVM by
Funcionamento e otimização da Garbage Collection na Oracle Hotspot JVMFuncionamento e otimização da Garbage Collection na Oracle Hotspot JVM
Funcionamento e otimização da Garbage Collection na Oracle Hotspot JVMAdriano Bonat
1K views52 slides
Virtualização de Banco de Dados por Bruno Domingues by
Virtualização de Banco de Dados por Bruno DominguesVirtualização de Banco de Dados por Bruno Domingues
Virtualização de Banco de Dados por Bruno DominguesJoao Galdino Mello de Souza
814 views39 slides

More Related Content

Similar to TDC2018SP | Trilha Go - Entendendo alocacao de memoria no Go

Limites modelo normal_2016 by
Limites modelo normal_2016Limites modelo normal_2016
Limites modelo normal_2016JacintoDala2
101 views86 slides
Inteligencia artificial 2 by
Inteligencia artificial 2Inteligencia artificial 2
Inteligencia artificial 2Nauber Gois
427 views62 slides
Imergindo jvm[Apresentação ] by
Imergindo jvm[Apresentação ]Imergindo jvm[Apresentação ]
Imergindo jvm[Apresentação ]Otávio Santana
579 views50 slides
Aa booklet by
Aa bookletAa booklet
Aa bookletGlauco Felix dos Santos
95 views80 slides
Inpe by
InpeInpe
Inpecacauvicosa
267 views56 slides
C Sharp - Gerenciamento de Memória by
C Sharp - Gerenciamento de MemóriaC Sharp - Gerenciamento de Memória
C Sharp - Gerenciamento de MemóriaCDS
135 views27 slides

Similar to TDC2018SP | Trilha Go - Entendendo alocacao de memoria no Go(20)

Limites modelo normal_2016 by JacintoDala2
Limites modelo normal_2016Limites modelo normal_2016
Limites modelo normal_2016
JacintoDala2101 views
Inteligencia artificial 2 by Nauber Gois
Inteligencia artificial 2Inteligencia artificial 2
Inteligencia artificial 2
Nauber Gois427 views
C Sharp - Gerenciamento de Memória by CDS
C Sharp - Gerenciamento de MemóriaC Sharp - Gerenciamento de Memória
C Sharp - Gerenciamento de Memória
CDS135 views
Paradigmas de Linguagens de Programação - Gerenciamento de Memória em Java by Adriano Teixeira de Souza
Paradigmas de Linguagens de Programação - Gerenciamento de Memória em JavaParadigmas de Linguagens de Programação - Gerenciamento de Memória em Java
Paradigmas de Linguagens de Programação - Gerenciamento de Memória em Java
Metaheurísticas Aplicadas ao Problema de Designação de Servidores e Clientes ... by Thiago Curvelo
Metaheurísticas Aplicadas ao Problema de Designação de Servidores e Clientes ...Metaheurísticas Aplicadas ao Problema de Designação de Servidores e Clientes ...
Metaheurísticas Aplicadas ao Problema de Designação de Servidores e Clientes ...
Thiago Curvelo97 views
Algoritmos de Agrupamento - Aprendizado não supervisionado by Fabrício Barth
Algoritmos de Agrupamento - Aprendizado não supervisionadoAlgoritmos de Agrupamento - Aprendizado não supervisionado
Algoritmos de Agrupamento - Aprendizado não supervisionado
Fabrício Barth881 views
Projeto de Elasticidade e Evolução do Projeto FIBRE by FIBRE Testbed
Projeto de Elasticidade e Evolução do Projeto FIBREProjeto de Elasticidade e Evolução do Projeto FIBRE
Projeto de Elasticidade e Evolução do Projeto FIBRE
FIBRE Testbed203 views
Otimização em Unity: fazendo seu jogo rodar no PC da sua avó by Bruno Ferreira
Otimização em Unity: fazendo seu jogo rodar no PC da sua avóOtimização em Unity: fazendo seu jogo rodar no PC da sua avó
Otimização em Unity: fazendo seu jogo rodar no PC da sua avó
Bruno Ferreira7.4K views
Computação Manycore: Uma Arquitetura muito além do Multicore! by Intel Software Brasil
Computação Manycore: Uma Arquitetura muito além do Multicore!Computação Manycore: Uma Arquitetura muito além do Multicore!
Computação Manycore: Uma Arquitetura muito além do Multicore!
Particionamento cassandra by serdg
Particionamento   cassandraParticionamento   cassandra
Particionamento cassandra
serdg533 views
Se você é .NET, você é NETDUINO - TDC 2013 - Porto Alegre by Marcio Martins
Se você é .NET, você é NETDUINO - TDC 2013 - Porto AlegreSe você é .NET, você é NETDUINO - TDC 2013 - Porto Alegre
Se você é .NET, você é NETDUINO - TDC 2013 - Porto Alegre
Marcio Martins390 views

More from tdc-globalcode

TDC2019 Intel Software Day - Visao Computacional e IA a servico da humanidade by
TDC2019 Intel Software Day - Visao Computacional e IA a servico da humanidadeTDC2019 Intel Software Day - Visao Computacional e IA a servico da humanidade
TDC2019 Intel Software Day - Visao Computacional e IA a servico da humanidadetdc-globalcode
1.7K views69 slides
TDC2019 Intel Software Day - Tecnicas de Programacao Paralela em Machine Lear... by
TDC2019 Intel Software Day - Tecnicas de Programacao Paralela em Machine Lear...TDC2019 Intel Software Day - Tecnicas de Programacao Paralela em Machine Lear...
TDC2019 Intel Software Day - Tecnicas de Programacao Paralela em Machine Lear...tdc-globalcode
1K views43 slides
TDC2019 Intel Software Day - ACATE - Cases de Sucesso by
TDC2019 Intel Software Day - ACATE - Cases de SucessoTDC2019 Intel Software Day - ACATE - Cases de Sucesso
TDC2019 Intel Software Day - ACATE - Cases de Sucessotdc-globalcode
341 views49 slides
TDC2019 Intel Software Day - Otimizacao grafica com o Intel GPA by
TDC2019 Intel Software Day - Otimizacao grafica com o Intel GPATDC2019 Intel Software Day - Otimizacao grafica com o Intel GPA
TDC2019 Intel Software Day - Otimizacao grafica com o Intel GPAtdc-globalcode
323 views25 slides
TDC2019 Intel Software Day - Deteccao de objetos em tempo real com OpenVino by
TDC2019 Intel Software Day - Deteccao de objetos em tempo real com OpenVinoTDC2019 Intel Software Day - Deteccao de objetos em tempo real com OpenVino
TDC2019 Intel Software Day - Deteccao de objetos em tempo real com OpenVinotdc-globalcode
308 views22 slides
TDC2019 Intel Software Day - OpenCV: Inteligencia artificial e Visao Computac... by
TDC2019 Intel Software Day - OpenCV: Inteligencia artificial e Visao Computac...TDC2019 Intel Software Day - OpenCV: Inteligencia artificial e Visao Computac...
TDC2019 Intel Software Day - OpenCV: Inteligencia artificial e Visao Computac...tdc-globalcode
376 views48 slides

More from tdc-globalcode(20)

TDC2019 Intel Software Day - Visao Computacional e IA a servico da humanidade by tdc-globalcode
TDC2019 Intel Software Day - Visao Computacional e IA a servico da humanidadeTDC2019 Intel Software Day - Visao Computacional e IA a servico da humanidade
TDC2019 Intel Software Day - Visao Computacional e IA a servico da humanidade
tdc-globalcode1.7K views
TDC2019 Intel Software Day - Tecnicas de Programacao Paralela em Machine Lear... by tdc-globalcode
TDC2019 Intel Software Day - Tecnicas de Programacao Paralela em Machine Lear...TDC2019 Intel Software Day - Tecnicas de Programacao Paralela em Machine Lear...
TDC2019 Intel Software Day - Tecnicas de Programacao Paralela em Machine Lear...
tdc-globalcode1K views
TDC2019 Intel Software Day - ACATE - Cases de Sucesso by tdc-globalcode
TDC2019 Intel Software Day - ACATE - Cases de SucessoTDC2019 Intel Software Day - ACATE - Cases de Sucesso
TDC2019 Intel Software Day - ACATE - Cases de Sucesso
tdc-globalcode341 views
TDC2019 Intel Software Day - Otimizacao grafica com o Intel GPA by tdc-globalcode
TDC2019 Intel Software Day - Otimizacao grafica com o Intel GPATDC2019 Intel Software Day - Otimizacao grafica com o Intel GPA
TDC2019 Intel Software Day - Otimizacao grafica com o Intel GPA
tdc-globalcode323 views
TDC2019 Intel Software Day - Deteccao de objetos em tempo real com OpenVino by tdc-globalcode
TDC2019 Intel Software Day - Deteccao de objetos em tempo real com OpenVinoTDC2019 Intel Software Day - Deteccao de objetos em tempo real com OpenVino
TDC2019 Intel Software Day - Deteccao de objetos em tempo real com OpenVino
tdc-globalcode308 views
TDC2019 Intel Software Day - OpenCV: Inteligencia artificial e Visao Computac... by tdc-globalcode
TDC2019 Intel Software Day - OpenCV: Inteligencia artificial e Visao Computac...TDC2019 Intel Software Day - OpenCV: Inteligencia artificial e Visao Computac...
TDC2019 Intel Software Day - OpenCV: Inteligencia artificial e Visao Computac...
tdc-globalcode376 views
TDC2019 Intel Software Day - Inferencia de IA em edge devices by tdc-globalcode
TDC2019 Intel Software Day - Inferencia de IA em edge devicesTDC2019 Intel Software Day - Inferencia de IA em edge devices
TDC2019 Intel Software Day - Inferencia de IA em edge devices
tdc-globalcode560 views
Trilha BigData - Banco de Dados Orientado a Grafos na Seguranca Publica by tdc-globalcode
Trilha BigData - Banco de Dados Orientado a Grafos na Seguranca PublicaTrilha BigData - Banco de Dados Orientado a Grafos na Seguranca Publica
Trilha BigData - Banco de Dados Orientado a Grafos na Seguranca Publica
tdc-globalcode305 views
Trilha .Net - Programacao funcional usando f# by tdc-globalcode
Trilha .Net - Programacao funcional usando f#Trilha .Net - Programacao funcional usando f#
Trilha .Net - Programacao funcional usando f#
tdc-globalcode344 views
TDC2018SP | Trilha Go - Case Easylocus by tdc-globalcode
TDC2018SP | Trilha Go - Case EasylocusTDC2018SP | Trilha Go - Case Easylocus
TDC2018SP | Trilha Go - Case Easylocus
tdc-globalcode742 views
TDC2018SP | Trilha Modern Web - Para onde caminha a Web? by tdc-globalcode
TDC2018SP | Trilha Modern Web - Para onde caminha a Web?TDC2018SP | Trilha Modern Web - Para onde caminha a Web?
TDC2018SP | Trilha Modern Web - Para onde caminha a Web?
tdc-globalcode287 views
TDC2018SP | Trilha Go - Clean architecture em Golang by tdc-globalcode
TDC2018SP | Trilha Go - Clean architecture em GolangTDC2018SP | Trilha Go - Clean architecture em Golang
TDC2018SP | Trilha Go - Clean architecture em Golang
tdc-globalcode396 views
TDC2018SP | Trilha Go - "Go" tambem e linguagem de QA by tdc-globalcode
TDC2018SP | Trilha Go - "Go" tambem e linguagem de QATDC2018SP | Trilha Go - "Go" tambem e linguagem de QA
TDC2018SP | Trilha Go - "Go" tambem e linguagem de QA
tdc-globalcode482 views
TDC2018SP | Trilha Mobile - Digital Wallets - Seguranca, inovacao e tendencia by tdc-globalcode
TDC2018SP | Trilha Mobile - Digital Wallets - Seguranca, inovacao e tendenciaTDC2018SP | Trilha Mobile - Digital Wallets - Seguranca, inovacao e tendencia
TDC2018SP | Trilha Mobile - Digital Wallets - Seguranca, inovacao e tendencia
tdc-globalcode316 views
TDC2018SP | Trilha .Net - Real Time apps com Azure SignalR Service by tdc-globalcode
TDC2018SP | Trilha .Net - Real Time apps com Azure SignalR ServiceTDC2018SP | Trilha .Net - Real Time apps com Azure SignalR Service
TDC2018SP | Trilha .Net - Real Time apps com Azure SignalR Service
tdc-globalcode182 views
TDC2018SP | Trilha .Net - Passado, Presente e Futuro do .NET by tdc-globalcode
TDC2018SP | Trilha .Net - Passado, Presente e Futuro do .NETTDC2018SP | Trilha .Net - Passado, Presente e Futuro do .NET
TDC2018SP | Trilha .Net - Passado, Presente e Futuro do .NET
tdc-globalcode227 views
TDC2018SP | Trilha .Net - Novidades do C# 7 e 8 by tdc-globalcode
TDC2018SP | Trilha .Net - Novidades do C# 7 e 8TDC2018SP | Trilha .Net - Novidades do C# 7 e 8
TDC2018SP | Trilha .Net - Novidades do C# 7 e 8
tdc-globalcode203 views
TDC2018SP | Trilha .Net - Obtendo metricas com TDD utilizando build automatiz... by tdc-globalcode
TDC2018SP | Trilha .Net - Obtendo metricas com TDD utilizando build automatiz...TDC2018SP | Trilha .Net - Obtendo metricas com TDD utilizando build automatiz...
TDC2018SP | Trilha .Net - Obtendo metricas com TDD utilizando build automatiz...
tdc-globalcode147 views
TDC2018SP | Trilha .Net - .NET funcional com F# by tdc-globalcode
TDC2018SP | Trilha .Net - .NET funcional com F#TDC2018SP | Trilha .Net - .NET funcional com F#
TDC2018SP | Trilha .Net - .NET funcional com F#
tdc-globalcode161 views
TDC2018SP | Trilha .Net - Crie SPAs com Razor e C# usando Blazor em .Net Core by tdc-globalcode
TDC2018SP | Trilha .Net - Crie SPAs com Razor e C# usando Blazor  em .Net CoreTDC2018SP | Trilha .Net - Crie SPAs com Razor e C# usando Blazor  em .Net Core
TDC2018SP | Trilha .Net - Crie SPAs com Razor e C# usando Blazor em .Net Core
tdc-globalcode107 views

Recently uploaded

2 - Você estudou as principais teorias pedagógicas para prática de educação. ... by
2 - Você estudou as principais teorias pedagógicas para prática de educação. ...2 - Você estudou as principais teorias pedagógicas para prática de educação. ...
2 - Você estudou as principais teorias pedagógicas para prática de educação. ...azulassessoriaacadem3
65 views3 slides
Você é um(a) assistente social trabalhando em um Centro de Referência da Assi... by
Você é um(a) assistente social trabalhando em um Centro de Referência da Assi...Você é um(a) assistente social trabalhando em um Centro de Referência da Assi...
Você é um(a) assistente social trabalhando em um Centro de Referência da Assi...azulassessoriaacadem3
41 views4 slides
A Lei da Libras nº 10.436, de 24 de abril de 2002 reconhece a Língua Brasilei... by
A Lei da Libras nº 10.436, de 24 de abril de 2002 reconhece a Língua Brasilei...A Lei da Libras nº 10.436, de 24 de abril de 2002 reconhece a Língua Brasilei...
A Lei da Libras nº 10.436, de 24 de abril de 2002 reconhece a Língua Brasilei...pauladiasuni
62 views2 slides
a) ​DETERMINE quais as funções dos conceitos T1 e T2 e suas principais difere... by
a) ​DETERMINE quais as funções dos conceitos T1 e T2 e suas principais difere...a) ​DETERMINE quais as funções dos conceitos T1 e T2 e suas principais difere...
a) ​DETERMINE quais as funções dos conceitos T1 e T2 e suas principais difere...HelpEducacional
19 views2 slides
Etapa 3: - Definindo a localização da extremidade da sonda, ou seja, se vai f... by
Etapa 3: - Definindo a localização da extremidade da sonda, ou seja, se vai f...Etapa 3: - Definindo a localização da extremidade da sonda, ou seja, se vai f...
Etapa 3: - Definindo a localização da extremidade da sonda, ou seja, se vai f...azulassessoriaacadem3
44 views2 slides
python_funcional.pdf by
python_funcional.pdfpython_funcional.pdf
python_funcional.pdfronaldo ramos
19 views67 slides

Recently uploaded(20)

2 - Você estudou as principais teorias pedagógicas para prática de educação. ... by azulassessoriaacadem3
2 - Você estudou as principais teorias pedagógicas para prática de educação. ...2 - Você estudou as principais teorias pedagógicas para prática de educação. ...
2 - Você estudou as principais teorias pedagógicas para prática de educação. ...
Você é um(a) assistente social trabalhando em um Centro de Referência da Assi... by azulassessoriaacadem3
Você é um(a) assistente social trabalhando em um Centro de Referência da Assi...Você é um(a) assistente social trabalhando em um Centro de Referência da Assi...
Você é um(a) assistente social trabalhando em um Centro de Referência da Assi...
A Lei da Libras nº 10.436, de 24 de abril de 2002 reconhece a Língua Brasilei... by pauladiasuni
A Lei da Libras nº 10.436, de 24 de abril de 2002 reconhece a Língua Brasilei...A Lei da Libras nº 10.436, de 24 de abril de 2002 reconhece a Língua Brasilei...
A Lei da Libras nº 10.436, de 24 de abril de 2002 reconhece a Língua Brasilei...
pauladiasuni62 views
a) ​DETERMINE quais as funções dos conceitos T1 e T2 e suas principais difere... by HelpEducacional
a) ​DETERMINE quais as funções dos conceitos T1 e T2 e suas principais difere...a) ​DETERMINE quais as funções dos conceitos T1 e T2 e suas principais difere...
a) ​DETERMINE quais as funções dos conceitos T1 e T2 e suas principais difere...
HelpEducacional19 views
Etapa 3: - Definindo a localização da extremidade da sonda, ou seja, se vai f... by azulassessoriaacadem3
Etapa 3: - Definindo a localização da extremidade da sonda, ou seja, se vai f...Etapa 3: - Definindo a localização da extremidade da sonda, ou seja, se vai f...
Etapa 3: - Definindo a localização da extremidade da sonda, ou seja, se vai f...
Slides Lição 11, Betel, O Verdadeiro Discípulo é uma referência no serviço cr... by LuizHenriquedeAlmeid6
Slides Lição 11, Betel, O Verdadeiro Discípulo é uma referência no serviço cr...Slides Lição 11, Betel, O Verdadeiro Discípulo é uma referência no serviço cr...
Slides Lição 11, Betel, O Verdadeiro Discípulo é uma referência no serviço cr...
a) Estruturar o Balancete de Verificação da empresa Estilo Chic Ltda. ordenan... by HelpEducacional
a) Estruturar o Balancete de Verificação da empresa Estilo Chic Ltda. ordenan...a) Estruturar o Balancete de Verificação da empresa Estilo Chic Ltda. ordenan...
a) Estruturar o Balancete de Verificação da empresa Estilo Chic Ltda. ordenan...
HelpEducacional366 views
Slides Lição 12, CPAD, O Modelo de Missões da Igreja de Antioquia.pptx by LuizHenriquedeAlmeid6
Slides Lição 12, CPAD, O Modelo de Missões da Igreja de Antioquia.pptxSlides Lição 12, CPAD, O Modelo de Missões da Igreja de Antioquia.pptx
Slides Lição 12, CPAD, O Modelo de Missões da Igreja de Antioquia.pptx
28-11-2023 - Reflexions sessió.pdf by RaulGomez822561
28-11-2023 - Reflexions sessió.pdf28-11-2023 - Reflexions sessió.pdf
28-11-2023 - Reflexions sessió.pdf
RaulGomez82256127 views
ATIVIDADE 1 - RH - PSICOLOGIA ORGANIZACIONAL - 54/2023 by IntegrareAcademy2
ATIVIDADE 1 - RH - PSICOLOGIA ORGANIZACIONAL - 54/2023ATIVIDADE 1 - RH - PSICOLOGIA ORGANIZACIONAL - 54/2023
ATIVIDADE 1 - RH - PSICOLOGIA ORGANIZACIONAL - 54/2023
Agora é o momento de estudarmos sobre a história da sua futura profissão, par... by IntegrareAcademy2
Agora é o momento de estudarmos sobre a história da sua futura profissão, par...Agora é o momento de estudarmos sobre a história da sua futura profissão, par...
Agora é o momento de estudarmos sobre a história da sua futura profissão, par...
4. No vídeo “Cadela aprende libras para entender comando dos donos” foi apres... by IntegrareAcademy2
4. No vídeo “Cadela aprende libras para entender comando dos donos” foi apres...4. No vídeo “Cadela aprende libras para entender comando dos donos” foi apres...
4. No vídeo “Cadela aprende libras para entender comando dos donos” foi apres...
Etapa 2: a segunda etapa da seleção consiste em definir a forma de pagamento ... by azulassessoriaacadem3
Etapa 2: a segunda etapa da seleção consiste em definir a forma de pagamento ...Etapa 2: a segunda etapa da seleção consiste em definir a forma de pagamento ...
Etapa 2: a segunda etapa da seleção consiste em definir a forma de pagamento ...
4) Explique a diferença dos coxibes em relação aos AINEs convencionais, consi... by HelpEducacional
4) Explique a diferença dos coxibes em relação aos AINEs convencionais, consi...4) Explique a diferença dos coxibes em relação aos AINEs convencionais, consi...
4) Explique a diferença dos coxibes em relação aos AINEs convencionais, consi...
HelpEducacional38 views
3- Levando em consideração suas respostas anteriores, qual o pré-diagnóstico ... by azulassessoriaacadem3
3- Levando em consideração suas respostas anteriores, qual o pré-diagnóstico ...3- Levando em consideração suas respostas anteriores, qual o pré-diagnóstico ...
3- Levando em consideração suas respostas anteriores, qual o pré-diagnóstico ...

TDC2018SP | Trilha Go - Entendendo alocacao de memoria no Go

  • 1. Entendendo alocação de memória no Go André Carvalho @andresantostc 1
  • 3. 3
  • 4. Por que? ● Conhecer os trade-offs ● Conhecer uma camada de abstração abaixo ● Porque não? 4
  • 5. func main() { rand.Seed(time.Now().UnixNano()) i := rand.Intn(100) fmt.Printf("%v at %pn", i, &i) for { } } 5
  • 6. 6 $ ./vmemory 53 at 0xc420016110 $ ./vmemory 68 at 0xc420016110 Rodando o programa duas vezes ao mesmo tempo... Mesmo endereço
  • 7. Memória Virtual ● Processos não leem diretamente da memória física ○ Segurança ○ Coordenação entre múltiplos processos ● Memória Virtual abstrai isso dos processos ○ Segmentation ○ Page tables 7
  • 8. Memória Virtual 8 Frame 0 Frame 1 Frame 2 Frame 3 Frame 4 Frame 5 Frame 6 Frame 7 RAM Disk Other process Page 0 Page 1 Page 2 Page 3 Page 4 Page 5 Page 6 Page 7 Page Process Frame Page Table 3 6
  • 9. Layout de um Processo 9 Text Data Heap BSS Stack Program Break Code Initialized static variables Uninitialized static variables Dynamic allocated variables Function stack frames
  • 10. Alocação na Stack 10 Stack Used Stack Pointer (SP) Unused Allocation SP += size; return Stack[SP-size]; Deallocation SP -= size;
  • 11. Alocação na Heap ● Objetos com tamanho conhecido apenas em tempo de execução ● C tem malloc e free ● C++ tem new e delete ● Go usa escape analysis e garbage collection 11
  • 13. Alocador Simples Precisamos implementar duas funções 13 void* malloc(size_t size) void free(void *ptr)
  • 14. Alocador Simples 14 Application Allocator OS malloc mmap Alocador utiliza syscalls como mmap/munmap para falar com o OS munmap madvisefree
  • 15. Alocador Simples Lista encadeada de objetos disponíveis size=n next=* Header n bytes size=m next=nil m bytes 15 Head
  • 16. Alocador Simples - Alocação malloc(10) 16 Head NULL
  • 17. Alocador Simples 17 Virtual Address Space 0x000000c000000000 mmap( 0x000000c000000000, 4096, PROT_WRITE | PROT_READ, MAP_PRIVATE | MAP_ANONYMOUS, ...) Start Address Size Permission Flags
  • 18. Alocador Simples - Alocação malloc(10) 18 4084 12 4084 4096 Head
  • 19. Alocador Simples - Alocação malloc(10) 19 4062Head 10 22
  • 20. Alocador Simples - Alocação malloc(10) 20 4062Head 10 P Allocator returns p, which points right after the header
  • 21. 21 Alocador Simples - Desalocação 4062Head free(p) 10
  • 22. free(p) 10 p - size(header) 22 Alocador Simples - Desalocação 4062Head
  • 23. Alocador Simples ● Pode ser implementado em algumas centenas de LOCs ● Questões não endereçadas ○ Fragmentação ○ Devolver memória para o OS ■ Quando? ■ Como? munmap, madvise... ○ Multi-thread ○ ... 23
  • 24. Go Runtime Allocator 24 ● TCMalloc ● Invocando o Alocador ● Go’s Allocator
  • 25. Thread-Caching Malloc (TCMalloc) ● Implementado originalmente em C pelo Google ● Serve como base para o algoritmo usado pelo Go ● Diminui lock-contention em programas multi-threaded 25
  • 26. TCMalloc ● Cada thread tem um cache local ● Dois tipos de alocação ○ Small allocations (<= 32 kB) ○ Large allocations 26
  • 27. TCMalloc - Small Allocations ● Atendidas pelo cache local da thread ● Tamanho é arredondado para o de uma das classes 27 malloc(965 bytes) ⇒ malloc(1024 bytes) malloc(1023 bytes) ⇒ malloc(1024 bytes)
  • 28. TCMalloc - Small Allocations Class 0 Class 1 Class 2 ... Local Thread Cache 28
  • 29. TCMalloc - Small Allocations Class 0 Class 1 Class 2 ... Local Thread Cache 29
  • 30. TCMalloc - Small Allocations Class 0 Class 1 Class 2 ... Local Thread Cache Span Span Span ... Central Free List Class 1 30 Run of contiguous pagesSpan
  • 31. TCMalloc - Small Allocations Class 0 Class 1 Class 2 ... Local Thread Cache Span Span Span ... Central Free List Class 1 31
  • 32. TCMalloc - Small Allocations Span Span Span Central Free List Class X Span 1 page 2 pages ... > 255 pages Span Span Span Span Span Span Span Central Heap 32
  • 33. TCMalloc - Small Allocations Span Span Span Central Free List Class X Span 1 page 2 pages ... > 255 pages Span Span Span Span Span Span Central Heap Span ... 33 Span
  • 34. TCMalloc - Small Allocations Application Local Thread Cache Central Free List Central Heap 4 bytes N 8-byte objects X pages OS Y*X pages 34 X pages N 8-byte objects Y*X pages
  • 35. TCMalloc - Large Allocations ● Atendidas pela Heap central ● Tamanho é arredondado para numero de paginas 35 malloc(34 kB) ⇒ malloc(36 kB) ⇒ 9 pages malloc(33 kB) ⇒ malloc(36 kB) ⇒ 9 pages
  • 36. TCMalloc - Large Allocations 1 page 2 pages ... > 255 pages Span Span Span Span Span Span Central Heap Span Span 36
  • 37. TCMalloc - Deallocation Page 1 Page 2 Page 3 Page 4 Page 5 Page 6 Span A Span B Span C 37
  • 39. TCMalloc - Deallocation free( ) Page Span Class 0 Class 1 Class 2 ... Local Thread Cache Small object 39
  • 40. TCMalloc - Deallocation free( ) Page Span Large object Page 1 Page 2 Page 3 Page 4 Span A Span B Span C 40
  • 41. TCMalloc - Deallocation free( ) Page Span Large object Page 1 Page 2 Page 3 Page 4 Span A Span B 41
  • 42. TCMalloc - Deallocation free( ) Page Span Large object 1 page 2 pages ... > 255 pages Span B Central Heap 42
  • 43. TCMalloc - Deallocation free( ) Page Span Large object 1 page 2 pages ... > 255 pages Span B Central Heap 43
  • 44. Go Runtime Allocator 44 ● TCMalloc ● Invocando o Alocador ● Go’s Allocator
  • 45. package main func main() { f() } //go:noinline func f() *int { i := 10 return &i } 45
  • 46. package main func main() { f() } //go:noinline func f() *int { i := 10 return &i } 46 $ go build -gcflags "-m -m" main.go # command-line-arguments ./main.go:8:6: cannot inline f: marked go:noinline ./main.go:3:6: cannot inline main: non-leaf function ./main.go:10:9: &i escapes to heap ./main.go:10:9: from ~r0 (return) at ./main.go:10:2 ./main.go:9:2: moved to heap: i
  • 47. 47 $ go tool compile -S main.go ... 0x001d 00029 (main.go:9) LEAQ type.int(SB), AX 0x0024 00036 (main.go:9) MOVQ AX, (SP) 0x0028 00040 (main.go:9) PCDATA $0, $0 0x0028 00040 (main.go:9) CALL runtime.newobject(SB) ...
  • 48. 48 $ go tool compile -S main.go ... 0x001d 00029 (main.go:9) LEAQ type.int(SB), AX 0x0024 00036 (main.go:9) MOVQ AX, (SP) 0x0028 00040 (main.go:9) PCDATA $0, $0 0x0028 00040 (main.go:9) CALL runtime.newobject(SB) ... func newobject(typ *_type) unsafe.Pointer { return mallocgc(typ.size, typ, true) }
  • 49. Go Runtime Allocator 49 ● TCMalloc ● Invoking the Allocator ● Go’s Allocator
  • 50. Go’s Allocator ● Acoplado ao GC e outras partes do runtime ○ Difícil de trocar por outras implementações ● Três tipos de alocação ○ Tiny Allocations (no pointers, size < 16 bytes) ○ Small Allocations (size <= 32 kbytes) ○ Large Allocations 50
  • 51. Go’s Allocator - Large Allocations 51 1 page 2 pages ... > 255 pages Span Span Span Span Span Spanmheap Busy Spans Span Span Span Antes de alocar, mheap faz o sweep do mesmo número de paginas
  • 52. Go’s Allocator - Large Allocations 52 1 page 2 pages ... > 255 pages Span Span Span Span Span Span Span Span Span Span Span mheap Free Spans
  • 53. Go’s Allocator - Large Allocations 53 1 page 2 pages ... > 255 pages Span Span Span Span Span Span mheap Free Spans Span Span Span Span Span mtreap ⇒ randomized binary tree
  • 54. Go’s Allocator - Large Allocations 54 Depois de alocar, dependendo da quantidade de memória em uso... ● A goroutine pode ter que trabalhar para o GC ● Stop the World
  • 55. Go’s Allocator - Small Allocations 55 P1 mcache Cada processador lógico (P) tem um cache local (mcache) P2 mcache
  • 56. Go’s Allocator - Small Allocations 56 P1 P2 mcache mcache Cada mcache mantem um span para cada tamanho (size class) Span Span ... class 1 class 2 Span Span ... class 1 class 2
  • 57. Go’s Allocator - Small Allocations 57 class bytes/obj bytes/span objects 1 8 8192 1024 2 16 8192 512 3 32 8192 256 4 64 8192 170 ... 65 28672 57344 2 66 32768 32768 1
  • 58. Go’s Allocator - Small Allocations 58 P1 mcache mcache retorna o endereço de um objeto livre no span Span Span ... class 1 class 2 Span
  • 59. Go’s Allocator - Small Allocations 59 P1 mcache mcache pede um novo span para o mcentral dessa size class Span Span ... class 1 class 2 Span
  • 60. Go’s Allocator - Small Allocations 60 P1 mcache Cada mcentral tem duas listas, empty e nonempty spans Span Span ... ... class 1 class 2 mcentral mcentral Span Span Span Span
  • 61. Go’s Allocator - Small Allocations 61 P1 mcache Span com objetos livres vai ser entregue ao mcache Span ... ... class 1 class 2 mcentral mcentral Span Span Span Span
  • 62. Go’s Allocator - Small Allocations 62 P1 mcache mcentral vai tentar fazer sweep de spans vazios Span Span ... ... class 1 class 2 mcentral mcentral Span Span If there are no nonempty spans….
  • 63. Go’s Allocator - Small Allocations 63 Se nada funciona, mcentral vai pedir um novo span para a mheap class 0 mcentral Span Span mheap
  • 64. Go’s Allocator - Small Allocations 64 mcentral vai dar esse span para a mcache class 0 mcentral Span Span mheapSpan
  • 65. Go’s Allocator - Tiny Allocations Alocações para objetos sem pointers menores que < 16 bytes The main targets of tiny allocator are small strings and standalone escaping variables. On a json benchmark the allocator reduces number of allocations by ~12% and reduces heap size by ~20%. 65
  • 66. 66 Go’s Allocator - Tiny Allocations 64 bytes Allocated Free Allocated Free ● Cada P mantem um objeto de 64-bytes que foi alocado de um span ● Cada tiny allocation adiciona um subobjeto ao final do objeto ● O GC não sabe sobre esses subobjetos!
  • 67. 67 Go’s Allocator - Tiny Allocations Allocated Free mcache P1 ● Pega um novo bloco do mcache ≃ small allocation ● Eventualmente, o GC vai coletar o bloco antigo FreeP1 mcache
  • 68. Garbage Collector ⇒ Concurrent mark and sweep 68 Go’s Allocator - Sweeping 1. Scan all objects 2. Mark objects that are live 3. Sweep objects that are not live
  • 69. ● Runtime periodicamente devolve memória ao OS ● Devolve spans que foram garbage collected a mais de 5 minutos ● No Linux, usa a syscall madvise(2) 69 Go’s Allocator - Devolvendo memória ao OS madvise(addr, size, _MADV_DONTNEED)
  • 71. 71 stats := runtime.MemStats{} runtime.ReadMemStats(&stats) type MemStats struct { ... // Heap memory statistics. HeapAlloc uint64 HeapSys uint64 HeapIdle uint64 HeapInuse uint64 HeapReleased uint64 HeapObjects uint64 ... }
  • 72. Referências 1. http://goog-perftools.sourceforge.net/doc/tcmalloc.html 2. https://www.ardanlabs.com/blog/2017/05/language-mechanics-on-stacks-and-pointers.html 3. https://gabrieletolomei.wordpress.com/miscellanea/operating-systems/in-memory-layout/ 4. Lec 10 | MIT 6.172 Performance Engineering of Software Systems, Fall 2010 5. https://faculty.washington.edu/aragon/pubs/rst89.pdf 6. http://man7.org/linux/man-pages/man2/mmap.2.html 7. http://man7.org/linux/man-pages/man2/madvise.2.html 8. https://github.com/andrestc/linux-prog/blob/master/ch7/malloc.c 72