SlideShare une entreprise Scribd logo
1  sur  73
Télécharger pour lire hors ligne
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

Contenu connexe

Similaire à TDC2018SP | Trilha Go - Entendendo alocacao de memoria no Go

Paradigmas de Linguagens de Programação - Gerenciamento de Memória em Java
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
Adriano Teixeira de Souza
 
Particionamento cassandra
Particionamento   cassandraParticionamento   cassandra
Particionamento cassandra
serdg
 

Similaire à TDC2018SP | Trilha Go - Entendendo alocacao de memoria no Go (20)

Limites modelo normal_2016
Limites modelo normal_2016Limites modelo normal_2016
Limites modelo normal_2016
 
Inteligencia artificial 2
Inteligencia artificial 2Inteligencia artificial 2
Inteligencia artificial 2
 
Imergindo jvm[Apresentação ]
Imergindo jvm[Apresentação ]Imergindo jvm[Apresentação ]
Imergindo jvm[Apresentação ]
 
Aa booklet
Aa bookletAa booklet
Aa booklet
 
Inpe
InpeInpe
Inpe
 
C Sharp - Gerenciamento de Memória
C Sharp - Gerenciamento de MemóriaC Sharp - Gerenciamento de Memória
C Sharp - Gerenciamento de Memória
 
Apostila curso matlab
Apostila curso matlabApostila curso matlab
Apostila curso matlab
 
Deep Learning
Deep LearningDeep Learning
Deep Learning
 
Paradigmas de Linguagens de Programação - Gerenciamento de Memória em Java
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 ...
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 ...
 
Algoritmos de Agrupamento - Aprendizado não supervisionado
Algoritmos de Agrupamento - Aprendizado não supervisionadoAlgoritmos de Agrupamento - Aprendizado não supervisionado
Algoritmos de Agrupamento - Aprendizado não supervisionado
 
Projeto de Elasticidade e Evolução do Projeto FIBRE
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
 
Gfs slides
Gfs slidesGfs slides
Gfs slides
 
Fit Metrocamp 2016
Fit Metrocamp 2016Fit Metrocamp 2016
Fit Metrocamp 2016
 
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ó
Otimização em Unity: fazendo seu jogo rodar no PC da sua avó
 
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!
Computação Manycore: Uma Arquitetura muito além do Multicore!
 
Particionamento cassandra
Particionamento   cassandraParticionamento   cassandra
Particionamento cassandra
 
Se você é .NET, você é NETDUINO - TDC 2013 - Porto Alegre
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
 
Arq orgcom (1)
Arq orgcom (1)Arq orgcom (1)
Arq orgcom (1)
 
ArqOrgCom.ppt
ArqOrgCom.pptArqOrgCom.ppt
ArqOrgCom.ppt
 

Plus de tdc-globalcode

Plus de tdc-globalcode (20)

TDC2019 Intel Software Day - Visao Computacional e IA a servico da humanidade
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
 
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...
TDC2019 Intel Software Day - Tecnicas de Programacao Paralela em Machine Lear...
 
TDC2019 Intel Software Day - ACATE - Cases de Sucesso
TDC2019 Intel Software Day - ACATE - Cases de SucessoTDC2019 Intel Software Day - ACATE - Cases de Sucesso
TDC2019 Intel Software Day - ACATE - Cases de Sucesso
 
TDC2019 Intel Software Day - Otimizacao grafica com o Intel GPA
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
 
TDC2019 Intel Software Day - Deteccao de objetos em tempo real com OpenVino
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
 
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...
TDC2019 Intel Software Day - OpenCV: Inteligencia artificial e Visao Computac...
 
TDC2019 Intel Software Day - Inferencia de IA em edge devices
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
 
Trilha BigData - Banco de Dados Orientado a Grafos na Seguranca Publica
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
 
Trilha .Net - Programacao funcional usando f#
Trilha .Net - Programacao funcional usando f#Trilha .Net - Programacao funcional usando f#
Trilha .Net - Programacao funcional usando f#
 
