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!

Download – savepower.zip

#!/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

 

Update – Jobabhängiges Skript zur automatischen Aktivierung und Deaktivierung von Rechenknoten eines HPC Cluster
Markiert in: