Мониторинг FreeBSD сервера на основе простейших shell скриптов и RRDtool

Мониторинг FreeBSD сервера на основе простейших shell скриптов и RRDtool

Мониторинг и отображение температуры жестких дисков сервера с помощью RRDTOOL

Для получения данных о жестких дисках под FreeBSD в портах имеется пакет утилит smartmontools. Его возможности довольно широки, но я его хочу задействовать только лишь для получения информации о температуре и подробного руководства по smartmontools писать не буду (пока!). На данном этапе, просто установите пакет и портов:

# cd /usr/ports/sysutils/smartmontools/
# make install clean

После установки в Ваших руках окажется утилита smartctl которая может показать довольно обширную информацию о том или ином жестком диске. Правда не о каждом, а только о том, который поддерживает технологию S.M.A.R.T. Поддерживаются ATA-3 и более поздние ATA, IDE и SCSI-3. За более подробной информацией лучше обратиться в man smartctl. Что можно извлечь с помощью smartctl:

# smartctl -a /dev/ad0
smartctl version 5.38 [i386-portbld-freebsd7.1] Copyright (C) 2002-8 Bruce Allen
Home page is http://smartmontools.sourceforge.net/

=== START OF INFORMATION SECTION ===
Model Family:     Seagate Barracuda 7200.7 and 7200.7 Plus family
Device Model:     ST3120026A
Serial Number:    5JS6GAJ1
Firmware Version: 8.54
User Capacity:    120 034 123 776 bytes
Device is:        In smartctl database [for details use: -P show]
ATA Version is:   6
ATA Standard is:  ATA/ATAPI-6 T13 1410D revision 2
Local Time is:    Tue Apr  7 23:45:54 2009 EEST
SMART support is: Available - device has SMART capability.
SMART support is: Enabled

=== START OF READ SMART DATA SECTION ===
SMART overall-health self-assessment test result: PASSED

General SMART Values:
Offline data collection status:  (0x82) Offline data collection activity
                                        was completed without error.
                                        Auto Offline Data Collection: Enabled.
Self-test execution status:      (   0) The previous self-test routine completed
                                        without error or no self-test has ever
                                        been run.
Total time to complete Offline
data collection:                 ( 430) seconds.
Offline data collection
capabilities:                    (0x5b) SMART execute Offline immediate.
                                        Auto Offline data collection on/off support.
                                        Suspend Offline collection upon new
                                        command.
                                        Offline surface scan supported.
                                        Self-test supported.
                                        No Conveyance Self-test supported.
                                        Selective Self-test supported.
SMART capabilities:            (0x0003) Saves SMART data before entering
                                        power-saving mode.
                                        Supports SMART auto save timer.
Error logging capability:        (0x01) Error logging supported.
                                        General Purpose Logging supported.
Short self-test routine
recommended polling time:        (   1) minutes.
Extended self-test routine
recommended polling time:        (  85) minutes.

SMART Attributes Data Structure revision number: 10
Vendor Specific SMART Attributes with Thresholds:
ID# ATTRIBUTE_NAME          FLAG     VALUE WORST THRESH TYPE      UPDATED  WHEN_FAILED RAW_VALUE
  1 Raw_Read_Error_Rate     0x000f   059   056   006    Pre-fail  Always       -       91272753
  3 Spin_Up_Time            0x0003   097   096   000    Pre-fail  Always       -       0
  4 Start_Stop_Count        0x0032   100   100   020    Old_age   Always       -       40
  5 Reallocated_Sector_Ct   0x0033   100   100   036    Pre-fail  Always       -       0
  7 Seek_Error_Rate         0x000f   087   060   030    Pre-fail  Always       -       551657551
  9 Power_On_Hours          0x0032   084   084   000    Old_age   Always       -       14621
 10 Spin_Retry_Count        0x0013   100   100   097    Pre-fail  Always       -       0
 12 Power_Cycle_Count       0x0032   097   097   020    Old_age   Always       -       3262
194 Temperature_Celsius     0x0022   052   065   000    Old_age   Always       -       52
195 Hardware_ECC_Recovered  0x001a   059   056   000    Old_age   Always       -       91272753
197 Current_Pending_Sector  0x0012   100   100   000    Old_age   Always       -       0
198 Offline_Uncorrectable   0x0010   100   100   000    Old_age   Offline      -       0
199 UDMA_CRC_Error_Count    0x003e   200   185   000    Old_age   Always       -       1049
200 Multi_Zone_Error_Rate   0x0000   100   253   000    Old_age   Offline      -       0
202 TA_Increase_Count       0x0032   100   253   000    Old_age   Always       -       0

