run - docker start image
Obtener el uso de CPU de Docker Container como porcentaje (2)
Después de consumir la API remota, obtenemos estos campos: precpu_stats / cpu_stats
Entonces, básicamente aquí está el código: (ejemplo de 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 para aclarar el RESULT_CPU_USAGE ... es la cantidad de recursos consumidos por su hardware físico, por lo que suponiendo que obtenga RESULT_CPU_USAGE en un 50% , significa que el contenedor X utiliza el 50% de toda la potencia de su PC.
Docker proporciona un comando de estadísticas interactivas, docker stats [cid]
que proporciona información actualizada sobre el uso de la CPU, como por ejemplo:
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
Estoy tratando de obtener el uso de la CPU como un porcentaje en un formato digerible para hacer un análisis.
He visto las estadísticas en / sys / fs que parecen proporcionar valores similares a los de la API de Docker Remote que me da este 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
}
}
Pero no estoy seguro de cómo obtener un uso exacto de la CPU como un porcentaje de eso.
¿Algunas ideas?
Si va a utilizar la llamada a la API de estadísticas, puede echar un vistazo a cómo lo hace el cliente docker: 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
}
Básicamente, toma un punto de referencia, luego ve la diferencia en, por ejemplo, 10 segundos, luego puede saber cuánto tiempo usó el contenedor. Digamos que comenzamos con 0 SystemCPUUsage y 0 CPUUsage para el contenedor. Si después de 10 segundos, tenemos 10 SystemCPUUsage y 1 CPUUsage, entonces tenemos un 10% de uso. Se le dan los resultados en nanosegundos, no segundos, en la API. El tiempo real no importa, el cambio total de SystemCPUUsage es lo que importa, luego compare el CPUUSage con eso.