Ruby & GCs Entendendo Gerenciamento de Memória



Documentos relacionados
2.1. Princípios de garbage collection Garbage Collector

Garbage Collection. Automatic Garbage Collection. Introdução. Fontes

Gerência de Memória em Java Parte II: Monitoração e configuração da máquina virtual HotSpot

PADI 2015/16. Aula 1 Introdução à Plataforma.NET

Sistemas de Arquivos. Gerenciamento de Espaço em Disco

Introdução a POO. Introdução a Linguagem C++ e POO

Por dentro do Windows: Gerenciamento de Memória

Gerência de Memória em Java Parte I: Arquitetura da JVM e algoritmos de coleta de lixo

1ª versão. #include <stdio.h> #include <string.h> #include <stdlib.h> #define maxdiscos 1000

Algoritmos e Estruturas de Dados

Programação Estruturada I

Fundamentos de Programação

MC102 Algoritmos e programação de computadores Aula 3: Variáveis

Tipo de Dados em Linguagem C

Templates e Pilhas. 1. Introdução

Sistemas de Arquivos. André Luiz da Costa Carvalho

MC-102 Algoritmos e Programação de Computadores

Paradigmas da Programação PPROG. Linguagem JAVA. Interfaces. (Livro Big Java, Late Objects Capítulo 9) Nelson Freire (ISEP DEI-PPROG 2013/14) 1/33

DEPARTAMENTO DE ENGENHARIA INFORMÁTICA FACULDADE DE CIÊNCIAS E TECNOLOGIA DA UNIVERSIDADE DE COIMBRA

Programação Engenharia Informática (11543) 1º ano, 1º semestre Tecnologias e Sistemas de Informação (6619) 1º ano, 1º semestre

Algoritmos e Programação

Module Introduction. Programação. Cap. 10 Estruturas (Structs)

ESTRUTURAS DE DADOS I. Notas de Aula. Prof. Dr. Gilberto Nakamiti

Manual do Desenvolvedor Criptografia de Arquivos do WebTA

Programação por Objectos. Java

ITENS FUNDAMENTAIS. Profª Angélica da Silva Nunes

UNIVERSIDADE FEDERAL DE GOIÁS INSTITUTO DE INFORMÁTICA. Sistemas Distribuídos

ALOCAÇÃO DINÂMICA DE MEMÓRIA

Tabela de símbolos: tabelas de espalhamento

5.2 - Armazenamento em Disco

1. Fazer um programa em C que pergunta um valor em metros e imprime o correspondente em decímetros, centímetros e milímetros.

Curso Adonai QUESTÕES Disciplina Linguagem JAVA

LISTAS ENCADEADAS OU NÃO- SEQÜENCIAIS. Estrutura de Dados

Linguagem de Programação JAVA. Técnico em Informática Professora Michelle Nery

Estruturas de Dados. Parte dos slides a seguir são adaptações, extensões e traduções para C dos originais:

PROGRAMAÇÃO ORIENTADA A OBJETOS -TRATAMENTO DE EXCEÇÕES. Prof. Angelo Augusto Frozza, M.Sc. frozza@ifc-camboriu.edu.br

Básico: estrutura de programa, sintaxe Interface com linha de comando

Prof. Yandre Maldonado - 1 PONTEIROS. Prof. Yandre Maldonado e Gomes da Costa

Sistemas Operacionais

Análises Geração RI (representação intermediária) Código Intermediário

Fundamentos de Programação II. Introdução à linguagem de programação C++

INF 1007 Programação II

CONCEITOS DE LINGUAGEM DE PROGRAMAÇÃO CARACTERÍSTICAS. João Gabriel Ganem Barbosa

História. Nasceu em 1993, numa discussão entre Yuhikiro Matsumoto e um colega.

10. - ESTRUTURAS Características Básicas


Programação com Posix Threads

Ruby e Ruby on Rails

Linguagem C. Ponteiros. Alex Vidigal Bastos.

Pragmática das Linguagens de Programação 2004/2005

Linguagem C Tipos de Dados. void; escalares; sizeof Vectores; strings em C Estruturas Introdução ao pré-processador

