web-dev-qa-db-fra.com

Obtenir l'utilisation du processeur Docker Container en pourcentage

Docker fournit une commande interactive de statistiques, docker stats [cid] qui donne des informations à jour sur l'utilisation du CPU, comme ceci:

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

J'essaie d'obtenir l'utilisation du processeur en pourcentage dans un format digestible pour faire une analyse.

J'ai vu les statistiques dans/sys/fs qui semblent fournir des valeurs similaires à Docker Remote API qui me donne ce blob JSON:

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

Mais je ne sais pas comment obtenir une utilisation exacte du processeur en pourcentage de cela.

Des idées?

22
Dan LaManna

Si vous allez utiliser l'appel de l'API Stats - vous pouvez voir comment le client docker le fait: 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
}

Fondamentalement, vous prenez un point de référence, puis voyez la différence, disons 10 secondes, vous pouvez alors dire combien de temps a été utilisé par le conteneur. Disons, nous commençons avec 0 SystemCPUUsage et 0 CPUUsage pour le conteneur. Si après 10 secondes, nous avons 10 SystemCPUUsage et 1 CPUUsage, alors nous avons 10% d'utilisation. Vous obtenez simplement les résultats en nanosecondes, et non en secondes, dans l'API. Le temps réel n'a pas d'importance, le changement total de SystemCPUUsage est ce qui compte, puis comparez CPUUSage à cela.

31
Michael

Après avoir consommé l'API distante, nous obtenons ces champs: precpu_stats/cpu_stats

Ensuite, voici le code: (exemple 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;

Juste pour clarifier le RESULT_CPU_USAGE ... c'est la quantité de ressources consommées de votre matériel physique, donc en supposant que vous obtenez RESULT_CPU_USAGE as 50%, cela signifie que 50% de toute la puissance de votre PC est utilisée par le conteneur X

7
Thiago Martins