Nagios - iotop plugin - monitoring I/O
Monitorování I/O systému pomocí utility iotop a následný přenos dat do nagiosu využíváme k sledování čtení a zápisů na disk našich serverů. Slouží k hrubé představě o tom, jak systém I/O využívá. Iotop zobrazuje souhrná čísla pro čtení a zápis, ta budeme ukládat v nagiosu a zobrazovat pomocí frontendu centreon.
Iotop je utilita pro monitorování I/O navržená podle vzhledu a chování unixové utility top. Poskytuje zjednodušený pohled na procesy, které využívají I/O a zobrazuje celková čísla pro zápis a čtení z disku (neřeší, na kterém z disků operace probíhá). Utilita tak nevystihuje, jak je využit který disk, ale spíše jak který proces masivně využívá čtení a zápisy. Zároveň poskytuje zjednodušená celková čísla pro zápis a čtení disků (Total DISK READ | Total DISK WRITE). Tyto dvě hodnoty chceme monitorovat v nagiosu.
(Obrázek: Okno iotopu v konzoli)
Protože se ale hodnoty Total DISK READ a Total DISK WRITE mění v čase velmi značně, budeme muset data odečíst několikrát za sebou v krátkých intervalech a jejich hodnoty zprůměrovat. Počet oprakování se dá scriptu podstrčit v parametru repeats.
Hodnoty převádíme na byty, aby bylo možné zachovat konzistenci dat (iotop je zobrazuje v lidsky čitelných hodnotách - například kilo a mega bytech).
Ted už samotný script monitorovacího pluginu:
#! /usr/bin/env python import re import sys import getopt import subprocess # converts speed to Bytes def convert(speed, units): if units == "B": return speed elif units == "K": return speed * 1024 elif units == "M": return speed * 1024 * 1024 try: # params with default names in nagios # -w : warning level, in percents # -c : critical level, in percents # -repeats : repeats count opts, args = getopt.getopt(sys.argv[1:], "c:w:r:", []) # default values host = None warning_level = 10 critical_level = 5 repeats_count = 15 for opt, arg in opts: if opt in ("-c"): critical_level = int(arg) elif opt in ("-w"): warning_level = int(arg) elif opt in ("-r"): repeats_count = int(arg) results_read = [] results_write = [] for iteration in range(repeats_count): process = subprocess.Popen('iotop -b -n 1', shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) output, errors = process.communicate() process.wait() match = re.search('Total DISK READ: (.*?) (\w+?)/s \\| Total DISK WRITE: (.*?) (\w+?)/s', output) speed_read = float(match.group(1)) units_read = match.group(2) speed_write = float(match.group(3)) units_write = match.group(4) # now i need to convert all to bits/s results_read.append(convert(speed_read, units_read)) results_write.append(convert(speed_write, units_write)) average_speed_read = int(round(float(sum(results_read) / len(results_read)))) average_speed_write = int(round(float(sum(results_write)) / len(results_write))) except: print "Unknown: " + str(sys.exc_info()[1]) exit(3) # default return values return_code = 0 status_message = "OK" if average_speed_read > warning_level or average_speed_write > warning_level: if average_speed_read > critical_level or average_speed_write > critical_level: status_message="Critical" return_code = 2 else: status_message = "Warning" return_code = 1 print status_message + ", disk read: "+str(average_speed_read)+"B/s, disk write: "+str(average_speed_write)+"B/s |read="+str(average_speed_read)+"B/s;;;;write="+str(average_speed_write)+"B/s;;;;" exit(return_code)
Script už jen jednoduše nahrajete na monitorovaný server a voláte jej například pomocí obalového pluginu check_by_ssh , který zajistí přístup ke vzdálenému stroji pomocí ssh. Data se sbírají do nagiosu, graf níže je pak vyrenderovaný z centreonu (grafická nadstavba nad nagiosem)
Takový monitoring vám pak poskytne informaci o tom, jak moc stroj zapisuje/čte. Pokud vás zajímají přesnější čísla, monitoring jednotlivých disků, zaměřte se spíše na data z http://en.wikipedia.org/wiki/Iostat.