GPU Sensor Monitoring Plugin
Dieser Artikel beschreibt die Installation und Konfiguration des GPU Sensor Monitoring Plugins in Nagios bzw. Icinga. Das Plugin ermöglicht die Überwachung von NVIDIA GPU Hardware und zeigt detaillierte Statusinformationen über den aktuellen Status der Grafikkarten. Im konkreten Fall sind z.B. Temperatur, Power Usage (Stromverbrauch), ECC Errors, Lüfterdrehzahl oder Speicherauslastung überwachbar.
Aktuelle Version
- Download
- Version 2.1 unterstützte Sensoren (nicht vollständig), s.a. [1]:
- GPU Clocks
- Fan Speed
- ECC Error Counters
- Temperatur
- Power Usage (Stromverbrauch)
- Memory Usage
- Device Utilization
- Persistence Mode
- Inforom Validation (Checksum)
- Throttle Reasons
- PCIe Link Settings
Wichtige Vorabinformation
Achtung: Auf Nachfrage im NVIDIA-Forum wurde bestätigt, dass sich von der nvidia-smi/nvml angezeigten Lüfterdrehzahl nicht darauf schließen lässt, ob sich der Lüfter tatsächlich dreht. Bei den angezeigten Prozentangaben handelt es sich um jene Drehzahl, mit der der Lüfter-Algorithmus versucht den Lüfter zu betreiben. Siehe dazu die Diskussion im NVIDIA-Forum.
Im Regelfall dient daher der Temperatursensor als Indiz für einen funktionstüchtigen Lüfter, steigt die Temperatur ohne Grund fortlaufend an, kann dies auf Kühlungsprobleme hindeuten. Bei einer GPU deren Temperatur über die spezifizierte Maximum-Temperatur ansteigt, kann der Lüfter defekt sein.
Download
Das Plugin wird über GitHub zur Verfügung gestellt: check_gpu_sensor_v1
Über
git clone git://github.com/thomas-krenn/check_gpu_sensor_v1.git
oder
git clone https://github.com/thomas-krenn/check_gpu_sensor_v1.git
kann eine Kopie des Plugins bezogen werden. Nützliche Informationen und Tipps für die Verwendung von Git finden sich auch in der Artikel-Reihe der Kategorie: Git.
Installation des check_gpu_sensor Plugins
Für die Installation und Verwendung des Plugins werden folgende Komponenten benötig:
- Eine NVIDIA GPU
- Je nach Modell werden unterschiedliche Sensoren unterstützt.
- NVIDIA Driver
- Entweder ein proprietärer Treiber (vgl. CUDA Installation#Installation des NVIDIA-Treibers).
- Oder die NVIDIA-Treiber aus den Paket-Repositories
- NVML Perl Bindings (https://search.cpan.org/~nvbinding/)
- Passend zur Treiber-Version
- Icinga Installation
- Icinga NRPE für die Überwachung von Remote Hosts
- S.a. Icinga NRPE Plugin
- Für die Darstellung der Performance-Daten
- Via PNP4Nagios können die generierten Performance-Daten in Form von Graphen dargestellt werden (z.B. GPU Temperatur).
- Debian: Icinga Graphen mit PNP unter Debian 6.0 Squeeze
- Ubuntu: Icinga Graphen mit PNP unter Ubuntu 12.04 Precise
NVML
Die "NVIDIA Management Library" ist eine C-basierende API für das Management und die Verwaltung von NVIDIA GPUs.[1] Die Runtime-Bibliothek von NVML wird mit dem NVIDIA-Grafiktreiber ausgeliefert ("libnvidia-ml"), das NVML-SDK liefert Stub Bibliotheken, die Header-Dateien und Beispiel-Applikationen. Jede neue Version von NVML bleibt abwärtskompatibel und dient zur Erstellung von 3rd Party Software für die Verwaltung von NVIDIA GPUs. Vor allem für Produkte der Tesla-Serie steht der komplette Funktionsumfang der NVML-Bibliothek zur Verfügung Unter anderem können folgende Informationen mit NVML ermittelt werden:[1]
- ECC Status-Informationen (Error Counts)
- GPU Auslastung (Memory, Prozessor)
- Temperatur und Lüfter-Geschwindigkeit
- Aktive Compute Prozesse
- GPU Clock-Raten
- Power-Management
Für eine Programmierung in C kann das Tesla Deployment Kits (developer.nvidia.com) heruntergeladen werden, in der sich alle benötigten Teile für die NVML befinden. Für die Verwendung der Script-Bindings, respektive für das GPU Plugin, sind die C-Teile aber nicht nötig. Die Skriptsprachen Perl und Python werden offiziell über Bindings unterstützt (siehe unten). Das NVML API Reference Manual bietet weitere Informationen über die NVML Bibliothek.
Unterstützte OS und GPUs
Laut Reference Manual werden folgende Betriebssysteme und GPUs unterstützt:[2]
- OS Platform
- Windwos Server 2008 R2 64bit, Windows 7 64bit
- Linux 32bit und 64bit
- GPUs
- Full Support
- NVIDIA Tesla ™Line: S2050, C2050, C2070, C2075, M2050, M2070, M2075, M2090, X2070, X2090, K10, K20, K20X
- NVIDIA Quadro ®Line: 4000, 5000, 6000, 7000, M2070-Q, 600, 2000, 3000M and 410
- NVIDIA GeForce ®Line: None
- Limited Support
- NVIDIA Tesla ™Line: S1070, C1060, M1060
- NVIDIA Quadro ®Line: All other current and previous generation Quadro-branded parts
- NVIDIA GeForce ®Line: All current and previous generation GeForce-branded parts
- Full Support
Damit die NVML-Aufrufe des Plugins verwendet werden können, wird eine Installation der Perl-Bindings benötigt.
Installation der Perl Bindings
Eine Sammlung von offiziell unterstützen Bindings für Python und Perl werden über
angeboten. Diese ermöglichen die Programmierung von Software unter Zuhilfenahme der NVML-API in Python und Perl.
Bei der Installation der Perl Bindings muss beachtet werden, dass diese auch zur installierten Treiber-Version passen. Auf einem Ubuntu 12.04 kommt z.B. die Version 304.88 aus den Repos zum Einsatz:[3] Beim folgenden System wurde der experimental Driver verwendet:
$ nvidia-smi -a|grep 'Driver Version'
Driver Version : 304.48
Beide Treiber können mit den aktuellen Perl-Bindings in der Version "nvidia-ml-pl-4.304.1" verwendet werden.
Achtung: Erscheint beim Erstellen des Makefiles (z.B. wenn nicht der proprietäre NVIDIA-Treiber verwendet wird, sondern jener aus den Repos) folgende Fehlermeldung:
:~/nvidia-ml$ perl Makefile.PL
Note (probably harmless): No library found for -lnvidia-ml
Writing Makefile for nvidia::ml::bindings
Writing MYMETA.yml and MYMETA.json
muss der Pfad zur "nvidia-ml" Bibliothek ergänzt werden ("-L/usr/lib/nvidia-current", oder "-L/usr/lib/nvidia-experimental-304"):
$ chmod u+w Makefile.PL
$ vi Makefile.PL
use ExtUtils::MakeMaker;
# See lib/ExtUtils/MakeMaker.pm for details of how to influence
# the contents of the Makefile that is written.
WriteMakefile(
NAME => 'nvidia::ml::bindings',
PREREQ_PM => {}, # e.g., Module::Name => 1.1
LIBS => ['-L/usr/lib/nvidia-current -lnvidia-ml'], # e.g., '-lm'
DEFINE => '', # e.g., '-DHAVE_SOMETHING'
INC => '-I.', # e.g., '-I. -I/usr/include/other'
OBJECT => '$(O_FILES)', # link all the C files too
);
Daraufhin kompilieren die Perl-Bindings ohne Warnung und können installiert werden:
$ perl Makefile.PL
$ make
$ sudo make install
Anschließend zeigt der folgende Befehl, dass die Perl-Module installiert wurden:
$ perldoc perllocal
Mon Apr 22 09:11:08 2013: "Module" nvidia::ml::bindings
· "installed into: /usr/local/share/perl/5.14.2"
· "LINKTYPE: dynamic"
· "VERSION: "
· "EXE_FILES: "
Installation der Plugin-Datei
Für die Installation der Plugin-Datei selbst muss die Datei "check_gpu_sensor" in das Verzeichnis der Nagios- bzw. Icinga-Plugins kopiert und als ausführbar gekennzeichnet werden:
$ sudo cp check_gpu_sensor /usr/lib/nagios/plugins/
$ sudo chmod +x /usr/lib/nagios/plugins/check_gpu_sensor
Konfiguration des check_gpu_sensor Plugins
NRPE Konfiguration
Für die Konfiguration von NRPE kann auch der Artikel Icinga NRPE Plugin zur Hilfe genommen werden.
Am überwachten Server
Damit der überwachte Host das GPU-Plugin richtig aufruft, wird im ersten Schritt eine NRPE Konfigurationsdatei erstellt (s.a. Icinga NRPE Plugin#Nagios/Icinga Client). Über die Angabe eines PCI Bus Device Strings wird die zu überwachende GPU definiert. Dieser Device String kann über das nvidia-smi-Tool eruiert werden:
$ nvidia-smi -a |grep 'Bus Id'
Bus Id : 0000:83:00.0
Der soeben ausgegebene String identifiziert die GPU des Systems:
$ sudo vi /etc/nagios/nrpe_local.cfg
command[check_gpu_sensor]=/usr/lib/nagios/plugins/check_gpu_sensor -db '0000:83:00.0'
Anstatt des PCI Bus Device Strings kann auch die Device ID verwendet werden. Der Nachteil der Device IDs ist, dass nicht garantiert ist, dass über Reboots hinweg die selben IDs an die selben GPUs vergeben werden. Die Angabe des PCI Strings ist daher den Device IDs vorzuziehen:
$ ./check_gpu_sensor -db 0000:83:00.0
Warning - Tesla K20 [persistenceMode = Warning]|ECCL2AggSgl=0;1;2; ECCTexAggSgl=0;1;2; memUtilRate=1 PWRUsage=31.61;150;200;
ECCRegAggSgl=0;1;2; SMClock=705 ECCL1AggSgl=0;1;2; GPUTemperature=37;85;100; memClock=2600 usedMemory=0.24;95;99; fanSpeed=30;80;95;
graphicsClock=705 GPUUtilRate=27 ECCMemAggSgl=0;1;2;
$ ./check_gpu_sensor -d 0
Warning - Tesla K20 [persistenceMode = Warning]|ECCL2AggSgl=0;1;2; ECCTexAggSgl=0;1;2; memUtilRate=0 PWRUsage=30.36;150;200;
ECCRegAggSgl=0;1;2; SMClock=705 ECCL1AggSgl=0;1;2; GPUTemperature=38;85;100; memClock=2600 usedMemory=0.24;95;99; fanSpeed=30;80;95;
graphicsClock=705 GPUUtilRate=0 ECCMemAggSgl=0;1;2;
Das obige Beispiel zeigt eine Warnung, da der Persistence Mode unter Linux nicht aktiviert wurde.
Zuletzt muss noch in der Datei "/etc/nagios/nrpe.cfg" die IP-Adresse des Nagios/Icinga-Servers (z.B. 10.0.0.3) eingetragen werden, um eine NRPE-Verbindung zu erlauben:
sudo vi /etc/nagios/nrpe.cfg
...
allowed_hosts=127.0.0.1,10.0.0.3
...
Nach einem Restart des NPRE-Servers ist die NRPE-Konfiguration am überwachten Host abgeschlossen:
$ sudo /etc/init.d/nagios-nrpe-server restart
Am Icinga Server
Am Icinga Server werden
- eine Icinga-Installation
- und für die Überwachung eines Remote-Hosts ein NRPE-Plugin (Icinga NRPE Plugin#Icinga Server)
vorausgesetzt. Wurden beide Teile erfolgreich installiert und konfiguriert, kann für den GPU-Host eine neue Service-Konfiguration angelegt werden:
:~# vi /usr/local/icinga/etc/objects/gpu-host.cfg
define host{
use linux-server
host_name GpuNode
alias GpuNode
address 10.0.0.1
}
define service{
use generic-service
host_name GpuNode
service_description GPU SENSOR
check_command check_nrpe!check_gpu_sensor
}
Damit dieser Service auch aktiv wird, wird der Pfad der Service-Datei in die Icinga-Konfiguration eingetragen:
:~# vi /usr/local/icinga/etc/icinga.cfg
[...]
cfg_file=/usr/local/icinga/etc/objects/gpu-host.cfg
[...]
Daraufhin kann die NRPE-Verbindung mit dem GPU-Sensor-Plugin getestet werden:
:~# /usr/lib/nagios/plugins/check_nrpe -H 10.0.0.1 -c check_gpu_sensor
OK - Tesla K20 |ECCL2AggSgl=0;1;2; ECCTexAggSgl=0;1;2; memUtilRate=0 PWRUsage=49.81;150;200; ECCRegAggSgl=0;1;2; SMClock=705
ECCL1AggSgl=0;1;2; GPUTemperature=38;85;100; memClock=2600 usedMemory=0.24;95;99; fanSpeed=30;80;95; graphicsClock=705
GPUUtilRate=0 ECCMemAggSgl=0;1;2;
Einzelnachweise
- ↑ 1,0 1,1 NVIDIA Management Library (NVML) (developer.nvidia.com)
- ↑ The NVML API Reference Manual (developer.download.nvidia.com)
- ↑ Ubuntu nvidia-current package (packages.ubuntu.com)
Autor: Georg Schönberger Georg Schönberger, Abteilung DevOps bei der XORTEX eBusiness GmbH, absolvierte an der FH OÖ am Campus Hagenberg sein Studium zum Bachelor Computer- und Mediensicherheit, Studium Master Sichere Informationssysteme. Seit 2015 ist Georg bei XORTEX beschäftigt und arbeitet sehr lösungsorientiert und hat keine Angst vor schwierigen Aufgaben. Zu seinen Hobbys zählt neben Linux auch Tennis, Klettern und Reisen.
|