SMART Error Log Version: 1
ATA Error Count: 207 (device log contains only the most recent five errors)
        CR = Command Register [HEX]
        FR = Features Register [HEX]
        SC = Sector Count Register [HEX]
        SN = Sector Number Register [HEX]
        CL = Cylinder Low Register [HEX]
        CH = Cylinder High Register [HEX]
        DH = Device/Head Register [HEX]
        DC = Device Command Register [HEX]
        ER = Error register [HEX]
        ST = Status register [HEX]
Powered_Up_Time is measured from power on, and printed as
DDd+hh:mm:SS.sss where DD=days, hh=hours, mm=minutes,
SS=sec, and sss=millisec. It "wraps" after 49.710 days.

Error 207 occurred at disk power-on lifetime: 10047 hours (418 days + 15 hours)
  When the command that caused the error occurred, the device was active or idle.

  After command completion occurred, registers were:
  ER ST SC SN CL CH DH
  -- -- -- -- -- -- --
  84 51 01 4b 00 00 e0  Error: ICRC, ABRT 1 sectors at LBA = 0x0000004b = 75

  Commands leading to the command that caused the error were:
  CR FR SC SN CL CH DH DC   Powered_Up_Time  Command/Feature_Name
  -- -- -- -- -- -- -- --  ----------------  --------------------
  c8 00 01 4b 00 00 e0 00      00:48:25.334  READ DMA
  c8 00 01 4b 00 00 e0 00      00:48:24.684  READ DMA
  c8 00 01 4b 00 00 e0 00      00:48:24.684  READ DMA
  c8 00 01 4a 00 00 e0 00      00:48:24.683  READ DMA
  c8 00 01 49 00 00 e0 00      00:48:24.683  READ DMA

Error 206 occurred at disk power-on lifetime: 10047 hours (418 days + 15 hours)
  When the command that caused the error occurred, the device was active or idle.

  After command completion occurred, registers were:
  ER ST SC SN CL CH DH
  -- -- -- -- -- -- --
  84 51 01 4b 00 00 e0  Error: ICRC, ABRT 1 sectors at LBA = 0x0000004b = 75

  Commands leading to the command that caused the error were:
  CR FR SC SN CL CH DH DC   Powered_Up_Time  Command/Feature_Name
  -- -- -- -- -- -- -- --  ----------------  --------------------
  c8 00 01 4b 00 00 e0 00      00:48:25.334  READ DMA
  c8 00 01 4b 00 00 e0 00      00:48:24.684  READ DMA
  c8 00 01 4a 00 00 e0 00      00:48:24.684  READ DMA
  c8 00 01 49 00 00 e0 00      00:48:24.683  READ DMA
  c8 00 01 48 00 00 e0 00      00:48:24.683  READ DMA

Error 205 occurred at disk power-on lifetime: 10047 hours (418 days + 15 hours)
  When the command that caused the error occurred, the device was active or idle.

  After command completion occurred, registers were:
  ER ST SC SN CL CH DH
  -- -- -- -- -- -- --
  84 51 01 4b 00 00 e0  Error: ICRC, ABRT 1 sectors at LBA = 0x0000004b = 75

  Commands leading to the command that caused the error were:
  CR FR SC SN CL CH DH DC   Powered_Up_Time  Command/Feature_Name
  -- -- -- -- -- -- -- --  ----------------  --------------------
  c8 00 01 4b 00 00 e0 00      00:46:59.959  READ DMA
  c8 00 01 4a 00 00 e0 00      00:48:24.684  READ DMA
  c8 00 01 49 00 00 e0 00      00:48:24.684  READ DMA
  c8 00 01 48 00 00 e0 00      00:48:24.683  READ DMA
  c8 00 01 47 00 00 e0 00      00:48:24.683  READ DMA

Error 204 occurred at disk power-on lifetime: 10044 hours (418 days + 12 hours)
  When the command that caused the error occurred, the device was active or idle.

  After command completion occurred, registers were:
  ER ST SC SN CL CH DH
  -- -- -- -- -- -- --
  84 51 01 4e 00 00 e0  Error: ICRC, ABRT 1 sectors at LBA = 0x0000004e = 78

  Commands leading to the command that caused the error were:
  CR FR SC SN CL CH DH DC   Powered_Up_Time  Command/Feature_Name
  -- -- -- -- -- -- -- --  ----------------  --------------------
  c8 00 10 3f 00 00 e0 00      02:01:58.942  READ DMA
  c8 00 10 3f 00 00 e0 00      02:01:58.942  READ DMA
  c8 00 10 3f 00 00 e0 00      02:01:58.941  READ DMA
  c8 00 10 4f 00 00 e0 00      02:01:58.941  READ DMA
  c8 00 10 bf 00 00 e0 00      02:01:58.940  READ DMA