TDC2018SP | Trilha Go - Case Easylocus
TDC2018SP | Trilha Go - Case EasylocusTDC2018SP | Trilha Go - Case Easylocus
TDC2018SP | Trilha Go - Case Easylocus
 
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?
TDC2018SP | Trilha Modern Web - Para onde caminha a Web?
 
TDC2018SP | Trilha Go - Clean architecture em Golang
TDC2018SP | Trilha Go - Clean architecture em GolangTDC2018SP | Trilha Go - Clean architecture em Golang
TDC2018SP | Trilha Go - Clean architecture em Golang
 
TDC2018SP | Trilha Go - "Go" tambem e linguagem de QA
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
 
TDC2018SP | Trilha Mobile - Digital Wallets - Seguranca, inovacao e tendencia
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
 
TDC2018SP | Trilha .Net - Real Time apps com Azure SignalR Service
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
 
TDC2018SP | Trilha .Net - Passado, Presente e Futuro do .NET
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
 
TDC2018SP | Trilha .Net - Novidades do C# 7 e 8
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
 
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...
TDC2018SP | Trilha .Net - Obtendo metricas com TDD utilizando build automatiz...
 
TDC2018SP | Trilha .Net - .NET funcional com F#
TDC2018SP | Trilha .Net - .NET funcional com F#TDC2018SP | Trilha .Net - .NET funcional com F#
TDC2018SP | Trilha .Net - .NET funcional com F#
 
TDC2018SP | 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 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
 

Dernier

Considere a seguinte situação fictícia: Durante uma reunião de equipe em uma...
Considere a seguinte situação fictícia:  Durante uma reunião de equipe em uma...Considere a seguinte situação fictícia:  Durante uma reunião de equipe em uma...
Considere a seguinte situação fictícia: Durante uma reunião de equipe em uma...
azulassessoria9
 
PROVA - ESTUDO CONTEMPORÂNEO E TRANSVERSAL: COMUNICAÇÃO ASSERTIVA E INTERPESS...
PROVA - ESTUDO CONTEMPORÂNEO E TRANSVERSAL: COMUNICAÇÃO ASSERTIVA E INTERPESS...PROVA - ESTUDO CONTEMPORÂNEO E TRANSVERSAL: COMUNICAÇÃO ASSERTIVA E INTERPESS...
PROVA - ESTUDO CONTEMPORÂNEO E TRANSVERSAL: COMUNICAÇÃO ASSERTIVA E INTERPESS...
azulassessoria9
 
Revolução russa e mexicana. Slides explicativos e atividades
Revolução russa e mexicana. Slides explicativos e atividadesRevolução russa e mexicana. Slides explicativos e atividades
Revolução russa e mexicana. Slides explicativos e atividades
FabianeMartins35
 
421243121-Apostila-Ensino-Religioso-Do-1-ao-5-ano.pdf
421243121-Apostila-Ensino-Religioso-Do-1-ao-5-ano.pdf421243121-Apostila-Ensino-Religioso-Do-1-ao-5-ano.pdf
421243121-Apostila-Ensino-Religioso-Do-1-ao-5-ano.pdf
LeloIurk1
 
Teoria heterotrófica e autotrófica dos primeiros seres vivos..pptx
Teoria heterotrófica e autotrófica dos primeiros seres vivos..pptxTeoria heterotrófica e autotrófica dos primeiros seres vivos..pptx
Teoria heterotrófica e autotrófica dos primeiros seres vivos..pptx
TailsonSantos1
 
PROVA - ESTUDO CONTEMPORÂNEO E TRANSVERSAL: COMUNICAÇÃO ASSERTIVA E INTERPESS...
PROVA - ESTUDO CONTEMPORÂNEO E TRANSVERSAL: COMUNICAÇÃO ASSERTIVA E INTERPESS...PROVA - ESTUDO CONTEMPORÂNEO E TRANSVERSAL: COMUNICAÇÃO ASSERTIVA E INTERPESS...
PROVA - ESTUDO CONTEMPORÂNEO E TRANSVERSAL: COMUNICAÇÃO ASSERTIVA E INTERPESS...
azulassessoria9
 

