Ruby 2.0 introduce un garbage collector amichevole copia-su-scrittura. I miei processi non sembrano mantenere la memoria condivisa per più di pochi minuti: sembra spostarsi abbastanza rapidamente da shared_dirty a private_dirty.Come migliorare la condivisione della memoria tra i processi unicorno con Ruby 2.0 su Linux
Alcuni altri hanno avuto successo nel far funzionare questo lavoro:
- https://gist.github.com/kenn/5105175
- http://marianposaceanu.com/articles/on-ruby-2-0-memory-usage-unicorn-and-heroku
Questo programma può essere utilizzato per controllare le statistiche di memoria su Linux: https://gist.github.com/kenn/5105061
mio unicorno configurazione: https://gist.github.com/inspire22/f82c77c0a465f1945305
Per qualche motivo le mie app per unicorno, anche con preload_app = true, hanno una memoria molto meno condivisa. Rubino 2.0-P195, Rails 3.2, Linux 2.6.18 (CentOS)
[[email protected] script]# ruby memstats.rb 4946
Process: 4946
Command Line: unicorn_rails worker[4] -c /u/apps/newap/current/lib/unicorn.rb -E production -D
Memory Summary:
private_clean 0 kB
private_dirty 56,324 kB
pss 60,256 kB
rss 83,628 kB
shared_clean 4,204 kB
shared_dirty 23,100 kB
size 108,156 kB
swap 68 kB
Se l'arresto del processo di maestro del tutto (non solo un HUP) quindi riavviare e controllare immediatamente un lavoratore prima di qualsiasi richieste sono in coda, ho avere una storia migliore:
[[email protected] script]# ruby memstats.rb 5743
Process: 5743
Command Line: unicorn_rails worker[4] -c /u/apps/newap/current/lib/unicorn.rb -E production -D
Memory Summary:
private_clean 0 kB
private_dirty 21,572 kB
pss 27,735 kB
rss 66,296 kB
shared_clean 2,484 kB
shared_dirty 42,240 kB
size 91,768 kB
swap 0 kB
Ma nel giro di 5 secondi di messa in esercizio, sono tornati a ~ 20MB di shared_clean + shared_dirty.
Ho il sospetto che lo swapping potrebbe causare il problema, ma dopo aver diminuito lo swappiness e assicurandomi che né i processi padre né figlio vengano scambiati (utilizzando swapstats.rb), il problema persiste.
Non capisco esattamente quale sia la memoria shared_dirty e come venga trasformata in memoria privata. Mi piacerebbe anche suggerimenti per migliorare la longevità e la quantità della mia memoria condivisa. Grazie!
Non ho ancora una soluzione a questo. Ora credo che sia un problema di a) versione a 32 bit di Linux, e b) un ambiente con vincoli di memoria (anche se con swappiness abbassato si verifica ancora) – Kevin
Ho ricevuto questo commento dall'autore del gist: https: // twitter.com/kenn/status/402832587007086592 –
fantastico, grazie :) – Kevin