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.