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?
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.
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