2015-05-16 12 views
18

Docker eine interaktive Statistik Befehl bietet, docker stats [cid], die auf der CPU-Auslastung aktuelle Informationen aufgibt, etwa so:Get Docker Container CPU-Auslastung als Prozentsatz

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 

Ich versuche, die CPU-Auslastung als zu bekommen Prozentsatz in einem verdaubaren Format, um eine Analyse durchzuführen.

ich die Statistiken habe in/sys/fs, die als Docker Remote API Ähnliche Werte zu liefern scheinen gesehen, die mir dieses JSON Blob gibt:

{ 
    "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 
    } 
} 

Aber ich bin nicht sicher, wie eine genaue CPU-Auslastung zu erhalten als Prozentsatz davon.

Irgendwelche Ideen?

+0

Ist nicht Ihr Wert im obigen Beispiel als Prozentsatz oder bekomme ich etwas falsch? –

+1

Er meinte, wie er Prozent von der ** api ** erhalten könnte, in der gleichen Weise, wie es durch den Docker-Client – luxas

Antwort

24

Wenn Sie den Statistik-API-Aufruf verwenden wollen - Sie einen Blick auf nehmen, wie der Docker Client tut es: 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 
} 

Grundsätzlich nehmen Sie einen Bezugspunkt, dann sehen Sie den Unterschied in Sagen Sie 10 Sekunden, dann können Sie sagen, wie viel Zeit der Container verbraucht hat. Angenommen, wir beginnen mit 0 SystemCPUUsage und 0 CPUUsage für den Container. Wenn wir nach 10 Sekunden 10 SystemCPUUsage und 1 CPUUsage haben, haben wir 10% Auslastung. Sie erhalten die Ergebnisse nur in Nanosekunden und nicht in Sekunden in der API. Die tatsächliche Zeit spielt keine Rolle, die gesamte SystemCPUUsage-Änderung ist wichtig, dann vergleichen Sie CPUUSage mit dieser.

+1

oben genannten Link unterbrochen wird. Sie finden es unter: https://github.com/docker/docker/blob/eb131c5383db8cac633919f82abad86c99bffbe5/cli/command/container/stats_helpers.go – darKoram

6

Nachdem wir den Remote-api verbrauchen bekommen wir diese Felder: precpu_stats/cpu_stats

Dann, im Grunde hier ist der Code: (javascript Beispiel)

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; 

einfach die RESULT_CPU_USAGE zu klären ... es ist die Menge an Ressourcen, die von Ihrer physischen Hardware verbraucht wird, vorausgesetzt, Sie erhalten RESULT_CPU_USAGE als 50%, bedeutet dies 50% von all Ihrer PC-Leistung wird von Container X verwendet

+0

Ihre Berechnung berücksichtigt nicht die Anzahl der CPUs. – smishra

+0

Ich denke, es macht wenig Sinn, das Ergebnis mit den CPU-Zahlen zu multiplizieren. Ich meine ... mein Notebook hat 4 Kerne, wenn ich diese Kerne von einem Docker-Container betone und dann "Docker-Statistiken" von außen laufen lasse ... bekomme ich ~ 400% der CPU-Nutzung. Wenn ich einen Docker-Host beobachte, würde ich lieber einen Bereich von 0% bis 100% haben –

+0

Dieser Prozentsatz der CPU-Nutzung scheint eine Sekunde zu sein. Gibt es eine Möglichkeit, die durchschnittliche CPU, die der Container verbraucht, eine Minute lang zu erhalten, ohne diesen API-Anruf 60 Mal pro Minute zu treffen? – getvivekv