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:
© odwiedź stronę http://maciejewski.org po więcej fajnych postów!