2013-06-26 13 views
6

Go supporta una variabile di ambiente GOGCTRACE e stampa le statistiche di raccolta per ogni analisi. Tuttavia non viene stampato quando si è verificato il GC. Esempio:GOGCTRACE e tempo di raccolta

gc6231 (8): 0 + 1 + 0 ms, 10 -> 5 MB 89540 -> 5294 (520316701-520311407) oggetti, 9 (80) handoff, 32 (404) rubare, 288/168/37 rese

Come correlare una linea di raccolta, con l'ora in cui si è verificata?

+0

Sembra GOGCTRACE non più è supportato: http://grokbase.com/t/gg/golang-dev/137p2tm5f1/has-gogctrace-been-removed- o-rinominato –

risposta

7

La traccia non mostra un tempo assoluto ma uno relativo all'uscita. Quando si verifica la linea, il GC è successo 0 + 1 + 0 ms.

Vedere the corresponding output line nel codice di riferimento.

Se si esegue il prefisso di ogni riga su stdout con un timestamp, si ottiene il tempo di esecuzione del GC (data/ora - in millisecondi = tempo di esecuzione del GC).

Esempio:

GOGCTRACE=1 ./myprog 2>&1 | while read line; do echo $(date +%s) $line; done 

Se si desidera semplicemente avere una sensazione quando una corsa GC è accaduto con precisione di secondi allora questo è del tutto sufficiente. Molto probabilmente l'output non resterà indietro di molto e anche se lo fosse, avresti ancora i timestamp per ottenere l'ora corretta.

Un'altra soluzione sarebbe quella di utilizzare ReadGCStats da runtime/debug cui si dà la GCStats struct, che a sua volta ha un campo LastGC di tipo time.Time, tenendo il tempo assoluto dell'ultima esecuzione GC. In alternativa puoi usare runtime.ReadMemStats, che ti dà ancora più informazioni.

Naturalmente avresti ancora bisogno di sapere quando è avvenuta una raccolta dei rifiuti. Per questo è possibile utilizzare un finalizzatore su un oggetto che si crea esclusivamente allo scopo di essere spazzatura raccolti e applicare runtime.SetFinalizer su di esso. Nel finalizzatore si leggerà quindi l'ora LastGC e stampata.

Esempio (su play):

type Garbage struct{ a int } 

func notify(f *Garbage) { 
    stats := &runtime.MemStats{} 
    runtime.ReadMemStats(stats) 

    fmt.Println("Last GC was:", stats.LastGC) 

    go ProduceFinalizedGarbage() 
} 

func ProduceFinalizedGarbage() { 
    x := &Garbage{} 
    runtime.SetFinalizer(x, notify) 
} 

func main() { 
    go ProduceFinalizedGarbage() 

    for { 
     runtime.GC() 
     time.Sleep(30 * time.Second) // Give GC time to run 
    } 
} 
+0

Ho bisogno di un tempo assoluto il GC si è verificato. –

+0

Allora? Se hai il tempo relativo e prefissi ogni riga con il tempo assoluto, puoi vedere il tempo assoluto dell'esecuzione del GC. Ad esempio: './myprog | mentre leggi linea; fai echo $ (date +% s) $ line; done'. – nemo

+0

Questa risposta è completamente informata, bravo. –

Problemi correlati