2013-04-30 11 views
32

Mi chiedevo se l'accordatura GC utilizzata per Ruby 1.9.x sia ancora rilevante in 2.0 con la nuova implementazione del GC. In tal caso, ci sono nuove cose che possiamo configurare sulla nuova versione?Garbage collector tuning in Ruby 2.0

sto parlando le seguenti configurazioni

RUBY_HEAP_MIN_SLOTS=600000 
RUBY_GC_MALLOC_LIMIT=59000000 
RUBY_HEAP_FREE_MIN=100000 

risposta

51

C'è un bel po 'di confusione su questi parametri di ottimizzazione GC. REE (che è un fork di Ruby 1.8.7) introduced its own parameters first e in seguito Ruby (a partire dalla 1.9.2) ha introdotto i propri parametri (simili). Ruby 1.9.3 li ha resi personalizzabili tramite variabili d'ambiente e Ruby 2.1.0 ha aggiunto molto altro.

This blog post entra nei dettagli della raccolta di dati inutili in MRI e cosa significano tutte le variabili di regolazione.

Ecco un elenco completo di tutte le variabili di tuning per ogni versione di Ruby:

REE source

  • RUBY_HEAP_MIN_SLOTS
  • RUBY_HEAP_SLOTS_INCREMENT
  • RUBY_HEAP_SLOTS_GROWTH_FACTOR
  • RUBY_GC_MALLOC_LIMIT
  • RUBY_HEAP_FREE_MIN

di Ruby 1.9.2 sourcesource

  • HEAP_MIN_SLOTS (hard-coded, ma personalizzabile tramite variabili d'ambiente con)

    • GC_MALLOC_LIMIT
    • FREE_MIN

    rubino 1.9.3 source

    • RUBY_GC_MALLOC_LIMIT
    • RUBY_HEAP_MIN_SLOTS
    • RUBY_FREE_MIN

    rubino 2.0.0 source

    Uguale a Ruby 1.9.3

    Ruby 2.1.0 source

    • RUBY_GC_HEAP_INIT_SLOTS (obsoletes RUBY_HEAP_MIN_SLOTS)
    • RUBY_GC_HEAP_FREE_SLOTS (obsoletes RUBY_FREE_MIN)
    • RUBY_GC_HEAP_GROWTH_FACTOR (nuovo)
    • RUBY_GC_HEAP_GROWTH_MAX_SLOTS (nuovo)
    • RUBY_GC_MALLOC_LIMIT
    • RUBY_GC_MALLOC_LIMIT_MAX (nuovo)
    • RUBY_GC_MALLOC_LIMIT_GROWTH _FACTOR (nuovo)
    • RUBY_GC_OLDMALLOC_LIMIT (nuovo)
    • RUBY_GC_OLDMALLOC_LIMIT_MAX (nuovo)
    • RUBY_GC_OLDMALLOC_LIMIT_GROWTH_FACTOR (nuova)

    Rubino 2.1.1 source

    • RUBY_GC_HEAP_OLDOBJECT_LIMIT_FACTOR (nuovo)
  • +0

    Sembra [Rubino 1.9.2] (https://github.com/ruby/ ruby/blob/ruby_1_9_2/gc.C# L77-L79) non ha RUBY_GC_MALLOC_LIMIT. Invece ha GC_MALLOC_LIMIT che è inizializzato con la macro #define. Ciò significa che dobbiamo modificare il valore in gc.c e ricompilare Ruby per controllare quando viene eseguito il GC. – ardsrk

    +0

    Hai assolutamente ragione. Ho aggiunto nella correzione. – davogones

    +0

    Inoltre, nessuno di questi è impostabile nella 1.9.2 tramite variabili di ambiente, per quanto posso dire. –

    14

    da Ruby 2.1.x http://tmm1.net/ruby21-rgengc/

    export RUBY_GC_HEAP_INIT_SLOTS=600000 
    export RUBY_GC_HEAP_FREE_SLOTS=600000 
    export RUBY_GC_HEAP_GROWTH_FACTOR=1.25 
    export RUBY_GC_HEAP_GROWTH_MAX_SLOTS=300000 
    

    o questo

    # Boost Ruby 
    export RUBY_GC_HEAP_INIT_SLOTS=1000000 # 1M 
    export RUBY_GC_HEAP_FREE_SLOTS=500000 # 0.5M 
    export RUBY_GC_HEAP_GROWTH_FACTOR=1.1 
    export RUBY_GC_HEAP_GROWTH_MAX_SLOTS=10000000 # 10M 
    export RUBY_GC_MALLOC_LIMIT_MAX=1000000000 # 1G 
    export RUBY_GC_MALLOC_LIMIT_GROWTH_FACTOR=1.1 
    # export RUBY_GC_OLDMALLOC_LIMIT=500000000  # 500M 
    # export RUBY_GC_OLDMALLOC_LIMIT_MAX=1000000000 # 1G 
    # export RUBY_GC_OLDMALLOC_LIMIT_GROWTH_FACTOR=1.1 
    

    Performance MRI Ruby Patch

    $ rvm install 2.1.2 --patch railsexpress -n railsexpress 
    $ rvm --default use 2.1.2-railsexpress 
    
    +1

    Alcuni encomi nel secondo snippet sono fuorvianti: "RUBY_GC_HEAP_INIT_SLOTS' e" RUBY_GC_HEAP_FREE_SLOTS' rappresentano numeri assoluti, non byte. – Agis