It's a star sign, not disease ;)
In: Job / Praca|NetBSD
29 kwi 2010Dzięki za regularne odwiedziny na moim blogu! Jeśli uważasz, że jest on godny polecenia to śmiało wyślij link do niego lub link do kanału RSS albo subskrypcje przez e-mail znajomym. Dzięki !
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ę:
1 | 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:
1 | 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:
1 2 3 4 5 6 | 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
1 | rrdtool update /usr/home/cancer/rrd/temperatura.rrd timestamp:temperatura |
można już wypełniać bazę danymi.
Teraz trochę automatyzacji, na początek skrypt:
1
2
3
4
5
6
7
8 #!/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:
1 | */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:

Popularity: 1% [?]
Viewed 557 times by 60 viewers
Witaj czytelniku! Nazywam się Bartosz Maciejewski i jestem Administratorem sieci oraz systemów UNIX/Windows. Na moim blogu znajdziesz zatem wpisy dotyczące głównie tej tematyki. Od czasu do czasu pisuję też bardziej prywatnie zwłaszcza o mojej córce Tosi Miłego Czytania! EOF ;)