tag start run remove images hub docker containers cpu-usage lxc

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.