Error 203 occurred at disk power-on lifetime: 10044 hours (418 days + 12 hours)
  When the command that caused the error occurred, the device was active or idle.

  After command completion occurred, registers were:
  ER ST SC SN CL CH DH
  -- -- -- -- -- -- --
  84 51 01 4e 00 00 e0  Error: ICRC, ABRT 1 sectors at LBA = 0x0000004e = 78

  Commands leading to the command that caused the error were:
  CR FR SC SN CL CH DH DC   Powered_Up_Time  Command/Feature_Name
  -- -- -- -- -- -- -- --  ----------------  --------------------
  c8 00 10 3f 00 00 e0 00      02:01:58.942  READ DMA
  c8 00 10 3f 00 00 e0 00      02:01:58.942  READ DMA
  c8 00 10 4f 00 00 e0 00      02:01:58.941  READ DMA
  c8 00 10 bf 00 00 e0 00      02:01:58.941  READ DMA
  c8 00 02 3f 00 00 e0 00      02:01:58.940  READ DMA

SMART Self-test log structure revision number 1
Num  Test_Description    Status                  Remaining  LifeTime(hours)  LBA_of_first_error
# 1  Short offline       Completed without error       00%     10044         -
# 2  Short offline       Completed without error       00%     10043         -

SMART Selective self-test log data structure revision number 1
 SPAN  MIN_LBA  MAX_LBA  CURRENT_TEST_STATUS
    1        0        0  Not_testing
    2        0        0  Not_testing
    3        0        0  Not_testing
    4        0        0  Not_testing
    5        0        0  Not_testing
Selective self-test flags (0x0):
  After scanning selected spans, do NOT read-scan remainder of disk.
If Selective self-test is pending on power-up, resume after 0 minute delay.

Дофига всякой инфы о HDD. Но нам из всего этого нужно только одно:

# smartctl -a /dev/ad0 | grep "Temperature_Celsius"
194 Temperature_Celsius     0x0022   052   065   000    Old_age   Always       -       52

Последний столбец - именно то, что нам нужно. Отделим его в будущем с помощью awk, но для начала создадим новую базу RRD, которая полностью продублирует базу SYSTEM_TEMPERATURE.rrd (из предыдущего примера), просто изменятся имена DS.

Создание базы данных RRD для хранения статистики температуры жестких дисков сервера

Всего у меня в системе три жестких диска и для каждого будет отслеживаться температура. Диски в системе расположены как: ad0 ad1 и ad3. Скрипт для создания базы:

#!/bin/sh # # Created by Daemony | http://daemony.org/ # RRDPREFIX=/usr/NET/rrd rrdtool create $RRDPREFIX/HDD_TEMPERATURE.rrd --step 60 DS:ad0temp:GAUGE:600:U:U DS:ad1temp:GAUGE:600:U:U DS:ad3temp:GAUGE:600:U:U RRA:AVERAGE:0.5:1:525600 RRA:MAX:0.5:1440:90 RRA:MIN:0.5:1440:90 RRA:LAST:0.5:1440:90

Сохраните скрипт и выполните его. Перейдем к накоплению статистики.

Наполнение базы данных RRD значениями температуры жестких дисков сервера

Скрипт, с помощью которого по cron'у мы будем вносить значения температуры дисков выглядит так:

#!/bin/sh
#
# Created by Daemony | http://daemony.org/
#

RRDPREFIX=/usr/NET/rrd
MONITOR="/usr/local/sbin/smartctl -a "

    ad0temp=`$MONITOR /dev/ad0 | grep "Temperature_Celsius" | awk -F " " '{print $10}'`
    ad1temp=`$MONITOR /dev/ad1 | grep "Temperature_Celsius" | awk -F " " '{print $10}'`
    ad3temp=`$MONITOR /dev/ad3 | grep "Temperature_Celsius" | awk -F " " '{print $10}'`

    `/usr/local/bin/rrdtool update $RRDPREFIX/HDD_TEMPERATURE.rrd N:$ad0temp:$ad1temp:$ad3temp`

