2015-05-16 11 views
18

Docker fornisce un comando interattivo statistiche, docker stats [cid] che fornisce informazioni aggiornate sul l'utilizzo della CPU, in questo modo:Get Docker Contenitore di utilizzo della CPU come percentuale

CONTAINER  CPU %   MEM USAGE/LIMIT  MEM %  NET I/O 
36e8a65d  0.03%   4.086 MiB/7.798 GiB 0.05%  281.3 MiB/288.3 MiB 

sto cercando di ottenere l'utilizzo della CPU come percentuale in un formato digeribile per fare qualche analisi.

ho visto le statistiche in/sys/fs che sembrano fornire valori simili come il Docker Remote API che mi dà questa JSON blob:

{ 
    "cpu_usage": { 
     "usage_in_usermode": 345230000000, 
     "total_usage": 430576697133, 
     "percpu_usage": [ 
      112999686856, 
      106377031910, 
      113291361597, 
      97908616770 
     ], 
     "usage_in_kernelmode": 80670000000 
    }, 
    "system_cpu_usage": 440576670000000, 
    "throttling_data": { 
     "throttled_time": 0, 
     "periods": 0, 
     "throttled_periods": 0 
    } 
} 

Ma io sono sicuro come ottenere un esatto utilizzo della CPU in percentuale da quello.

Qualche idea?

+0

Non è il tuo valore nell'esempio sopra come percentuale o sto ricevendo qualcosa di sbagliato? –

+1

Intendeva dire come ottenere la percentuale dall' ** api **, allo stesso modo di come viene visualizzato il collegamento visualizzato dal client docker – luxas

risposta

24

Se avete intenzione di utilizzare la chiamata API Statistiche - si può dare un'occhiata a come il cliente finestra mobile fa: https://github.com/docker/docker/blob/eb131c5383db8cac633919f82abad86c99bffbe5/cli/command/container/stats_helpers.go#L175-L188

func calculateCPUPercent(previousCPU, previousSystem uint64, v *types.StatsJSON) float64 { 
    var (
     cpuPercent = 0.0 
     // calculate the change for the cpu usage of the container in between readings 
     cpuDelta = float64(v.CPUStats.CPUUsage.TotalUsage) - float64(previousCPU) 
     // calculate the change for the entire system between readings 
     systemDelta = float64(v.CPUStats.SystemUsage) - float64(previousSystem) 
    ) 

    if systemDelta > 0.0 && cpuDelta > 0.0 { 
     cpuPercent = (cpuDelta/systemDelta) * float64(len(v.CPUStats.CPUUsage.PercpuUsage)) * 100.0 
    } 
    return cpuPercent 
} 

In sostanza, si prende un punto di riferimento, quindi vedere la differenza di diciamo 10 secondi, è quindi possibile sapere quanto tempo è stato utilizzato dal contenitore. Diciamo, iniziamo con 0 SystemCPUUsage e 0 CPUUsage per il contenitore. Se dopo 10 secondi, abbiamo 10 SystemCPUUsage e 1 CPUUsage, quindi abbiamo il 10% di utilizzo. Ti vengono dati i risultati in nanosecondi, non secondi, nell'API. L'ora effettiva non ha importanza, la modifica totale di SystemCPUUsage è ciò che conta, quindi confrontare CPUUSage con quello.

+1

sopra. trovato a: https://github.com/docker/docker/blob/eb131c5383db8cac633919f82abad86c99bffbe5/cli/command/container/stats_helpers.go – darKoram

6

Dopo che consumiamo l'API a distanza otteniamo questi campi: precpu_stats/cpu_stats

Poi, in fondo ecco il codice: (esempio JavaScript)

var res <---- remote api response 

var cpuDelta = res.cpu_stats.cpu_usage.total_usage - res.precpu_stats.cpu_usage.total_usage; 
var systemDelta = res.cpu_stats.system_cpu_usage - res.precpu_stats.system_cpu_usage; 
var RESULT_CPU_USAGE = cpuDelta/systemDelta * 100; 

solo per chiarire la RESULT_CPU_USAGE ... è la quantità di risorse consumate dal tuo hardware fisico, quindi supponiamo che stai ricevendo RESULT_CPU_USAGE come 50%, significa che 50% di tutto il tuo PC viene utilizzato dal contenitore X

+0

Il calcolo non tiene conto del numero di CPU. – smishra

+0

Penso che non abbia molto senso moltiplicare il risultato per il numero di CPU. Voglio dire ... il mio quaderno ha 4 core, se sottolineo questi core da un container mobile e poi eseguo "stats docker" dall'esterno ... Ricevo circa il 400% dell'utilizzo della CPU. Se sto monitorando un host di finestra mobile, preferirei avere un intervallo da 0% a 100% –

+0

Questa percentuale di utilizzo della CPU sembra essere un secondo. C'è un modo per ottenere la CPU media utilizzata dal contenitore per un minuto senza colpire questa chiamata api 60 volte al minuto? – getvivekv

Problemi correlati