Job / Praca

    Wykres temperatury serwera w RRD (NetBSD)

    Zastanawiałem się ostatnio jak wyrysować sobie temperaturę jaką ma serwer lub jego otoczenie (zależnie od zainstalowanych sensorów) w serwerowni, bez instalowania mysql i cacti (oraz pluginów ponieważ domyślnie z snmp chyba temperatury zczytać nie można).

    W NetBSD mamy możliwość sprawdzania danych z ACPI przy pomocy envstat. Trzeba przekompilować kernel aby zawierał odpowiednie „hardware monitory”.

    Działanie envstat wygląda nastepująco i różni się w zależności od maszyny, niemniej jednak różnego rodzaju temperatury powinny być widoczne:

    cancer@snort~/rrd[175]13:34#envstat
     Current  CritMax  CritMin  CritCap     Unit
    [ipmi0]
     PS 2 Status:        OFF
     PS 1 Status:        OFF
     CPU Vtt:      1.250                                   V
     CPU 2 VCore:      1.040                                   V
     CPU 1 VCore:      1.260                                   V
     DASD Temp:     26.000                                degC
     VBAT:      3.184                                   V
     -12V Sense:    -11.412                                   V
     12VA Sense:     12.033                                   V
     5V Sense:      5.018                                   V
     12VC Sense:     12.600                                   V
     12VB Sense:     12.600                                   V
     2.5V Sense:      2.590                                   V
     1.8V Sense:      1.810                                   V
     1.5V Sense:      1.550                                   V
     1.3V Sense:      1.400                                   V
     1.25V Sense:      1.310                                   V
     CPU 2 Temp:     29.000                                degC
     CPU 1 Temp:     29.000                                degC
     Fan 12 Tach:       1740                                 RPM
     Fan 11 Tach:       1860                                 RPM
     Fan 10 Tach:       1830                                 RPM
     Fan 9 Tach:       1890                                 RPM
     Fan 8 Tach:       1680                                 RPM
     Fan 7 Tach:       1710                                 RPM
     Fan 6 Tach:       1710                                 RPM
     Fan 5 Tach:       1860                                 RPM
     Fan 4 Tach:       1800                                 RPM
     Fan 3 Tach:       1800                                 RPM
     Fan 2 Tach:       1710                                 RPM
     Fan 1 Tach:       1680                                 RPM
     Ambient Temp:     21.000                                degC
    

    W moim przypadku na tym serwerze interesujące jest oczywiście pole Ambient Temp:. Nie ma tu reguły i różni producenci stosują różne oznaczenia. W IBM jest Ambient Temp, w HP Rear Ambient, gdzieś indziej może być np Aux Temp: itp.  Przyjmujemy wartość Ambient Temp, że to jest to co nam chodzi i przy pomocy grep i awk wycinamy resztę:

    envstat | grep "Ambient Temp" | awk '{print $3}'

    W wyniku dostajemy samą temperaturę czyli 21.000

    Aby oznaczyć dane na wykresie trze je umieścić w czasie, do tego wystarczy nam systemowy date działający tak aby pokazywał „timestamp” czyli czas w sekundach od początku epoki. Za timestampem dostawimy dwukropek który będzie oddzielał znacznik czasu od wartości temperatury, czyli:

    date +%s:

    dostajemy 1272542448: Za pomocą date -r 1272542448 można odczytać jaką dokładnie datę pokazuje timestamp: Thu Apr 29 14:00:48 CEST 2010

    Potrzebne jeszcze jest jedno zewnętrzne narzędzie do gromadzenia danych oraz rysowania wykresu – RRDTool

    Po zainstalowaniu z databases/rrdtool w pkgsrc możemy przystąpić do tworzenia bazy:

    rrdtool create /usr/home/cancer/rrd/temperatura.rrd -s 300 \
    DS:temperatura:GAUGE:400:10:50 \
    RRA:AVERAGE:0.5:1:210240 \
    RRA:MAX:0.5:1:210240 \
    RRA:MIN:0.5:1:210240 \
    RRA:LAST:0.5:1:210240 \

    Taka baza będzie aktualizowana co 5 minut (-s 300), oraz będzie gromadziła dane w zakresie od 10 stopni do 50 stopni Celsjusza (tak, po awarii klimatyzacji w serwerowni może być taka temperatura :).

    W zasadzie mamy wszystko. Przy pomocy rrdtool update /usr/home/cancer/rrd/temperatura.rrd timestamp:temperatura można już wypełniać bazę danymi.

    Teraz trochę automatyzacji, na początek skrypt:

    #!/bin/ksh
    echo -n `date +%s:` >> /usr/home/cancer/rrd/temprrd.txt
    echo -n `envstat | grep "Ambient Temp" | awk '{print $3}'` >> /usr/home/cancer/rrd/temprrd.txt
    echo " " >> /usr/home/cancer/rrd/temprrd.txt
    temperatura=`cat /usr/home/cancer/rrd/temprrd.txt`
    /usr/pkg/bin/rrdtool update /usr/home/cancer/rrd/temperatura.rrd $temperatura
    /usr/pkg/bin/rrdtool graph /usr/home/cancer/public_html/temperatura.png --imgformat PNG --title="Tempertatura w serwerowni" --width 800 --height 300 --vertical-label="Stopnie Celsjusza .C" --end now --start end-2592000s DEF:temp=/usr/home/cancer/rrd/temperatura.rrd:temp:AVERAGE GPRINT:temp:LAST:"aktualna %2.2lf .C" GPRINT:temp:MIN:"minimalna %2.2lf .C" GPRINT:temp:MAX:"maksymalna %2.2lf .C" GPRINT:temp:AVERAGE:"srednia %2.2lf .C" AREA:temp#6060ef LINE1:temp#0000ff
    rm /usr/home/cancer/rrd/temprrd.txt

    Wrzucamy go do dowolnego pliku oraz nadajemy mu prawa do wykonania. Co z czym tu się je:

    1. Pierwsza linia wyświetla timestamp oraz dwukropek oraz zapisuje wszystko do pliku /usr/home/cancer/rrd/temprrd.txt. Opcja -n powoduje, że nie mamy znaku nowej lini i powrotu karetki.
    2. Druga liniawycina nam temperature i wstawia ją w tym samym pliku zaraz za dwukropkiem
    3. Trzecia linia dostawia spacje wraz ze znakiem końca linii.
    4. Przy pomocy polecenia cat podstawiamy naszą daną z pliku temprrd.txt pod zmienną temperatura.
    5. Aktualizujemy bazę danymi ze zmiennej temperatura.
    6. Rysujemy wykres. WAŻNE ! Ta linia aż do temp#0000ff musi być w całości !
    7. Ostatnia linia usuwa plik z danymi tymczasowymi.

    Taki skrypt dodajemy do crontaba aby był uruchamiany co 5 miut:
    */5 * * * * /bin/ksh /usr/home/cancer/rrd/temprrd.sh >/dev/null 2>&1

    Za kilkanaście minut powinien pojawić się wykres mniej więcej taki jak ten poniżej:

    Related Posts with Thumbnails

    © odwiedź stronę http://maciejewski.org po więcej fajnych postów!

    Add your widget here