Вообще, можно было бы объединить скрипты, собирающие статистику температуры ЦПУ, материнской платы, чипов и температуры жестких дисков. Но расписано все по отдельности для более быстрого понимания читателем. А Вы уже вольны переписывать свои скрипты как пожелаете.

Скрипт обновления базы RRD (назовем его UPDATE_HDD_TEMPERATURE.sh) с температурой дисков помещаем в /etc/crontab

###################
# COUNTERS
###################
#
# ---- RRDdb Updates ----
*/1   *   *   *   *  root  /usr/NET/scripts/UPDATE_TRAF.sh >/dev/null 2>&1
*/1   *   *   *   *  root  /usr/NET/scripts/UPDATE_CPU-RAM-PS.sh >/dev/null 2>&1
*/1   *   *   *   *  root  /usr/NET/scripts/UPDATE_SYSTEM_TEMPERATURE.sh >/dev/null 2>&1
*/1   *   *   *   *  root  /usr/NET/scripts/UPDATE_HDD_TEMPERATURE.sh >/dev/null 2>&1
# ---- RRDdb Create graphs ----
*/5   *   *   *   *  root  /usr/NET/scripts/CREATE_GRAPH_TRAF.sh >/dev/null 2>&1
*/5   *   *   *   *  root  /usr/NET/scripts/CREATE_GRAPH_SYSTEM.sh >/dev/null 2>&1
*/5   *   *   *   *  root  /usr/NET/scripts/CREATE_GRAPH_SYSTEM_TEMPERATURE.sh >/dev/null 2>&1

Можно перейти к графикам.

Построение графиков статистики температуры жестких дисков сервера

И последний на сегодня пример скрипта. Он практически такой же, как и тот, что был в предыдущем примере. Но, поскольку температура всех трех моих HDD практически одинаковая, и дабы они не перекрывали друг друга своими площадями, я буду использовать вместо AREA - LINE1. Скрипт таков:

#!/bin/sh # # Created by Daemony | http://daemony.org/ # export LANG=KOI8-R export LC_ALL=ru_RU.KOI8-R RRDPREFIX=/usr/NET/rrd WWWPREFIX=/usr/NET/www_pub RRDCMD="/usr/local/bin/rrdtool" $RRDCMD graph $WWWPREFIX/HDD-TEMP_6h.png --width 760 --height 150 --imgformat PNG --start -6h --end now-30s --slope-mode --font-render-mode light --font DEFAULT:8:Tahoma --font TITLE:7:Arial --font AXIS:6:Arial --font UNIT:7:"Courier New" --font LEGEND:6:"Courier New" --font WATERMARK:6:Arial --color BACK#2F2F2F --color CANVAS#333333 --color SHADEA#CCCCCC --color SHADEB#CCCCCC --color FONT#FFFFFF --color AXIS#FFFFFF --color ARROW#FF0000 --color GRID#CCCCCC --color MGRID#CCCCCC --vertical-label "Градусов Цельсия" --title "Показания датчиков температуры жестких дисков за последние 6 часов" DEF:ad0temp=$RRDPREFIX/HDD_TEMPERATURE.rrd:ad0temp:AVERAGE DEF:ad1temp=$RRDPREFIX/HDD_TEMPERATURE.rrd:ad1temp:AVERAGE DEF:ad3temp=$RRDPREFIX/HDD_TEMPERATURE.rrd:ad3temp:AVERAGE HRULE:60#FFFF00:"Нежелательный предел температур "r HRULE:80#FF0000:"Критический предел температур "r COMMENT:" "n LINE1:ad0temp#FFFF00:"Диск /dev/ad0 " GPRINT:ad0temp:LAST:"Last %6.1lf градусов " GPRINT:ad0temp:MAX:"Max %6.1lf градусов " GPRINT:ad0temp:AVERAGE:"Avg %6.1lf градусов " GPRINT:ad0temp:MIN:"Min %6.1lf градусов "c COMMENT:n LINE1:ad1temp#99FFCC:"Диск /dev/ad1 " GPRINT:ad1temp:LAST:"Last %6.1lf градусов " GPRINT:ad1temp:MAX:"Max %6.1lf градусов " GPRINT:ad1temp:AVERAGE:"Avg %6.1lf градусов " GPRINT:ad1temp:MIN:"Min %6.1lf градусов "c COMMENT:n LINE1:ad3temp#33CCCC:"Диск /dev/ad3 " GPRINT:ad3temp:LAST:"Last %6.1lf градусов " GPRINT:ad3temp:MAX:"Max %6.1lf градусов " GPRINT:ad3temp:AVERAGE:"Avg %6.1lf градусов " GPRINT:ad3temp:MIN:"Min %6.1lf градусов "c COMMENT:n COMMENT:"Charts created by Daemony .:. live.daemony.org"r COMMENT:n