Tutorial Gerência de memória em Java

Resumo da última aula. Compiladores. Tipos. Regras semânticas. Expressões de tipos. Análise Semântica e checagem de tipos.

Programação Orientada por Objetos

Sistemas Operativos. Gestão de memória. Rui Maranhão

Sistemas de Arquivos NTFS

Programação Orientada a Objetos C++

Estruturas de Dados. Introdução Definição de Ponteiros Declaração de Ponteiros em C Manipulação de Ponteiros em C

INTRODUÇÃO AO C++ SISTEMAS DE INFORMAÇÃO DR. EDNALDO B. PIZZOLATO

Novas Funcionalidades do LabVIEW 8.6. CompactRIO. André Oliveira Engenheiro de Vendas Alexandre Dias Engenheiro de Vendas

Aula 1 Tipo Abstrato de Dados

Variáveis e Comandos de Atribuição

PROCESSOS. Prof. Maicon A. Sartin

Bruno Hott Algoritmos e Estruturas de Dados I DECSI UFOP. Alocação Dinâmica de Memória

CES-11. Algoritmos e Estruturas de Dados. Carlos Alberto Alonso Sanches Juliana de Melo Bezerra

Práticas de Desenvolvimento de Software

Computadores de Programação (MAB353)

/*(Atenção: Em se tratando de uma lista estaticamente alocada, temos utilizado a estratégia de passa o tamanho máximo do vetor.)*/

Conceitos de Linguagens de Programação

Fundamentos de Programação

Experimentos com a memória cache do CPU

PROCESSOS COMPONENTES DE UM PROCESSO. A execução de um processo possui vários componentes. PID e PPID

Conceito de classe em C++

Fundamentos de Programação

Grupo I [4v] executaprograma();

BC Sistemas Operacionais Sistema de Arquivos (aula 10 Parte 2) Prof. Marcelo Z. do Nascimento

Keeper of Knowledge. Capítulo 1 Conceitos Básicos do Java

O COMPUTADOR. Introdução à Computação

Estrutura da linguagem de programação C Prof. Tiago Eugenio de Melo tiago@comunidadesol.org

Java Threads. Introdução

Algoritmos e Programação Estruturada

OBJETOS DISTRIBUÍDOS E INVOCAÇÃO REMOTA

Introdução. A verificação de tipos pode ser estática e dinâmica

Fundamentos de Programação 2

Sistema Operacional Ex: Complexo Computador multiusuário com vários terminais Tem que administrar todos os pedidos de usuários e assegurar que eles

Gerenciamento de memória

Tabelas Hash. Prof. Túlio Toffolo BCC202 Aulas 23 e 24 Algoritmos e Estruturas de Dados I

Listas ligadas/listas encadeadas

Alocação Dinâmica. Túlio Toffolo BCC202 Aula 02 Algoritmos e Estruturas de Dados I

César Henrique Bernabé João Mario Silva. Linguagens de Programação

Sumário. Armazenamento de dados. Tipos de dados dinâmicos. Exemplos. Vectores Vectores dinâmicos Dados dinamicos. Declaração Uso 10-1

Hashing. Rafael Nunes LABSCI-UFMG

Programação de Computadores I Introdução ao C PROFESSORA CINTIA CAETANO

Entradas/Saídas. Programação por espera activa Programação por interrupções

Sistemas de Ficheiros. 1. Ficheiros 2. Directórios 3. Implementação de sistemas de ficheiros 4. Exemplos de sistemas de ficheiros

FBV - Linguagem de Programação II. Um pouco sobre Java

INSTITUTO FEDERAL DE EDUCAÇÃO, CIÊNCIA E TECNOLOGIA RIO GRANDE DO NORTE

Transcrição:

Ruby & GCs Entendendo Gerenciamento de Memória

"G1 GC is an incremental parallel compacting GC that provides more predictable pause times compared to CMS GC and Parallel Old GC. By introducing a parallel, concurrent and multiphased marking cycle, G1 GC can work with much larger heaps while providing reasonable worst-case pause times."

Obsoletos Atuais 1.8.6 1.9.3 1.8.7 2.0.0 1.9.2 2.1.1