Dernier (20)

Currículo - Ícaro Kleisson - Tutor acadêmico.pdf
Currículo - Ícaro Kleisson - Tutor acadêmico.pdfCurrículo - Ícaro Kleisson - Tutor acadêmico.pdf
Currículo - Ícaro Kleisson - Tutor acadêmico.pdf
 
Considere a seguinte situação fictícia: Durante uma reunião de equipe em uma...
Considere a seguinte situação fictícia:  Durante uma reunião de equipe em uma...Considere a seguinte situação fictícia:  Durante uma reunião de equipe em uma...
Considere a seguinte situação fictícia: Durante uma reunião de equipe em uma...
 
Construção (C)erta - Nós Propomos! Sertã
Construção (C)erta - Nós Propomos! SertãConstrução (C)erta - Nós Propomos! Sertã
Construção (C)erta - Nós Propomos! Sertã
 
Historia da Arte europeia e não só. .pdf
Historia da Arte europeia e não só. .pdfHistoria da Arte europeia e não só. .pdf
Historia da Arte europeia e não só. .pdf
 
PROJETO DE EXTENSÃO I - SERVIÇOS JURÍDICOS, CARTORÁRIOS E NOTARIAIS.pdf
PROJETO DE EXTENSÃO I - SERVIÇOS JURÍDICOS, CARTORÁRIOS E NOTARIAIS.pdfPROJETO DE EXTENSÃO I - SERVIÇOS JURÍDICOS, CARTORÁRIOS E NOTARIAIS.pdf
PROJETO DE EXTENSÃO I - SERVIÇOS JURÍDICOS, CARTORÁRIOS E NOTARIAIS.pdf
 
PROVA - ESTUDO CONTEMPORÂNEO E TRANSVERSAL: COMUNICAÇÃO ASSERTIVA E INTERPESS...
PROVA - ESTUDO CONTEMPORÂNEO E TRANSVERSAL: COMUNICAÇÃO ASSERTIVA E INTERPESS...PROVA - ESTUDO CONTEMPORÂNEO E TRANSVERSAL: COMUNICAÇÃO ASSERTIVA E INTERPESS...
PROVA - ESTUDO CONTEMPORÂNEO E TRANSVERSAL: COMUNICAÇÃO ASSERTIVA E INTERPESS...
 
PROJETO DE EXTENSÃO - EDUCAÇÃO FÍSICA BACHARELADO.pdf
PROJETO DE EXTENSÃO - EDUCAÇÃO FÍSICA BACHARELADO.pdfPROJETO DE EXTENSÃO - EDUCAÇÃO FÍSICA BACHARELADO.pdf
PROJETO DE EXTENSÃO - EDUCAÇÃO FÍSICA BACHARELADO.pdf
 
Revolução russa e mexicana. Slides explicativos e atividades
Revolução russa e mexicana. Slides explicativos e atividadesRevolução russa e mexicana. Slides explicativos e atividades
Revolução russa e mexicana. Slides explicativos e atividades
 
Recomposiçao em matematica 1 ano 2024 - ESTUDANTE 1ª série.pdf
Recomposiçao em matematica 1 ano 2024 - ESTUDANTE 1ª série.pdfRecomposiçao em matematica 1 ano 2024 - ESTUDANTE 1ª série.pdf
Recomposiçao em matematica 1 ano 2024 - ESTUDANTE 1ª série.pdf
 
planejamento_estrategico_-_gestao_2021-2024_16015654.pdf
planejamento_estrategico_-_gestao_2021-2024_16015654.pdfplanejamento_estrategico_-_gestao_2021-2024_16015654.pdf
planejamento_estrategico_-_gestao_2021-2024_16015654.pdf
 