Готово. Сохраняем его с именем, например, CREATE_GRAPH_HDD_TEMPERATURE.sh и вешаем в /etc/crontab

###################
# COUNTERS
###################
#
# ---- RRDdb Updates ----
*/1   *   *   *   *  root  /usr/NET/scripts/UPDATE_TRAF.sh >/dev/null 2>&1
*/1   *   *   *   *  root  /usr/NET/scripts/UPDATE_CPU-RAM-PS.sh >/dev/null 2>&1
*/1   *   *   *   *  root  /usr/NET/scripts/UPDATE_SYSTEM_TEMPERATURE.sh >/dev/null 2>&1
*/1   *   *   *   *  root  /usr/NET/scripts/UPDATE_HDD_TEMPERATURE.sh >/dev/null 2>&1
# ---- RRDdb Create graphs ----
*/5   *   *   *   *  root  /usr/NET/scripts/CREATE_GRAPH_TRAF.sh >/dev/null 2>&1
*/5   *   *   *   *  root  /usr/NET/scripts/CREATE_GRAPH_SYSTEM.sh >/dev/null 2>&1
*/5   *   *   *   *  root  /usr/NET/scripts/CREATE_GRAPH_SYSTEM_TEMPERATURE.sh >/dev/null 2>&1
*/5   *   *   *   *  root  /usr/NET/scripts/CREATE_GRAPH_HDD_TEMPERATURE.sh >/dev/null 2>&1

И наслаждаемся жизнью. :)


ЗАКЛЮЧЕНИЕ

Уважаемый читатель, я очень надеюсь, что на твой взгляд мне удалось доходчиво и понятно изложить все написанное. Если что не так, сильно не пинай. Твои комментарии в виде дополнений или исправлений, как обычно, приветствуются.

Теперь, понимая основной смысл работы RRD, Вы без труда нарисуете для себя графики за любой период времени. Для этого достаточно будет поменять значение --start.

  • --start -1d - для периода в одни день;
  • --start -1w - для периода в одну неделю;
  • --start -1m - для периода в один месяц;
  • --start -1y - для периода в один год.

В будущем, возможно, данная публикация будет дополнена и/или исправлена, если понадобится собирать и обсчитывать статистику чего-то еще.

Все 6-ти часовые графики моего сервера Вы можете увидеть на странице блога "МОНИТОР", а также графики за последние 24 часа, за последние три дня, за последнюю неделю и последний месяц по ссылкам:

Благодарю читателя под ником Qaz за указание на проблему, в следствии которой во всех листингах скриптов движком сайта были затерты все обратные слеши. Если Вы где-то заметили недостающий (либо лишний) слеш, дайте мне об этом знать удобным Вам способом.

Удачи!

Предыдущая страница Предыдущая страница    
ПРИ ЧАСТИЧНОМ, ЛИБО ПОЛНОМ КОПИРОВАНИИ МАТЕРИАЛОВ ЭТОГО САЙТА, ПОЖАЛУЙСТА, НЕ ЗАБЫВАЙТЕ УКАЗЫВАТЬ ССЫЛКУ http://daemony.org/ КАК НА ИСТОЧНИК!

Понравился материал? Добавьте к себе в:

Тэги: , , , , , , , , , , , , , , , , , ,

Об авторе Daemony

Это мой персональный Блог! Веду его с переменным успехом с 2007 года. Пишу здесь обо всем, что мне интересно. Среди моих интересов: системное администрирование *nix систем, компьютерные технологии, фотография и многое другое. Подробнее можно почитать на странице "О блоге". Связаться со мной можно через форму обратной связи на этом сайте. Спасибо, за то, что посетили My Live Blog!
Подпишитесь на новые комментарии к этой публикации.

Комментариев: 166

  1. а Munin ваще прелесть =)

  2. Cacti давно уже упрощает труд

  3. «Количество килобайт на страницу можно посмотреть командой:
    # sysctl hw.pagesize» — s/килобайт/байт/

  4. Очень подробная статья! Спасибо!
    Побольше бы таких описаний в сети!

Поделиться мнением

Ваш e-mail не будет опубликован. Обязательные поля помечены *

*
*

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!:

Перед тем, как нажать кнопку "Отправить" введите проверочный код с изображения