#include<stdio.h> int main() { int *ptr_one;! ptr_one = (int *)malloc(sizeof(int));! if (ptr_one == 0) { printf("error: Out of memory\n"); return 1; }! *ptr_one = 25; printf("%d\n", *ptr_one);! free(ptr_one);! return 0; }

#include<stdio.h> int main() { int *ptr_one;! ptr_one = (int *)malloc(sizeof(int));! if (ptr_one == 0) { printf("error: Out of memory\n"); return 1; }! *ptr_one = 25; printf("%d\n", *ptr_one);! free(ptr_one);! return 0; }

#include<stdio.h> int main() { int *ptr_one;! ptr_one = (int *)malloc(sizeof(int));! if (ptr_one == 0) { printf("error: Out of memory\n"); return 1; }! *ptr_one = 25; printf("%d\n", *ptr_one);! free(ptr_one);! return 0; }

0000 0000 0000 0000 0000 0000 0001 1001 #include<stdio.h> int main() { int *ptr_one;! ptr_one = (int *)malloc(sizeof(int));! if (ptr_one == 0) { printf("error: Out of memory\n"); return 1; }! *ptr_one = 25; printf("%d\n", *ptr_one);! free(ptr_one);! return 0; }

0000 0000 0000 0000 0000 0000 0001 1001 #include<stdio.h> int main() { int *ptr_one;! ptr_one = (int *)malloc(sizeof(int));! if (ptr_one == 0) { printf("error: Out of memory\n"); return 1; }! *ptr_one = 25; printf("%d\n", *ptr_one);! free(ptr_one);! return 0; }

40 bytes livres

Slot (40 bytes) Heap (ex 6 slots)

Slot (40 bytes) Heap (ex 6 slots) Instância de RVALUE

