Hier ein kleines Skript zur jobabhängigen Aktivierung und Deaktivierung von Rechenknoten eines HPC Clusters.
Das Skript überprüft cron-gesteuert die Warteschlangen der Clusterverwaltung (hier: PBS mittels torque) und wertet laufende Jobs und Jobs in der Warteschlange aus.
Um etwaig gerade gestartete Jobs erst verteilen zu lassen, pausiert das Skript nach der ersten Überprüfung nochmals 2 Minuten. Danach findet eine erneute Überprüfung statt, ist nun immer noch mehr als ein Job in der Warteschlange, wird die Stufe 1 initialisiert. Nun wird eine bestimmte Anzahl an neuen Knoten gestartet (via IPMI).
Stufe 1 folgen in weiteren Schritten Stufe 2, 3 und 4, in denen weitere Knoten gestartet werden. Zwischen den Stufen ruht das Skript jeweils 5 Minuten, um den neuen Knoten Zeit zu geben zu Booten und die Rechenjobs zugeteilt zu bekommen.
Findet das Skript hingegen keine laufenden Jobs und keine Jobs in der Warteschlange wird der HPC Cluster auf ein vorher festgelegtes Minimum heruntergefahren.
Nutzung natürlich auf eigene Gefahr!
Zeilen die mit einem + beginnen sind Umbrüche, leider kann das Code-Plugin diese nicht richtig darstellen!
#!/bin/bash
#
# Stromsparskript von C.Eckl
# 06.02.2012
#
#Skript zur automatischen Aktivierung weiter Knoten bei einer
+ definierten Anzahl
#an Jobs in der Warteschlange
#
#Das Skript wird jede halbe Stunde aufgerufen!
#
#Auslesen der Jobliste, speichern der Jobs mit einem Q und R
queue=$(/opt/torque/bin/qstat -a | sed -n -e '/ Q /p' | wc -l)
run=$(/opt/torque/bin/qstat -a | sed -n -e '/ R /p' | wc -l)
#Auslesen der Anzahl an deaktivierten Knoten
down=$(/opt/torque/bin/qnodes | sed -n -e '/down/p' | wc -l)
#
mehrpower=0
i=1
DATUM=`date '+%Y-%m-%d %H:%M'`
echo "########################################################"
#
if [ $queue -gt 0 ] && [ $down -gt 0 ] ; then
echo $DATUM "| Debug: Mindestens 1 Job in der Warteschlange!"
echo $DATUM "| Debug: Eventuell gerade gestartet und daher in
+ der Queue -> 2 Minuten warten!"
#2 Minuten schlafen, nochmals überprüfen
sleep 120
DATUM=`date '+%Y-%m-%d %H:%M'`
queue=$(/opt/torque/bin/qstat -a | sed -n -e '/ Q /p' | wc -l)
if [ $queue -gt 0 ] ; then
mehrpower=1
echo $DATUM "| Debug: Immer noch ein Job in der Warteschlange,
+ Aktivierung weiterer Knoten!"
fi
elif [ $queue -eq 0 ] && [ $run -eq 0 ] ; then
#Laufen alle Knoten?
if [ $down -eq 8 ] ; then
echo $DATUM "| Debug: Keine Jobs vorhanden, Minimalkonfiguration
+aktiv!"
else
#Alle Knoten bis auf 1,2 und 6 werden deaktiviert!
echo $DATUM "| Debug: Keine Jobs vorhanden, Herunterfahren
+ aller überflüssigen Knoten!"
#Aufruf von green_world, weiteres Skript zum echten Herunter-
+ fahren der Knoten, sie werden nicht nur einfach deaktiviert!
/home/staff/root/cron_skripte/green_world
/home/staff/root/cron_skripte/green_world2.sh
fi
else
if [ $down -eq 0 ] ; then
echo $DATUM "| Maximalkonfiguration aktiv, " $queue " Job(s) in + der Warteschlange!"
else
echo $DATUM "| Debug: Laufende Jobs vorhanden, aber nicht
+ mehr als ein Job in der Warteschlange!"
fi
fi
#
#Wenn mehr Power erforderlich, Starten zusätzliche Knoten
while [ $mehrpower -eq 1 ] ; do
#Überprüfen ob Minimalkonfiguration läuft bzw. welche Stufe
+ gerade läuft
if [ $down -ne 8 ] ; then
case "$down" in
[6]) i=2
;;
[4]) i=3
;;
[2]) i=4
;;
*) i=5
;;
esac
fi
echo $DATUM "| Debug: Starten der " $i ". Stufe!"
if [ $i -eq 1 ] ; then
/home/staff/root/power-on-node.sh 02
/home/staff/root/power-on-node.sh 07
elif [ $i -eq 2 ] ; then
/home/staff/root/power-on-node.sh 03
/home/staff/root/power-on-node.sh 08
elif [ $i -eq 3 ] ; then
/home/staff/root/power-on-node.sh 04
/home/staff/root/power-on-node.sh 09
elif [ $i -eq 4 ] ; then
/home/staff/root/power-on-node.sh 05
/home/staff/root/power-on-node.sh 10
fi
#Booten und Jobvergabe abwarten
sleep 300
DATUM=`date '+%Y-%m-%d %H:%M'`
#Überprüfen ob noch Jobs in der Warteschlange sind
queue=$(/opt/torque/bin/qstat -a | sed -n -e '/ Q /p' | wc -l)
down=$(/opt/torque/bin/qnodes | sed -n -e '/down/p' | wc -l)
if [ $queue -gt 0 ] && [ $down -gt 0 ] ; then
mehrpower=1
echo $DATUM "| Debug: Immer noch ein Job in der Warteschlange,
+ weitere Knoten werden aktiviert!"
elif [ $queue -gt 0 ] && [ $i -eq 4 ] ; then
mehrpower=0
echo $DATUM "| Debug: Immer noch Jobs in der Warteschlange,
+ Maximalkonfiguration aktiv!"
else
mehrpower=0
echo $DATUM "| Debug: Kein Job in der Warteschlange, keine
+ weiteren Knoten benötigt!"
fi
i=$(( $i + 1 ))
done