Nós Propomos! " Pinhais limpos, mundo saudável"
Nós Propomos! " Pinhais limpos, mundo saudável"Nós Propomos! " Pinhais limpos, mundo saudável"
Nós Propomos! " Pinhais limpos, mundo saudável"
 
421243121-Apostila-Ensino-Religioso-Do-1-ao-5-ano.pdf
421243121-Apostila-Ensino-Religioso-Do-1-ao-5-ano.pdf421243121-Apostila-Ensino-Religioso-Do-1-ao-5-ano.pdf
421243121-Apostila-Ensino-Religioso-Do-1-ao-5-ano.pdf
 
Teoria heterotrófica e autotrófica dos primeiros seres vivos..pptx
Teoria heterotrófica e autotrófica dos primeiros seres vivos..pptxTeoria heterotrófica e autotrófica dos primeiros seres vivos..pptx
Teoria heterotrófica e autotrófica dos primeiros seres vivos..pptx
 
About Vila Galé- Cadeia Empresarial de Hotéis
About Vila Galé- Cadeia Empresarial de HotéisAbout Vila Galé- Cadeia Empresarial de Hotéis
About Vila Galé- Cadeia Empresarial de Hotéis
 
Jogo de Rimas - Para impressão em pdf a ser usado para crianças
Jogo de Rimas - Para impressão em pdf a ser usado para criançasJogo de Rimas - Para impressão em pdf a ser usado para crianças
Jogo de Rimas - Para impressão em pdf a ser usado para crianças
 
PROVA - ESTUDO CONTEMPORÂNEO E TRANSVERSAL: COMUNICAÇÃO ASSERTIVA E INTERPESS...
PROVA - ESTUDO CONTEMPORÂNEO E TRANSVERSAL: COMUNICAÇÃO ASSERTIVA E INTERPESS...PROVA - ESTUDO CONTEMPORÂNEO E TRANSVERSAL: COMUNICAÇÃO ASSERTIVA E INTERPESS...
PROVA - ESTUDO CONTEMPORÂNEO E TRANSVERSAL: COMUNICAÇÃO ASSERTIVA E INTERPESS...
 
Projeto de Extensão - ENGENHARIA DE SOFTWARE - BACHARELADO.pdf
Projeto de Extensão - ENGENHARIA DE SOFTWARE - BACHARELADO.pdfProjeto de Extensão - ENGENHARIA DE SOFTWARE - BACHARELADO.pdf
Projeto de Extensão - ENGENHARIA DE SOFTWARE - BACHARELADO.pdf
 
Slides Lição 6, CPAD, As Nossas Armas Espirituais, 2Tr24.pptx
Slides Lição 6, CPAD, As Nossas Armas Espirituais, 2Tr24.pptxSlides Lição 6, CPAD, As Nossas Armas Espirituais, 2Tr24.pptx
Slides Lição 6, CPAD, As Nossas Armas Espirituais, 2Tr24.pptx
 
PROJETO DE EXTENSÃO I - TERAPIAS INTEGRATIVAS E COMPLEMENTARES.pdf
PROJETO DE EXTENSÃO I - TERAPIAS INTEGRATIVAS E COMPLEMENTARES.pdfPROJETO DE EXTENSÃO I - TERAPIAS INTEGRATIVAS E COMPLEMENTARES.pdf
PROJETO DE EXTENSÃO I - TERAPIAS INTEGRATIVAS E COMPLEMENTARES.pdf
 
COMPETÊNCIA 2 da redação do enem prodção textual professora vanessa cavalcante
COMPETÊNCIA 2 da redação do enem prodção textual professora vanessa cavalcanteCOMPETÊNCIA 2 da redação do enem prodção textual professora vanessa cavalcante
COMPETÊNCIA 2 da redação do enem prodção textual professora vanessa cavalcante
 

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