typedef struct RVALUE { union { struct { VALUE flags; /* always 0 for freed obj */ struct RVALUE *next; } free; struct RBasic basic; struct RObject object; struct RClass klass; struct RFloat flonum; struct RString string; struct RArray array; struct RRegexp regexp; struct RHash hash; struct RData data; struct RTypedData typeddata; struct RStruct rstruct; struct RBignum bignum; struct RFile file; struct RNode node; struct RMatch match; struct RRational rational; struct RComplex complex; struct { struct RBasic basic; VALUE v1; VALUE v2; VALUE v3; } values; } as; #if GC_DEBUG const char *file; VALUE line; #endif } RVALUE; struct RString { struct RBasic basic; union { struct { long len; char *ptr; union { long capa; VALUE shared; } aux; } heap; char ary[rstring_embed_len_max + 1]; } as; }; RVALUE RSTRING(str)->as.heap.ptr

Slot (40 kb) Heap (ex 6 slots) Instância de RVALUE Dados do RVALUE

Slot (40 kb) Heap (ex 6 slots) Instância de RVALUE Dados do RVALUE

Slot (40 kb) Heap (ex 6 slots) Instância de RVALUE Dados do RVALUE

Mark and Sweep GC Full Marking and Full Sweep GC

Slots de mesmo tamanho (não há problema com fragmentação) Quanto mais heaps, mais lento Fase de marcação conservadora pode haver leaks (ex. constantes) Processo Stop-the-World"

NGINX request Master Unicorn ou Passenger fork() fork() Rails App Rails App Rails App 150mb 150mb 150mb

Copy on Write (CoW) só copia o trecho da memória quando for modificada

Mark Bit Map

Bitmap Marking GC Full Bitmap Marking and Full Sweep GC

NGINX request Master Unicorn ou Passenger fork() fork() Rails App Rails App Rails App 150mb 100mb 100mb

Mark Sweep Mark Sweep Mark Sweep

Mark Mark Mark

Lazy Sweep GC Full Bitmap Marking and Lazy Sweep GC

https://gist.github.com/akitaonrails/10212233

http://u.akita.ws/samsaffron_ruby20

RUBY_GC_MALLOC_LIMIT=30000000 \ RUBY_HEAP_MIN_SLOTS=800000 \ bundle exec rails server

RUBY_GC_MALLOC_LIMIT 8.000.000 30.000.000 RUBY_HEAP_MIN_SLOTS 10.000 800.000

env_gc_malloc_limit_in_mb 7.6mb 26.6mb total_gc_runs 105 65 heaps_with_used_slots 1.089 1.477 total_heaps_allocated 1.958 1.965 total_heaps_allocated_in_mb 30.6mb 30.7mb heaps_to_allocate_next_gc 869 0

2.49Mb 71.9Mb

GC Anterior

Weak Generational Hypothesis Most young objects die young"

Young Generation (Eden) Old Generation (Tomb)

Generational GC Copying Garbage Collector

From-Heap To-Heap

From-Heap To-Heap

Mark-Compact GC Mark Copy Compact Heap Swap GC

Stop-and-Copy Sweep precisa ir slot a slot, neste é só considerar tudo no primeiro heap como livre Gerenciamento interno de ponteiros Feito para corrigir fragmentação Ruby tem slots de mesmo tamanho Não suporta Copy-on-Write

Ruby 2.1.x Shady vs Non-Shady

Ruby Array Ruby Object Write Barrier (Non-Shady only)

Shady Object Non-Shady Object (Sunny)

Mark bitmap (mark_bits[]) Shady bitmap ( rememberset_bits[])

Objetos "Old" 96.4% Objetos "Young" 3.6% Objetos "Shady" 1.5%

Mark Mark Mark

Major GC Minor GC

2.49Mb 71.9Mb

Restricted Generational GC (RGenGC) Full M&S for Shady, Generational for Non-Shady

Partial Markings, Lazy Sweeps = Menos Stop Shady objects não vão para o Tomb Write Barriers (referência old para new - non-shady only) Compatível com extensões C (Shady) Objetos em Tomb só são remarcados em Full Mark

http://u.akita.ws/samsaffron_ruby21

ruby-trunk e ruby 2.1.2 (não lançado)

http://u.akita.ws/samsaffron_ruby21

< 1.3! (+ major GC)

força GC por diminuir o teto RUBY_GC_MALLOC_LIMIT_MAX=8000000 \ RUBY_GC_OLDMALLOC_LIMIT_MAX=8000000 \ RUBY_GC_HEAP_OLDOBJECT_LIMIT_FACTOR=0.9 bundle exec rails server basicamente desabilita minor GC (de volta a Ruby 2.0.0)

RUBY_GC_MALLOC_LIMIT_MAX 3210241024 8000000 RUBY_GC_OLDMALLOC_LIMIT_MAX 12810241024 8000000 RUBY_GC_HEAP_OLDOBJECT_LIMIT_FACTOR 2.0 0.9 RUBY_GC_HEAP_INIT_SLOTS 10000 300000 RUBY_GC_HEAP_FREE_SLOTS 4096 300000 RUBY_GC_HEAP_GROWTH_FACTOR 1.8 1.25 RUBY_GC_HEAP_GROWTH_MAX_SLOTS (no limit) 150000 (obs: monitore, mensure, tuning, mensure de novo!) http://tmm1.net/ruby21-rgengc/

Objetos vão para Tomb se sobreviverem 1 GC Objetos podem ir para Tomb cedo demais Eden - Survivor - Tenured - Permanent RGENGC_THREEGEN mode (experimental) Parallel Marking (ex. em Thread separada) Tri-Color Marking (talvez) Futuro: Incremental Major Phase (major GC menores)

Java Young Generation -XX:+UseSerialGC (copying collector) -XX:+UseParallelGC (copying collector multi-thread) -XX:+UseParNewGC Old Generation -XX:+UseParallelOldGC -XX:+UseConcMarkSweepGC

NGINX request Master Unicorn ou Passenger Rails App Rails App Rails App 190ms 190ms 190ms 50ms de Full GC!

NGINX request Master Unicorn ou Passenger Rails App Rails App Rails App 140ms 140ms Full GC Executa Full GC quando não receber request

OOBGC Out-of-Band Major GC

Pausas foram de 125ms para 50ms http://tmm1.net/ruby21-oobgc/

http://u.akita.ws/rubymicroscope

Obrigado! @akitaonrails slideshare.net/akitaonrails www.akitaonrails.com