Kleine und große Linux AHAs
Beiträge getaggt mit cron
Incron – Ein Fileevent basierter Cron
01. Feb
Zeitgesteuert Skripte oder Programme über Cron zu starten ist ja schon sehr praktisch. Nicht selten möchte man aber sofort eine neue Datei verarbeiten, sobald diese im Dateisystem erzeugt wurde. Bevor man aber nun einen Cronjob einplant, der im Minutentakt prüft ob neue Dateien angelegt wurden, gibt es eine viel elegantere Methode sofort, ohne Zeitverlust zu reagieren. Hier kommt incron ins Spiel.
incron
incron arbeitet ähnlich wie das bekannte cron, wird aber nicht zeitlich sondern durch Dateisystem Events gesteuert. So ist es möglich mehrere Verzeichnisse zu überprüfen und wenn auf eine Datei zugegriffen wird, ein entsprechendes Programm zu starten.
Wir verwenden incron auf einem SFTP Server, der einkommende Dateien sofort an die weiterverarbeitenden Stellen verschiebt. Unnötige Wartezeiten gehören der Vergangenheit an.
Eine Voraussetzung für incron ist, dass man mindestens einen 2.6.13er Linux Kernel mit inotify einsetzt (sollte bei allen aktuellen Linuxkerneln als default gesetzt sein).
Quellen
Die Sourcecodes können bei folgender Adresse herunter geladen werden: http://inotify.aiken.cz/
Hier sind auch weitere Dokus und FAQs zu dem Thema inotify zu finden.
Wer den bequemen Weg wählen möchte, hier gibt es unter anderem RPM Pakete:
http://rpmfind.net/linux/rpm2html/search.php?query=incron
Installation
Nach der Installation hat man sein System um zwei Binaries, einem Startskript, einem Configverzeichnis und einer Configdatei bereichert. In der Hauptkonfigurationsdatei /etc/incron.conf können diverse Pfade gesetzt und sogar der Zugriff auf incrontabs für Benutzer (neben system incrontabs) konfiguriert werden.
Nun nur noch das Startskript incrond starten.
service incrond start
Konfigurationsbeispiel
Um System-incrontabs einzurichten erstellt man eine entsprechende Datei in dem Verzeichnis /etc/incron.d/.
Beispiel: /etc/incron.d/watch_sftpin:
/data/sftpin IN_CLOSE_WRITE mv $@/$# /data/save
Mit dieser Konfiguration wird jede Datei, die in /data/sftpin erzeugt wird von incrond sofort nach /data/save verschoben.
Genauer: Sobald eine Datei mit dem Event IN_CLOSE_WRITE, also nach einem Schreiben geschlossen wurde wird der Befehl hinter IN_CLOSE_WRITE ausgeführt (move Datei nach save). $@ ist hier Platzhalten für das überprüfte Verzeichnis und $# beinhaltet den Namen der entsprechenden Datei.
Änderungen an den incrontab-Dateien werden sofort, ohne Serviceneustart übernommen.
Aber ACHTUNG: Leider dürfen die Argumenten in der incrontab nur mit genau EINEM Leerzeichen getrennt sein, sonst funktioniert es nicht.
Test des Beispiels:
[root@server data]# echo "test" >sftpin/hallo [root@server data]# ll sftpin/ total 0 [root@server data]# ll save/ total 4 -rw-r--r-- 1 root root 4 Jan 27 17:04 hallo [root@server data]#
Die Datei “hallo” wird sofort nach save verschoben.
Man kann auch verschiedene Fileevents reagieren:
- IN_ACCESS Datei wurde lesend geöffnet
- IN_ATTRIB Metadaten sind geändert worden (permissions, timestamps, extended attributes, etc.)
- IN_CLOSE_WRITE Datei wurde nach schreibendem Zugriff geschlossen
- IN_CLOSE_NOWRITE Datei wurde geschlossen ohne dass etwas geschrieben wurde
- IN_CREATE Datei oder Verzeichnis wurde erstellt
- IN_DELETE Datei oder Verzeichnis wurde gelöscht
- IN_DELETE_SELF Überprüftes Verzeichnis selbst wurde gelöscht
- IN_MODIFY Datei wurde geändert
- IN_MOVE_SELF Überprüftes Verzeichnis selbst wurde verschoben
- IN_MOVED_FROM Datei ist aus überprüftem Verzeichnis verschoben worden
- IN_MOVED_TO Datei ist in überprüftes Verzeichnis geschoben worden
- IN_OPEN Datei ist geöffnet worden
Folgende Variablen kann man verwenden:
$@– Der Name des überprüften Verzeichnis selbst$#– Name der betroffenen Datei$%– Das entsprechende Event (Textform)$&– Das entsprechende Event (Nummerische Form)$$– Ein Dollarzeichen
Fazit
Uns hat incrond einiges an sinnlosen Warteschleifencronjobs eingespart und die Verarbeitung an manchen Stellen sehr beschleunigt. Ich hoffe euch hilft incron auch.
DS4800 Monitoring mit Hilfe von Cacti
26. Jan
Ohne die von IBM mitgelieferten Tools ein graphisches Monitoring der Auslastung (I/Os, kb/s, cachehit) der DS4800 zu bekommen ist nicht so einfach – aber gelöst. Im folgenden das Wie? .
Teil I: Woher kommen die Daten ?
Die Daten bekommt man mit dem von IBM verfügbaren “SMcli” (Storage Manager Command Line Interface Utility). Dieses Programm kann sich mit den beiden Controllern eines Subsystems verbinden und gibt mit diversen Parametern einen “Haufen” Zahlen aus, die es im zweiten Schritt zu analysieren gilt.
Der Befehl:
/opt/IBM_DS/client/SMcli 192.168.12.100 192.168.12.101 -c "set session performanceMonitorInterval=60 performanceMonitorIterations=5; show allLogicalDrives performanceStats;"
Das Ergebnis (nach 5 Minuten):
Performing syntax check... Syntax check complete. Executing script... Performance Monitor Statistics for Storage Subsystem: DS4800_1_EG Date/Time: 1/26/10 11:29:05 AM Polling interval in seconds: 60 Storage Subsystems,Total,Read,Cache Hit,Current,Maximum,Current,Maximum ,IOs,Percentage,Percentage,KB/second,KB/second,IO/second,IO/second Capture Iteration: 1 Date/Time: 1/26/10 11:29:05 AM CONTROLLER IN SLOT A,30661.0,59.4,63.6,42082.3,42082.3,502.6,502.6, Logical Drive DLX001_VOL11_ASM7,1459.0,67.9,13.0,237.5,237.5,23.9,23.9, Logical Drive DLX001_VOL3_MD1,102.0,2.9,0.0,28.0,28.0,1.7,1.7, Logical Drive DLX001_VOL5_ASM3,2031.0,75.5,25.6,363.4,363.4,33.3,33.3, Logical Drive DLX002_VOL1_ASM1,961.0,85.7,97.0,795.8,795.8,15.8,15.8, Logical Drive DLX002_VOL5_ASM3,830.0,84.2,97.6,959.2,959.2,13.6,13.6, ...
Auf die Zahlen möchte ich an dieser Stelle nicht weiter eingehen. Das wichtige dabei zu wissen ist, dass dieses Programm alle 60 Sekunden die Zahlen erfasst, jedoch erst nach 5 Minuten (performanceMonitorIterations=5) die Zahlen ausgibt und ebenfalls konsolidiert. Danach beendet sich das Programm. Das macht die Integration in Cacti schwieriger. Cacti erwartet quasi “jetzt” Daten.
Das ganze wurde durch einen cronjob gelöst. Die SMcli Processe werden alle 5 Minuten gestartet – um eine Minute versetzt; also zu jeder 4,9,13… Minute. Dadurch hat SMcli noch genügend Zeit um die Daten auszugeben, bevor Cacti zu jeder 0,5,10… die Daten abfragt. Das Script für den cronjob sieht so aus:
#!/bin/bash
CACHE_PATH="/var/cache/cacti"
FILE_EXT=`date +%s`
# DS4800_1_eg
( /opt/IBM_DS/client/SMcli 192.168.12.100 192.168.12.101 -c "set session performanceMonitorInterval=60 performanceMonitorIterations=5; show allLogicalDrives performanceStats;" > ${CACHE_PATH}/1_eg_${FILE_EXT}; mv ${CACHE_PATH}/1_eg_${FILE_EXT} ${CACHE_PATH}/last_1_eg ) &
# DS4800_2_bu
( /opt/IBM_DS/client/SMcli 192.168.12.110 192.168.12.111 -c "set session performanceMonitorInterval=60 performanceMonitorIterations=5; show allLogicalDrives performanceStats;" > ${CACHE_PATH}/2_bu_${FILE_EXT}; mv ${CACHE_PATH}/2_bu_${FILE_EXT} ${CACHE_PATH}/last_2_bu ) &
Die IP Adressen sind dabei die Controller Adressen (ob dazu irgendwelche Rechte notwendig sind weiß ich leider nicht). Wie man sieht wird der Output zuerst in eine temporäre Datei geschrieben. Nachdem SMcli beendet ist, wird diese Datei zu last_X.. gemoved – das ganze muss man natürlich anpassen. Notwendig ist das, damit in der Theorie ein SMcli laufen kann, während ein anderes bereits für diese Datei gestartet wird.
Teil II: Das cacti Script (LUNs & Controller).
Am Ende möchten wir Graphen der Controller, als auch von den LUNs haben. Von daher gibt es für cacti zwei Scripte, welche die Daten der oben generierten Dateien auslesen. Das erste Script (ds_perfmon.pl) bekommt als Parameter den Namen einer LUN (so ist sie auch in Cacti (hostname) angelegt).
host#./ds_perfmon.pl SDS1_SILBER_DS4800_1_02 totios:1890.6 readpercent:0.26 cachehit:0 currentkb:127.9 maxkb:179.2 currentio:10.06 maxio:15.64
Nebenbei meldet das Script per logger (syslog) jeden morgen um 08:00 Uhr, wenn die gewünschte LUN nicht mehr vorhanden ist.
Download: DS Perfmon LUN Script.
Das zweite Script ist für die Auswertung der Controller zuständig.
Dabei gibt es zwei Aufrufmöglichkeiten:
- als Parameter die Controller Nummer (entsprechend der Konfiguration innerhalb des Scripts)
- als Parameter s – für “summary” (Statistik über alle Controller)
Innerhalb des Scripts werden die Controller und die zugehörigen Dateien definiert. Dabei gibt es – sofern in jeder DS zwei Controller stecken – immer einmal “CONTROLLER IN SLOT A” und “… IN SLOT B” für jede Datei. Die Variablen “all_controller” und “data_files” sind also korrespondierend und müssen jeweils über gleich viele Einträge verfügen. Am Ende werden dann die Controller durchnummeriert – entsprechend der Position im Array (all_controller/data_files; angefangen bei 1).
host# ./ds_perfmon_Controller.pl 1 readpercent:51.54 cachehit:66.2 currentkb:11804.82 currentio:542.58
host# ./ds_perfmon_Controller.pl s readpercent:2846.4 cachehit:3345.6 currentkb:45.4075049471902 currentio:35744.4
Download: DS Perfmon Controller
Teil III: Die Cacti Konfiguration.
Die cacti Konfiguration ist – für Euch – ganz einfach. Die Konfiguration kann einfach per .xml heruntergeladen werden.
DS4000 Cacti Konfig (.tgz(.xml))
Danach kann mit Hilfe der folgenden Schritte das Monitoring eingerichtet werden:
- “create new Host”
- Description/Hostname für die LUNs = Name der LUN; für den Controller = beliebig (bspw. DS 4800 Controller 1)
- “Host Template” für die LUNs = “DS4000″; für die Controller = “DS4000 Controller”
- “Downed Device Detection” -> none
- create
- “create graphs for this host” -> alle angebotenen anklicken und “create”
- (für Controller wird noch die Nummer des Controllers (s. Teil II) abgefragt)
Damit sollte dann alles erledigt sein.


