Monitorización de uso y temperatura de CPU y gráficas Nvidia en Grafana

By | May 8, 2019

Con el recolector de métricas Collectd podemos obtener fácilmente datos relativos a consumo, frecuencia y temperatura de CPU. Estos datos los volcamos en InfluxDB para su posterior representación en Grafana tal y como vimos hace tiempo.

Por otra parte en cuanto a métricas de tarjetas gráficas Nvidia, Collectd no cuenta con un plugin nativo en estos momentos, pero podemos hacer uso del plugin exec para recopilar las métricas necesarias con ayuda de scripts adicionales hechos a medida.

El dashboard de Grafana que ya subí al repo de GitHub nos permite visualizar métricas de CPU y gráficas Nvidia:

Métricas de CPU

Para obtener estos datos utilizaremos los plugins cpu, cpufreq y sensors (este último para las temperaturas) por lo que tendremos que cargarlos en /etc/collectd/collectd.conf

LoadPlugin cpu
LoadPlugin cpufreq
LoadPlugin sensors

El plugin cpu a su vez lo configuramos de la siguiente manera, de manera que podamos obtener métricas por core, estado (idle, user, system, wait for I/O, etc…) y en porcentajes de uso:

<Plugin cpu>                                                                    
    ReportByCpu true
    ReportByState true
    ValuesPercentage true
</Plugin>

Para los otros dos plugins no hace falta modificar la configuración por defecto. En cada caso particular puede que cambie la casuística de los sensores de temperatura. Por ejemplo en mi caso al lanzar sensors en la terminal obtengo:

Si reviso las métricas que estoy recibiendo en InfluxDB veo 5 entradas cuando sólo tengo 4 cores:

show series from sensors_value

Obtengo:

key
---
sensors_value,host=jota-pc,instance=acpitz-virtual-0,type=temperature,type_instance=temp1
sensors_value,host=jota-pc,instance=acpitz-virtual-0,type=temperature,type_instance=temp2
sensors_value,host=jota-pc,instance=asus-isa-0000,type=fanspeed,type_instance=fan1
sensors_value,host=jota-pc,instance=coretemp-isa-0000,type=temperature,type_instance=temp1
sensors_value,host=jota-pc,instance=coretemp-isa-0000,type=temperature,type_instance=temp2
sensors_value,host=jota-pc,instance=coretemp-isa-0000,type=temperature,type_instance=temp3
sensors_value,host=jota-pc,instance=coretemp-isa-0000,type=temperature,type_instance=temp4
sensors_value,host=jota-pc,instance=coretemp-isa-0000,type=temperature,type_instance=temp5

Seleccionamos los valores de la última hora para dicha métrica:

select * from sensors_value WHERE time > now() - 1h;

Obtengo:

1556562553610315113 jota-pc coretemp-isa-0000 temperature temp1         44
1556562553610346343 jota-pc coretemp-isa-0000 temperature temp2         37
1556562553610376453 jota-pc coretemp-isa-0000 temperature temp3         38
1556562553610403547 jota-pc coretemp-isa-0000 temperature temp4         41
1556562553610431352 jota-pc coretemp-isa-0000 temperature temp5         44
1556562553610564309 jota-pc acpitz-virtual-0  temperature temp1         27.8
1556562553610631538 jota-pc acpitz-virtual-0  temperature temp2         29.8
1556562553610755511 jota-pc asus-isa-0000     fanspeed    fan1          0

Los valores de cada core se corresponden con coretemp-isa-0000 temp2,3,4 y 5. El primero (temp1) se corresponde con el sensor físico de la CPU que también nos interesa.

Métricas de gráfica Nvidia

En este caso como decía no tenemos un plugin nativo, pero podemos hacer uso del script collectd-cuda que lanzaremos con el plugin Exec:

LoadPlugin exec

Que en mi caso configuro de la siguiente manera (en el mismo path donde esté collectd_cuda.sh debe estar también plugins_config.sh del repo anterior)

<Plugin exec>                                                                   
#   Exec user "/path/to/exec"
#   Exec "user:group" "/path/to/exec"
#   NotificationExec user "/path/to/exec"
    Exec jota "/opt/collectd/scripts/collectd_cuda.sh"
</Plugin>

Una vez reiniciado Collectd podemos revisar en InfluxDB que tenemos métricas de temperatura, voltaje, velocidad de ventilador… Realmente el script collectd-cuda lo que hace es utilizar nvidia-smi para recopilar toda esta información y volcarla en InfluxDB:

> select * from cuda_value

name: cuda_value
time                host    instance         type        type_instance      value
----                ----    --------         ----        -------------      -----
1556652911505485498 jota-pc 00000000:01:00.0 percent     fan_speed          2
1556652911505520812 jota-pc 00000000:01:00.0 percent     utilization_memory 0
1556652921505202203 jota-pc 00000000:01:00.0 percent     fan_speed          0
1556652921505214900 jota-pc 00000000:01:00.0 percent     utilization_memory 6
1556652921505243519 jota-pc 00000000:01:00.0 memory      memory_free        5697
1556652921505268320 jota-pc 00000000:01:00.0 power       power_draw         6.85
1556652931505088286 jota-pc 00000000:01:00.0 percent     fan_speed          0
1556652931505098172 jota-pc 00000000:01:00.0 percent     utilization_memory 1
1556652931505112653 jota-pc 00000000:01:00.0 memory      memory_free        5697
1556652931505134165 jota-pc 00000000:01:00.0 power       power_draw         28.99
1556653021505554748 jota-pc 00000000:01:00.0 percent     fan_speed          3
1556653021505564219 jota-pc 00000000:01:00.0 percent     utilization_memory 2
1556653021505570978 jota-pc 00000000:01:00.0 memory      memory_free        5697
1556653021505579184 jota-pc 00000000:01:00.0 power       power_draw         9.59
1556653021505595129 jota-pc 00000000:01:00.0 temperature temperature_gpu    55
1556653021505611435 jota-pc 00000000:01:00.0 percent     utilization_gpu    2
1556653041506495625 jota-pc 00000000:01:00.0 percent     fan_speed          4
1556653041506505307 jota-pc 00000000:01:00.0 percent     utilization_memory 1

Con esto ya deberíamos tener todo lo necesario al menos para recopilar las métricas de CPU y gráfica. No obstante en cada caso pueden cambiar algunos valores como el nombre de la instancia de la gráfica, sensores de CPU… por lo que quizá haya que ajustar las querys en Grafana.