Studienarbeit Partitionierung von Netzwerkbeschreibungen für

Werbung
Universität Paderborn
Fachbereich Mathematik–Informatik
Studienarbeit
Partitionierung von
Netzwerkbeschreibungen für verteilte
Simulationen
Andreas Goebels
Matrikelnummer 3661581
vorgelegt bei
Prof. Dr. Hans-Ulrich Heiß
Ich versichere, dass ich die vorliegende Arbeit selbstständig und ohne
unerlaubte Hilfe Dritter angefertigt habe. Alle Stellen, die inhaltlich
oder wörtlich aus Veröffentlichungen stammen, sind kenntlich gemacht. Diese Arbeit lag in gleicher oder ähnlicher Weise noch keiner
Prüfungsbehörde vor und wurde bisher noch nicht veröffentlicht.
Andreas Goebels
Paderborn, 15. April 2002
1
Zusammenfassung
Diese Studienarbeit beschäftigt sich mit der Partitionierung von Netzwerkbeschreibungen. Durch diese Partitionierung soll ermöglicht werden, große und zeitaufwendige Berechnungen von Netzwerksimulationen auf beliebig viele verteilte Systeme
aufzuteilen. Dazu wurde ein Tool implementiert, das Beschreibungsdateien für den
Netzwerk-Simulator ns“ einliest und aus den darin enthaltenen Informationen Be”
schreibungsdateien für die parallele Version des ns, den PDNS“, generiert. In das
”
Tool wurden beispielhafte Partitionierungs- und Bewertungsheuristiken eingebunden, wobei Wert auf eine Schnittstelle für zusätzliche Algorithmen gelegt wurde.
2
Inhaltsverzeichnis
Abbildungsverzeichnis
5
1. Einleitung
6
2. PNDG - Architektur und Arbeitsweise
2.1. Einlesen der ns Beschreibungsdatei . . . . . . . . . . . .
2.2. Gewichtung des Graphen . . . . . . . . . . . . . . . . . .
2.3. Partitionierung des Graphen . . . . . . . . . . . . . . . .
2.4. Generierung der endgültigen PDNS Beschreibungsdateien
2.5. Systemvoraussetzungen . . . . . . . . . . . . . . . . . . .
2.6. Konfigurationsdatei . . . . . . . . . . . . . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
3. Bewertung und Partitionierung des Netzwerk-Graphen
3.1. Übersicht . . . . . . . . . . . . . . . . . . . . . . . . . . . .
3.2. Bewertungsalgorithmen . . . . . . . . . . . . . . . . . . . . .
3.2.1. Bewertung der Knoten durch Agentenpositionen . . .
3.2.2. Bewertung der Knoten durch Agentenpositionen und
Sende-/Empfangsdauer . . . . . . . . . . . . . . . . .
3.2.3. Bewertung der Kanten . . . . . . . . . . . . . . . . .
3.2.4. Kanten fixieren oder trennen . . . . . . . . . . . . . .
3.3. Partitionierungsalgorithmen . . . . . . . . . . . . . . . . . .
3.3.1. Partitionierung durch Aufteilungen
(partition by modulo und partition by simple) . . . .
3.3.2. Partitionierung durch fm partition (partition by fm)
3.3.3. Partitionierung durch ratio cut partition
(partition by ratio cut) . . . . . . . . . . . . . . . . .
3.3.4. Einbindung eigener Partitionierungsalgorithmen . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
8
9
12
12
12
15
16
17
. . . . . 17
. . . . . 17
. . . . . 19
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
19
20
20
21
. . . . . 21
. . . . . 22
. . . . . 23
. . . . . 23
4. Auswertung
4.1. Probleme bei der Simulation . . . . . . . . . . . . . . . . . . . . . . .
4.2. Testumgebung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4.3. Messergebnisse und Auswertung . . . . . . . . . . . . . . . . . . . . .
25
25
26
27
5. Zusammenfassung und Ausblick
30
3
Inhaltsverzeichnis
A. Unterstützte OTCL-Befehle
31
B. Konfigurationsdatei-Einträge
33
C. Implementierte Funktionen
34
Literaturverzeichnis
36
4
Abbildungsverzeichnis
1.1. Ein komplexes Netzwerk aus 800 Knoten . . . . . . . . . . . . . . . .
7
2.1. Ablaufdiagramm des PNDG . . . . . . . . . . . . . . . . . . . . . . . 8
2.2. Generierung eines Remote Links . . . . . . . . . . . . . . . . . . . . . 13
2.3. Generierung einer Remote Connection . . . . . . . . . . . . . . . . . 14
3.1. Bewertung eines Netzwerkgraphen . . . . . . . . . . . . . . . . . . . . 18
3.2. Aufgabe von neuen Partitionierungsalgorithmen . . . . . . . . . . . . 24
4.1. PassThrough-Problematik . . . . . . . . . . . . . . . . . . . . . . . . 26
4.2. Ein komplexes Netzwerk: 8 Teilnetze mit je 100 Knoten (Testnetz I) . 27
4.3. Einfache Netzwerke mit 8 Knoten (Testnetze II und III) . . . . . . . 28
5
1. Einleitung
Bei der Untersuchung von sehr großen und komplexen Netzwerken greift man auf
Simulatoren zurück, da ein Test in einem realen Netz aus Kosten- und Zeitgründen
häufig kaum zu realisieren ist. Ein gutes Hilfsmittel für solche Berechnungen ist
der Netzwerk-Simulator ns[1]. Dieser wird durch eine Beschreibungsdatei, die in der
Sprache OTCL1 geschrieben ist, gesteuert.
Diese Nutzung von TCL zeigt aber - gerade bei komplexen Netzen - schnell ihre Grenzen. Der Speicherverbrauch (und auch die Laufzeit) ist so hoch, dass ab
mehreren hundert Knoten eine Simulation häufig nicht mehr in annehmbarer Zeit
durchgeführt werden kann. Ein Beispiel für ein schlecht vom ns zu berechnendes
Netzwerk ist in Abbildung 1.1 zu sehen.
Um diese Defizite zu umgehen, wurde vom Georgia Institute of Technology eine parallele Version des ns entwickelt, der PDNS (Parallel/Distributed Network
Simulator)[2]. Dieses Programm nutzt das ebenfalls an diesem Institut entwickelte
RTIKIT, um den PDNS auf mehrere Rechner bzw. Prozessoren zu verteilen. Dabei
wurde nicht ein vollständig neues Programm entwickelt, sondern eine Art Middle”
ware“ eingeführt, welche die Befehlssyntax des Netzwerksimulators erweitert. Durch
diese zusätzliche Schicht ist eine Kommunikation zwischen den einzelnen Instanzen
auf verteilten Systemen möglich.
Zur Nutzung des PDNS muss eine Netzwerkbeschreibung für den ns in einzelne Teile
aufgespalten werden, welche jeweils mit einer PDNS-Instanz parallel berechnet werden. Bisher musste diese Aufteilung von Hand“ geschehen. Hiermit war bei sehr
”
komplexen Netzen, für die die Nutzung des PDNS erst Sinn macht, ein sehr großer
Aufwand verbunden, außerdem war es schwierig, bei solchen Netzwerken geeignete
Partitionierungen zu finden, welche alle PDNS-Instanzen gleichmäßig auslasten und
den realen Netzwerkverkehr, der zwischen den Instanzen ausgetauscht werden muss,
so gering wie möglich halten.
An dieser Stelle setzt die Studienarbeit an. Es wurde ein Tool entwickelt, das den
Partitionierungsprozess automatisiert. Jetzt ist es möglich, ein komplexes Netzwerk,
welches für den ns in OTCL beschrieben wurde, direkt aufzuteilen und somit die
gesamte Simulation parallel mit beliebig vielen Instanzen des PDNS durchzuführen.
Erste Ergebnisse haben gezeigt, dass dabei die Partitionierungsmethode einen großen
Einfluss auf die Gesamtlaufzeit der Simulation hat. Es wurden mehrere Partitionie1
objektorientierte Abwandlung von TCL
6
1. Einleitung
Abbildung 1.1.: Ein komplexes Netzwerk aus 800 Knoten
rungsverfahren eingebunden und einige Versuchsreihen durchgeführt.
In diesem Dokument wird zuerst auf das entwickelte Tool eingegangen, die Arbeitsweise und die Architektur werden aufgezeigt. Danach werden in einem separaten
Kapitel Bewertungs- und Partitionierungskonzepte erläutert und verglichen. Nach einem abschließenden Ausblick folgt im Anhang eine detaillierte Beschreibung der entwickelten Funktionen und der unterstützten Konfigurations- und OTCL-Syntaxen.
7
2. PNDG - Architektur und
Arbeitsweise
In diesem Kapitel wird die Vorgehensweise des entwickelten PNDG (PDNS Network
Description Generator) erläutert. Der Augenmerk wird auf die Architektur und die
grundlegenden Algorithmen gelegt. Die Abbildung 2.1 stellt abstrakt die einzelnen
Schritte, die durchgeführt werden müssen, dar. Die jeweiligen Positionen werden in
den folgenden Abschnitten näher erläutert.
Im Anhang C befindet sich eine Auflistung aller wichtigen entwickelten Funktionen
mit einer Kurzbeschreibung, so dass eine Weiterentwicklung oder Ergänzung der
Bewertungs- und Partitionierungsalgorithmen einfach vorgenommen werden kann,
indem bestehende Programmteile genutzt werden. In der Tabelle 2.1 werden die
wichtigsten OTCL Objekte erläutert.
Abbildung 2.1.: Ablaufdiagramm des PNDG
8
2. PNDG - Architektur und Arbeitsweise
Objekt
Agent
Traffic
Source
Erklärung
Ein Agent bildet einen Start- bzw. Endpunkt einer Netzwerkkommunikation. Mit Hilfe eines Agenten können
Pakete zu weiteren Agenten geschickt werden. Der Netzwerksimulator ns bietet verschiedene Typen von Agenten an (z.B. UDP- oder TCP), die das Übertragungsprotokoll des Pakettransportes bestimmen. Ein Agent ist
immer an einen speziellen Knoten gebunden, von dem
aus die Pakete zu den jeweiligen Zielagenten geschickt
werden.
Eine Traffic Source ist ein OTCL-Objekt, das zu definierbaren Zeitpunkten Datenpakete mit bestimmten
Attributen (Sendeintervall, Paketgröße etc.) losschicken
kann. Sie ist immer an einen Agenten gebunden und
dieser bestimmt das Ziel der einzelnen Pakete. An einen
Agenten können beliebig viele Traffic Sourcen gebunden
sein.
Tabelle 2.1.: Wichtige ns-Objekte
2.1.
Einlesen der ns Beschreibungsdatei
Das Einlesen der OTCL-Kommandos geschieht mit Hilfe eines Parsers, welcher
durch einen Parsergenerator automatisch erzeugt wurde (siehe 2.5). Kann ein Befehl interpretiert werden, werden die Daten in internen Datenstrukturen und gegebenenfalls auch in einem Netzwerkgraphen1 gespeichert. Bei einigen Ursprungsbefehlszeilen können zu diesem Zeitpunkt noch keine Angaben über die endgültige
Syntax gemacht werden, da sich Veränderungen aufgrund der späteren Partitionierung ergeben können. Diese können also nicht direkt in die endgültigen PDNSBeschreibungsdateien übernommen werden, sondern es müssen die zusätzlichen Befehle des PDNS genutzt werden, um z.B. Netzwerkverbindungen der Simulation auf
reale Verbindungen abzubilden (Remote Links).
Es können grundsätzlich zwei Arten von Befehlen unterschieden werden:
1. Globale Befehle
Globale Befehle können in jeder PDNS-Beschreibungsdatei vorhanden sein und
werden aus der Ursprungsdatei für den ns ohne Modifikationen übernommen.
Ein Überblick über diese Kommandos gibt Tabelle 2.2.
1
Eine Datenstruktur, in der das gesamte Netzwerk als Graph gespeichert ist
9
2. PNDG - Architektur und Arbeitsweise
Globale Befehl
Erzeugung eines
neuen Simulators
Starten/Beenden der
Simulation,
Tracing-Kommandos,
Kommentare
Reaktion des PNDG
Beim Auftreten einer solchen Zeile wird ein neuer Netzwerkgraph initialisiert
Diese Zeilen werden ohne Veränderungen in die späteren
Beschreibungsdateien übernommen2
Tabelle 2.2.: Globale Befehle
2. Spezielle Befehle
Die Befehle in Tabelle 2.3 sind noch einzeln zu überprüfen, da sie entweder
nicht in alle PDNS-Dateien hineingehören oder noch verändert werden müssen,
weil sie von einer Partitionierung betroffen sind. Zum Beispiel enthält die
Beschreibungsdatei für eine einzelne PDNS-Instanz nur genau die Knoten und
Agenten, die auch auf ihr berechnet werden.
2
Die Übernahme von Kommentaren kann durch die Konfigurationsdatei gesteuert werden
10
2. PNDG - Architektur und Arbeitsweise
Spezielle Befehle
Generierung eines
Knotens
Generierung eines
Links
Starten/Stoppen
einer Traffic
Source
Generierung eines
Agenten
Agenten an einen
Knoten binden
Verbinden von
zwei Agenten
Generierung einer
Traffic Source
Traffic an einen
Agenten binden
Reaktion des PNDG
Im Netzwerkgraphen wird ein neuer Knoten angelegt.
Gleichzeitig wird dieser Knoten in einer internen Datenstruktur gespeichert.
Im Netzwerkgraphen wird eine neue gerichtete Kante
angelegt. Wenn der Link als Duplex-Link spezifiziert
ist, wird auch eine Kante in die entgegengesetzte Richtung eingerichtet3 . Da ns keinen eindeutigen Namen
für einen Link fordert, wird vom Programm ein Name
generiert. Dieser ist von der Form startNode endNode,
ein Link von node12 zu node37 bekommt also den Namen node12node37, unter dem er auch in einer Datenstruktur gespeichert wird, zusätzlich mit den Informationen über Bandbreite und Delay. Unter diesem Namen
kann der Link auch angesprochen werden, wenn er durch
die Konfigurationsdatei gesteuert getrennt werden soll
(CUT/UNCUT-Wert) (siehe 3.2.4).
Die Start- bzw. Endzeit der entsprechenden Traffic Source wird in einer Datenstruktur, in der diese verwaltet
werden, gespeichert. Mit Hilfe dieser Daten kann die
Sendedauer und die übertragene Datenmenge berechnet
werden.
Wird in der ursprünglichen Datei ein Agent generiert,
wird dieser in einer Agenten-Datenstruktur gespeichert.
Der Name des Agenten wird in der KnotenDatenstruktur eingetragen und die Daten, die ggf.
später in weiteren Befehlszeilen hinzukommen und
den Agenten parametrisieren, werden in der AgentenDatenstruktur gespeichert.
Bei diesem Befehl wird in der Agenten-Datenstruktur
für beide Agenten ein Verweis auf den jeweiligen Kommunikationspartner eingetragen.
Die Traffic-Source wird in einer Traffic-Datenstruktur
gespeichert.
In die Traffic-Datenstruktur wird ein Verweis auf den
Agenten aufgenommen, und bei dem betreffenden Agenten die Traffic-Source an eine Liste angehängt.
Tabelle 2.3.: Spezielle Befehle
3
Der Netzwerkgraph ist gerichtet
11
2. PNDG - Architektur und Arbeitsweise
2.2.
Gewichtung des Graphen
Die Gewichtung des eingelesenen Netzwerkgraphen bildet die Grundlage für die
spätere Partitionierung. Es können sowohl die Kanten als auch die Knoten gewichtet werden. Auf einem Graphen können vor der Partitionierung beliebig viele Gewichtungen durchgeführt werden. Es sind also Vorgehensweisen denkbar, die erst
alle Knoten gewichten, danach - in einem zweiten Algorithmus - die Kanten und als
letztes spezielle Bewertungen für neu implementierte Funktionalitäten (Paketfilter,
Firewall etc.) erzeugen. (siehe 3.2).
2.3.
Partitionierung des Graphen
Mit Hilfe der Partitionierungsalgorithmen wird der gewichtete Netzwerkgraph in die
benötigte Menge von PDNS-Instanzen zerlegt. Dabei kann die Partitionierung die
Gewichtung des Graphen berücksichtigen, dieses muss aber nicht zwingend erfolgen
(siehe 3.3).
2.4.
Generierung der endgültigen PDNS
Beschreibungsdateien
Nachdem der Graph partitioniert wurde, kann jeder Knoten in eine spezielle PDNSDatei eingeordnet werden. Dadurch ergeben sich auch automatisch die Menge der
Links, welche zwischen zwei PDNS-Instanzen gezogen werden müssen (rLinks) und
die Menge der Verbindungen von Agenten, deren Start- und Endpunkte in unterschiedlichen Instanzen liegen (rConnections).
Der nächste Schritt beinhaltet nun folgende Aufgaben:
• Globale Befehle in alle Dateien übernehmen
Hierzu gehören z.B. Initialisierungsbefehle für den Simulator, die ohne Modifikationen aus der Ursprungsdatei in jede PDNS-Beschreibungsdatei übernommen werden können (siehe auch Tabelle 2.2).
• lokale Links / lokale Knoten verteilen
Links, die nur zwischen Knoten aus einer einzelnen PDNS-Datei gezogen werden, können ebenfalls problemlos aus der ursprünglichen Datei übernommen
werden. Dieses ist möglich, da die Knoten jeweils in die durch den Partitionierungsalgorithmus bestimmte Datei übernommen werden, ohne dass ihre
Namen geändert werden.
• rLinks generieren
Remote Links treten genau dann auf, wenn ein ursprünglicher Link zwischen
12
2. PNDG - Architektur und Arbeitsweise
zwei Knoten verläuft, die durch die Partitionierung in unterschiedliche PDNSDateien platziert wurden. Ein rLink4 wird in diesem Fall als ein Link von
einem lokalen Knoten zu einer IP-Adresse5 definiert. Diese IP-Adresse hat auf
der Startseite des Links die Form n.n.n.1, auf der Zielseite n.n.n.2.
Wegen der Übersichtlichkeit wurde für die erste Position der IP-Adresse eine
Zahl festgelegt (diese kann in der Konfigurationsdatei eingestellt werden). Die
beiden mittleren Positionen werden durch fortlaufendes Zählen aller rLinks
generiert, der erste rLink erhält also z.B. die Nummer 10.0.1.16 , der zweite
10.0.2.1, der 257te die Nummer 10.1.1.1 usw. Die maximale Anzahl von rLinks
wird durch den PDNS begrenzt, der durch diese Zählweise zur Verfügung Zahlenraum (2562 IP-Adressen) reicht vollkommen aus. Auf der Gegenseite wird
gleichzeitig ein rLink generiert, welcher mit der entsprechenden IP-Adresse
(10.0.1.2, 10.0.2.2 bzw. 10.1.1.2) versehen wird. Die Attribute dieses Links
(Bandweite, Delay) werden vom Ursprungslink übernommen.
Abbildung 2.2.: Generierung eines Remote Links
• Traffic Sources und Agenten verteilen
Traffic Sources und Agenten müssen nicht gesondert behandelt werden, sie sind
immer an einen bestimmten Agenten bzw. Knoten gebunden und befinden sich
daher mit ihren Ursprungsbefehlen in genau einer einzelnen Datei, die durch
den betreffenden Knoten bestimmt wird.
• Agenten verbinden
Das Verbinden von zwei Agenten geschieht auf ähnliche Art und Weise wie
die Generierung eines Remote Links. Auch hier gibt es einmal den trivialen
Fall, dass sich Quelle und Senke jeweils in der selben PDNS-Datei befinden.
In diesem Fall ist keine Veränderung notwendig, die ursprünglichen Befehle
können einfach übernommen werden.
Der kompliziertere Fall tritt dann auf, wenn sich der Knoten, auf dem sich der
sendende Agent befindet, in einer anderen Datei - und damit in einer anderen
4
Remote Link
nur lokal für die PDNS-Simulation gültige IP
6
Die 10 entsteht durch eine Konfigurationsdateidefinition
5
13
2. PNDG - Architektur und Arbeitsweise
PDNS-Instanz - befindet, als der Knoten, auf dem sich die Senke befindet. In
diesem Fall sind mehrere Schritte notwendig:
1. Der sendende Agent bekommt die Port-Nummer 0, d.h. er horcht auf dem
Port, den der Empfänger zur Verfügung stellt. Der Zielagent bekommt
eine fortlaufende Portnummer zugewiesen7 .
2. Der Knoten, auf dem sich der Agent befindet, benötigt eine eindeutige IPAdresse. Diese wird aber nicht an den Knoten selbst gebunden, sondern
an den herausgehenden Link, auf dem der Agent sendet bzw. empfängt.
Diese IP-Adresse wird nach einem ähnlichen Prinzip gebildet wie beim
rLink. Die erste Position wird durch einen in der Konfigurationsdatei anzugebenden spezifischen Wert festgesetzt. An der zweiten Stelle befindet
sich ein Wert, der die Nummer der PDNS-Datei repräsentiert, in der dieser Agent angesiedelt ist. Die dritte und die vierte Stelle werden durch
eine fortlaufende Nummer berechnet und gebildet (siehe Abbildung 2.3).
Abbildung 2.3.: Generierung einer Remote Connection
3. Im nächsten Schritt werde Routinginformationen für die Knoten erzeugt,
auf denen sich sendende bzw. empfangende Agenten befinden. Diese Informationen legen fest, über welchen Remote Link und damit, über welchen
Knoten die Pakete aus der PDNS-Datei herausgeschickt werden sollen,
um den Zielknoten zu erreichen, d.h. welcher Knoten als Router fungieren
soll.
Vom PNDG wird dazu der Knoten ausgewählt, der im Originalgraphen
auf dem kürzesten Weg vom Start- zum Zielknoten als letzter in der
PDNS-Datei vorhanden ist.
4. Als abschließender Schritt folgt noch das Verbinden der Agenten. Dieses
ist ein rConnect8 eines Agenten mit einer IP-Adresse. Diese Adresse ist
7
8
Der Startwert der Portnummern kann in der Konfigurationsdatei festgelegt werden
Remote Connect
14
2. PNDG - Architektur und Arbeitsweise
genau der Wert, der für den Zielagenten festgesetzt wurde. Somit wird
der connect Befehl aus der ns-Syntax vollständig auf die PDNS-Syntax
abgebildet.
2.5.
Systemvoraussetzungen
Das im Verlauf dieser Studienarbeit entwickelte Tool wurde vollständig in C++
geschrieben und sollte auf Linux-Systemen benutzt werden. Bei umfassenden Beschreibungsdateien benötigt es zur Laufzeit viel (> 400 MB) Speicher und einen
großen Stack9 , es sollte daher auf ausreichend performanten Systemen eingesetzt
werden. Die folgenden Bibliotheken und Programme werden benötigt:
• Die Graph Template Library (GTL)
Im Tool PNDG werden die Informationen aus der ursprünglichen Netzwerkbeschreibungsdatei als Netzwerkgraph dargestellt. Zur Repräsentation dieser
Datenstruktur wurde die Graph Template Library (GTL) der Uni Passau eingesetzt. Diese bietet bereits einige implementierte Partitionierungsalgorithmen. Gleichzeitig wurden jedoch alle Funktionen, die auf diese Datenstruktur
zugreifen, so weit wie möglich unabhängig von der GTL entwickelt, wodurch
ein Wechsel der Graph Library einfach zu vollziehen ist. Die Erweiterbarkeit
um neue Partitionierungs- und Bewertungsalgorithmen stand im Vordergrund,
eine Spezialisierung auf eine einzelne Library oder Library-spezifische Befehle
wurde daher vermieden.
Die GTL kann unter [3] angefordert werden. Für akademische Zwecke ist sie
kostenlos einsetzbar.
• Scanner- und Parsergeneratoren (flex / bison)
Der Scannergenerator flex [4] generiert ein Modul, das zum Einlesen der nsBeschreibungsdatei benötigt wird. Er reagiert auf Schlüsselwörter und liefert
die identifizierten Token an den Parsergenerator weiter. Die Interpretation der
ursprünglichen Beschreibungsdatei geschieht dann durch ein Modul, das durch
den Parsergenerator bison[5] generiert wurde. In der momentanen Version werden nicht alle Elemente der Beschreibungsdateisprache OTCL unterstützt, es
wurden nur einige grundlegende implementiert (siehe Anhang A).
In dem vom Parsergenerator generierten Modul werden die vom Scanner gelieferten Token Sprach- bzw. Befehlselementen zugeordnet.
Durch den Einsatz von Scanner- und Parsergeneratoren ist eine schnelle und
einfache Erweiterung auf zusätzliche OTCL-Sprachelemente möglich. Ein neuer OTCL-Befehl kann somit einfach in die Grammatik eingefügt werden, ohne
dass spezielle String-Operationen durchgeführt werden müssen. Im Verlauf der
Studienarbeit sind auf diese Weise diverse Befehle problemlos zusätzlich hinzugefügt worden.
9
Die Stackgröße von Linux sollte auf unlimited gesetzt werden
15
2. PNDG - Architektur und Arbeitsweise
2.6.
Konfigurationsdatei
Zur Steuerung des Tools dient eine Konfigurationsdatei. In dieser befinden sich Anweisungen, die das Vorgehen des PNDG festlegen, z.B. die Anzahl der zu generierenden PDNS-Beschreibungsdateien oder die intern genutzten IP-Adressen und
Portnummern. Des weiteren können hiermit auch die Bewertungen des Netzwerks
und die Partitionierung gesteuert und parametrisiert werden. Nähere Informationen
zum Aufbau einer Konfigurationsdatei sind im Anhang B zu finden.
16
3. Bewertung und Partitionierung des
Netzwerk-Graphen
3.1.
Übersicht
Eine Graph-Datenstruktur verwaltet das Netzwerk, welches durch das Tool intern
erzeugt worden ist. Um daraus die einzelnen Beschreibungsdateien für den PDNS
zu erzeugen, wird dieser Graph partitioniert. Jeder Teilgraph entspricht dabei einer
Beschreibungsdatei für eine Instanz des PDNS.
Bei dieser Partitionierung müssen zwei Dinge berücksichtigt werden:
1. Gleichmäßige Belastung der PDNS-Instanzen
Die einzelnen PDNS-Instanzen sollten - wenn möglich - gleichmäßig belastet
werden. Das heißt nicht nur, dass die Knoten einheitlich verteilt werden, sondern vor allem, dass der Verkehr zwischen einzelnen Knoten geschickt auf die
Instanzen verteilt wird.
2. Minimierung des realen Netzwerkverkehrs zwischen den PDNS-Instanzen
Da bei Nutzung des PDNS zwischen den einzelnen Instanzen Informationen
ausgetauscht werden müssen, belasten diese den realen Netzwerkverkehr und
dadurch unter Umständen die Gesamteffizienz der Simulation. Eine Partitionierung muss diese Tatsache berücksichtigen, indem Links hauptsächlich dann
durchtrennt werden, wenn über sie kein oder sehr wenig Verkehr fließt.
Ein großes Problem für diese intelligente“ Partitionierung ist, dass der wirkliche
”
Verkehr nicht bekannt ist, ohne dass die vollständige Simulation durchgeführt wurde. Daher muss der Verkehr durch Heuristiken abgeschätzt werden.
Im Folgenden werden die beispielhaft implementierten Partitionierungs- und Bewertungsalgorithmen vorgestellt.
3.2.
Bewertungsalgorithmen
Einige Partitionierungsalgorithmen berücksichtigen bei der Partitionierung des
Netzwerkgraphen das Gewicht der einzelnen Knoten, der einzelnen Kanten oder
beides. Mit Hilfe von Bewertungsalgorithmen wird eine solche Bewertung durchgeführt.
17
3. Bewertung und Partitionierung des Netzwerk-Graphen
Es können für einen Netzwerkgraphen mehrere Bewertungsalgorithmen nacheinander angewandt werden, z.B. kann der erste Algorithmus nur die Knoten gewichten,
der zweite dagegen nur die Kanten. Durch dieses modulare Vorgehen ist es sehr
einfach, neue Bewertungsheuristiken zu entwickeln und zu testen und damit ggf.
spezielle Netzwerke bzw. Netzwerkverkehrssituationen besser anzunähern als es die
bereits implementierten Funktionen es können.
Eine weitere Möglichkeit, dieses Konzept auszunutzen, bietet sich bei sehr rechenaufwendigen Konstrukten, z.B. einem speziellen Paketfilter oder einer Firewall. Diese können durch einen zusätzlichen Bewertungsalgorithmus ausgewählte Knotengewichte separat erhöhen. Durch unterschiedliche Kombination mehrerer Bewertungen
kann dann die für den jeweiligen Partitionierungsalgorithmus geeignetste Gesamtbewertung erzeugt werden.
Generell sollten bei der Bewertung die Knoten stärker belastet werden, die als Datenquelle bzw. -senke fungieren, da hier ein erhöhter Aufwand auf den Simulator
zukommt.
Ähnlich verhält es sich bei der Berechnung der Kantengewichte. Hier sollte eine
Abbildung 3.1.: Bewertung eines Netzwerkgraphen
stärkere Gewichtung genau der Kanten erfolgen, die durch Netzwerkverkehr, der
darüber fließt, stärker belastet werden als Kanten, die in der Simulation nicht genutzt werden. Dadurch wird der reale Netzwerkverkehr, der über den Partitionierungsschnitt geschickt wird, so gering wie möglich gehalten, wenn diese Bewertung
von den Partitionierungsalgorithmen korrekt weiterverarbeitet wird.
In der Abbildung 3.1 ist ein Ausschnitt aus einem bewerteten Graphen zu sehen.
Hier wurden sowohl die Knoten als auch die Kanten auf dem Weg von der source zum
18
3. Bewertung und Partitionierung des Netzwerk-Graphen
target unterschiedlich bewertet. Als Datenquelle für eine differenzierte Bewertung
können die zu jedem Agenten gespeicherten Werte (z.B. Sendedauer oder Paketgröße) und Werte aus der Konfigurationsdatei hinzugezogen werden.
3.2.1.
Bewertung der Knoten durch Agentenpositionen
Durch diesen Algorithmus werden alle Agenten betrachtet und das Gewicht eines
Knotens für jeden Agenten, der darauf lokalisiert ist, erhöht. Es kann dabei unterschieden werden, ob der Agent als Quelle oder als Senke fungiert. Beiden Agentenarten kann ein eigenes Gewicht zugeordnet werden, da diese gegebenenfalls unterschiedlichen Simulationsaufwand nach sich ziehen1 . Diese Zuordnung geschieht
durch die folgenden Konfigurationsdatei-Einträge:
• set assess_by_agent_position enable
• set assess_by_agent_position_source_agent_weight [INTEGER]
• set assess_by_agent_position_target_agent_weight [INTEGER]
Durch diese Bewertung und im Zusammenspiel mit den geeigneten Partitionierungsalgorithmen (siehe auch 3.3.2 und 3.3.3) kann das Gewicht der Knoten gleichmäßig
auf alle PDNS-Instanzen verteilt werden. Die einzelnen Systeme haben annähernd
gleichgroße Mengen an Knoten zu verwalten.
3.2.2. Bewertung der Knoten durch Agentenpositionen und
Sende-/Empfangsdauer
Hier wird ähnlich wie unter 3.2.1 das Gewicht der Knoten durch die darauf platzierten Agenten berechnet. Die Bewertung erfolgt aber jetzt nicht mehr nur alleine
aufgrund der Tatsache, dass ein Agent vorhanden ist, sondern es wird zusätzlich
die Dauer der Übertragung berücksichtigt. Dadurch bekommt ein Knoten, der über
einen sehr langen Zeitraum Pakete schickt, ein höheres Gewicht als ein Knoten, welcher nur für eine sehr kurze Zeit sendet.
Das Gewicht, mit dem ein betroffener Knoten belastet wird, berechnet sich nach der
folgenden Formel:
agentenGewicht * (trafficEndZeit - trafficStartZeit)
Gleichzeitig gibt es die Möglichkeit, alle Knoten zu gewichten, über die der Netzwerkverkehr fließt, und nicht nur die Start- und Endknoten. Um dieses zu nutzen,
muss der Wert für die intermediate nodes > 0 gesetzt werden. Insgesamt ergeben
sich für diese Gewichtung folgende Parameter, die in der Konfigurationsdatei gesetzt
werden müssen:
• set assess_by_agent_position_time enable
1
abhängig vom Agententyp (UDP / TCP / Multicast)
19
3. Bewertung und Partitionierung des Netzwerk-Graphen
• set assess_by_agent_position_time_source_agent_weight [INTEGER]
• set assess_by_agent_position_time_target_agent_weight [INTEGER]
• set assess_by_agent_position_time_intermediate_agent_weight [INTEGER]
3.2.3.
Bewertung der Kanten
Mit diesem Algorithmus werden alle Kanten, die von Netzwerkverkehr betroffen sind,
mit Gewichten versehen. Dazu werden alle Sender/Empfänger-Paare betrachtet und
der kürzeste Weg im Graphen vom Sender zum Empfänger bestimmt. Da ns und
damit auch PDNS den Weg auf die selbe Art bestimmen, ist gewährleistet, dass die
hier bewerteten Kanten auf die Kanten abgebildet werden können, über die in der
Simulation Pakete geschickt werden. Alle Kanten, die auf diesem Weg liegen, werden
gewichtet mit dem Wert:
(trafficEndZeit-trafficStartZeit) * Paketgröße * Sendeintervall
In der Konfigurationsdatei aktiviert der Eintrag
set assess_by_agent_traffic enable
diese Bewertung.
3.2.4.
Kanten fixieren oder trennen
Wenn die zu simulierende Netzwerktopologie bekannt ist und manuell in die Partitionierung eingegriffen werden soll, kann es sinnvoll sein, einzelne Kanten festzulegen,
welche - wenn möglich - getrennt werden sollen, oder aber festzulegen, dass eine
Kante - wenn möglich - nicht getrennt werden soll. Um diese Wünsche berücksichtigen zu können, gibt es in der Konfigurationsdatei die Möglichkeit, für jede Kante
separat festzulegen, ob diese getrennt werden soll (CUT), oder ob sie untrennbar“
”
ist (UNCUT).
Diese Festlegungen sind allerdings nicht hundertprozentig bindend. Der Partitionierungsalgorithmus muss ebenfalls passend entwickelt worden sein, da ein CUT-Link
einfach ein Link ist, dessen Gewicht - unabhängig vom darüberfließenden Verkehr immer den Wert besitzt, der für solche CUT-Links festgesetzt wurde; ebenso wird
mit UNCUT-Links verfahren.
In der aktuellen Implementierung berücksichtigen die Partitionierungsalgorithmen
(ratio cut und fm) das Gewicht des Schnittes, was bedeutet, dass ein mit einem sehr
großen Wert belegter Link wahrscheinlich nicht durchtrennt wird, ein mit einem sehr
kleinen Wert belegter dagegen sehr schnell. Die folgenden Konfigurationseinträge
haben in Verbindung mit den vorhandenen Partitionierungsalgorithmen recht gute
Ergebnisse erzielt, um CUT- und UNCUT-Links zu realisieren:
• set cut_value 0
20
3. Bewertung und Partitionierung des Netzwerk-Graphen
• set uncut_value 999999
Um festzulegen, dass eine Kante zwischen zwei Knoten n1 und n2 getrennt bzw.
nicht getrennt werden soll, kann ebenfalls in der Konfigurationsdatei ein Eintrag
vorgenommen werden:
• set n1n2 CUT
oder
• set n1n2 UNCUT
Diese Knotenfixierung ist im Endeffekt wieder ein Bewertungsalgorithmus, der aber
jetzt durch Konfigurationseinträge gesteuert wird. Das Besondere an diesem Algorithmus ist, dass dieser immer als letzter aller Bewertungsalgorithmen ausgeführt
werden muss, ansonsten könnten die CUT- bzw. UNCUT-Werte von einer später
ausgeführten Bewertung noch verändert werden. Dies muss auch bei der Einführung
neuer Bewertungsalgorithmen beachtet werden.
3.3.
Partitionierungsalgorithmen
Die Partitionierung eines Graphen gestaltet sich als besonders schwierig, wenn
zusätzlich zu unterschiedlichen Knotengewichten noch Kantengewichte und das Gewicht des Schnittes berücksichtigt werden soll. Der Schwerpunkt dieser Studienarbeit lag nicht in der Entwicklung von Partitionierungsalgorithmen, sondern in der
Entwicklung eines Werkzeuges, in welches einfach unterschiedliche Partitionierungsalgorithmen eingeführt werden können. Aus diesem Grund sind die Ergebnisse, die
diese Algorithmen liefern, nicht unbedingt optimal. Sie können bei Bedarf jederzeit
ausgetauscht werden.
In der aktuellen Version des PNDG sind zwei Arten von Algorithmen eingebunden.
Einmal wurden sehr einfache Aufteilungen neu implementiert (modulo und simple),
welche hauptsächlich zu Testzwecken und Vergleichen herangezogen worden sind.
Des weiteren wurden zwei Algorithmen (fm und ratio cut) aus der GTL soweit modifiziert, dass sie für den PNDG geeignete Ergebnisse liefern. Die Eigenschaften der
einzelnen Algorithmen werden in den folgenden Abschnitten genauer beschrieben.
3.3.1. Partitionierung durch Aufteilungen
(partition by modulo und partition by simple)
Diese Partitionierungs-Algorithmen sind sehr einfach und dienen hauptsächlich als
Vergleich für die Güte anderer, intelligentere“ Partitionierungsalgorithmen. Die
”
Partitionierung geschieht hier nicht im Hinblick auf die Güte der resultierenden
Partitionen bzw. Schnitte, sondern nur in Hinblick auf Nachvollziehbarkeit und Beeinflussbarkeit. Dadurch ist es möglich, von vorneherein auch bei sehr großen Netzwerken festzulegen, welche Knoten auf welchen Instanzen berechnet und wo Schnitte gesetzt werden. Dieses Verfahren bietet sich bei bekannten Netzwerktopologien
21
3. Bewertung und Partitionierung des Netzwerk-Graphen
an. Die Wahl, welche dieser beiden Partitionierungen angewandt werden soll, ist
abhängig von den Informationen, die über die Ursprungsdatei bekannt sind.
Die Anzahl der gewünschten PDNS-Beschreibungsdateien wird aus der Konfigurationsdatei an den Algorithmus übergeben. Im nächsten Schritt werden die Knoten
in der Reihenfolge ihres Auftretens in der Originaldatei betrachtet und jeweils der
entsprechenden PDNS-Datei zugewiesen. Im Modulo-Fall sieht das folgendermaßen
aus:
for (i=0; i < nodeCount; i++)
schreibe node[i] in Datei (node[i] % numberOfPDNSFiles)
Der partition by simple Algorithmus arbeitet sehr ähnlich, nur dass hier z.B. bei 500
Knoten und 5 Instanzen die ersten 100 Knoten in die erste PDNS-Instanz platziert
werden, die nächsten 100 in die zweite usw. Bei diesen Partitionierungsmethoden
wird jeglicher simulierter Netzwerkverkehr unberücksichtigt gelassen. Allerdings ist
gewährleistet, dass jede PDNS-Instanz annähernd die gleiche Anzahl an Knoten
zu bearbeiten hat. Außerdem besteht nicht die Einschränkung, dass nur PDNSInstanzen der Anzahl 2n (siehe 3.3.2 und 3.3.3) berechnet werden können.
3.3.2.
Partitionierung durch fm partition (partition by fm)
fm partition ist eine Heuristik für die bi-Partitionierung eines Graphen. Sie wurde
1982 von Fiduccia und Mattheyses entwickelt. Bei der fm partition-Heuristik wird
von einer initialen Partitionierung des Graphen ausgegangen und versucht, durch
Knotenaustausch zwischen den Partitionen zwei gleichmäßig gewichtete Partitionen
zu erhalten[6]. Näheres zur genauen Vorgehensweise dieser Partitionierung ist unter
[7] zu finden.
Diese Partitionierung funktioniert nur für eine Anzahl von PDNS-Instanzen aus 2n .
Durch den Algorithmus wird erst der gesamte Graph halbiert und dann iterativ
die daraus resultierenden Teilgraphen, bis die gewünschte Anzahl an Teilgraphen
entstanden ist. Bei der Partitionierung werden sowohl die Kantengewichte als auch
die Knotengewichte des Graphen berücksichtigt. Die Laufzeit dieses Algorithmus ist
O(|E|) (Mit E = Anzahl der Kanten im Graphen).
Da dieser Partitionierungsalgorithmus sowohl die Knoten- als auch die Kantengewichte möglichst gleichmäßig auf die einzelnen Teilgraphen verteilt, können alle Knoten und Kanten mit initialen Werten belegt werden2 . Hierdurch wird vermieden, dass
eine PDNS-Instanz einen Großteil der Knoten verarbeiten muss, wenn diese keine
Agenten beinhalten und auch nicht vom Netzwerkverkehr betroffen sind. Es kann
also auch der Verwaltungsaufwand für diese unbenutzten Knoten minimiert werden.
Um diesen Algorithmus nutzen zu können, sind folgende Konfigurationseinträge notwendig:
• set partition_by_fm enable
2
Diese initiale Bewertung kann auch durch Bewertungsalgorithmen geschehen
22
3. Bewertung und Partitionierung des Netzwerk-Graphen
• set partition_by_fm_initial_node_weight [INTEGER]
• set partition_by_fm_initial_link_weight [INTEGER]
3.3.3. Partitionierung durch ratio cut partition
(partition by ratio cut)
Auch bei dieser Partitionierung werden sowohl die Kantengewichte als auch die
Knotengewichte des Graphen berücksichtigt. Die Laufzeit ist O(|E|) (Mit E =
Anzahl der Kanten). Es gelten dieselben Eigenschaften und Einschränkungen wie
bei fm partition, allerdings hat diese Partitionierungsmethode bei einigen Tests geringfügig bessere Ergebnisse geliefert. Diese Konfigurationseinträge parametrisieren
den Algorithmus:
• set partition_by_ratio_cut enable
• set partition_by_ratio_cut_initial_node_weight [INTEGER]
• set partition_by_ratio_cut_initial_link_weight [INTEGER]
Weiterführende Informationen können unter [8] nachgelesen werden.
3.3.4.
Einbindung eigener Partitionierungsalgorithmen
PNDG wurde so entwickelt, dass andere bzw. zusätzliche Partitionierungsalgorithmen ohne Probleme eingebunden werden können. Dieses erfolgt in zwei Schritten
(siehe auch Abbildung 3.2):
1. Konvertierung des Netzwerkgraphen und der Kantengewichte in eine Datenstruktur, die der neue Partitionierungsalgorithmus verarbeiten kann. Wird
dieser neu implementiert, können die in der GTL vorhandenen Funktionen
benutzt werden, um auf diese Graph-Datenstruktur zuzugreifen.
2. Zurückliefern eines nodeTargetStruct, einer einfachen Hashtable (map), welche
dem Knoten (mit dem Namen, den er in der originalen TCL-Datei besitzt als
Key) einen Integer-Wert zuweist. Dieser Wert ist die Nummer der Datei, in
der dieser Knoten eingeordnet werden soll.
23
3. Bewertung und Partitionierung des Netzwerk-Graphen
Abbildung 3.2.: Aufgabe von neuen Partitionierungsalgorithmen
Es sind ebenfalls einfache Funktionen vorhanden, um auf die Werte aus der
Konfigurationsdatei zugreifen zu können. Näheres dazu ist im Anhang und in den
beispielhaften Implementierungen von Partitionierungsalgorithmen im Quellcode zu
finden.
24
4. Auswertung
4.1.
Probleme bei der Simulation
Bei der Entwicklung des PNDG und der damit verbundenen Nutzung der vom PDNS
zur Verfügung gestellten Befehle traten während der Testphase mehrere Probleme
auf. Aus diesem Grund war es nicht möglich, alle gewünschten Versuchsreihen zu
simulieren.
Die wichtigsten Einschränkungen, die einer erfolgreichen Simulation im Wege standen, lassen sich in folgenden Punkten zusammenfassen:
1. PDNS macht einige Einschränkungen aufgrund fehlerhafter und unvollständiger Implementierung:
a) Ein sendender Agent darf nicht an der Außenseite“ einer PDNS-Instanz
”
liegen. Wenn die einzige Möglichkeit zu senden direkt über einen rLink
führt, kann keine Verbindung zum Zielagenten hergestellt werden, da diesem rLink keine gültige IP-Adresse zugewiesen werden kann. PNDG versucht, durch Wahl eines Ausweichweges diese Problematik zu umgehen,
dieses funktioniert allerdings nicht bei beliebigen Netzen, außerdem wird
hierbei ein anderer Weg für den Netzwerkverkehr gewählt, als in der originalen Datei gewählt worden wäre. Es wird demzufolge keine hundertprozentig identische Simulation mehr durch den PDNS durchgeführt, er
liefert gegebenenfalls andere Ergebnisse als der ns.
b) Pakete, deren Ziel-IP-Adresse nicht in der simulierten PDNS-Instanz
liegt, können nicht weitergeleitet werden. Daher ist kein Routing über
mehrere Instanzen möglich. Die mittlere PDNS-Instanz in Abbildung
4.1 kann zum Beispiel Pakete, die aus der Source-Instanz an die TargetInstanz geschickt werden, nicht korrekt weiterleiten. An diesem Problem
arbeitet der Entwickler des PDNS. Soweit dieses passthrough-Routing in
der Dokumentation beschrieben ist, ist es bereits in der aktuellen Version
des PNDG implementiert, bei einer Behebung des Fehlers im PDNS sollte
es also direkt unterstützt werden.
2. Die Netzwerkbeschreibungsdatei darf nicht beliebige Befehle enthalten, es ist
nur der im Anhang aufgeführte Befehlssatz gültig.
Da zusätzliche Sprachelemente jedoch sehr schnell und ohne aufwändige
25
4. Auswertung
Abbildung 4.1.: PassThrough-Problematik
Veränderungen hinzugefügt werden können, kann der Sprachumfang sukzessive ausgebaut werden, bis ein kompletter OTCL-Parser vorhanden ist.
Zusätzlich zu den beschriebenen Problemen traten bei den Simulationen unterschiedliche weitere Fehler im PDNS auf, die teilweise auch auf die benutzte Hardwareumgebung zurückzuführen sind.
4.2.
Testumgebung
Um den PDNS mit dem ns zu vergleichen, aber auch, um die unterschiedlichen Partitionierungsalgorithmen zu untersuchen, wurde ein komplexes Netzwerk erzeugt.
Dieses muss aufgrund mehrerer Fehler im PDNS (siehe 4.1) einige Voraussetzungen
erfüllen. Das in Abbildung 4.2 visualisierte Netzwerk erfüllt diese Voraussetzungen.
Es besitzt 800 Knoten, 1600 Links und 256 Agenten (siehe Abbildung 4.2). Die
Agenten sind gleichmäßig auf alle 8 Teilgraphen verteilt, 30 Agenten senden dabei jeweils zum benachbarten Graphen, 2 zu einem Knoten innerhalb des Graphen.
Die Knoten sind in der Beschreibungsdatei so angeordnet, dass sie durch die simple partition Methode einheitlich in bis zu 8 Teilgraphen aufgeteilt werden können.
Bei dieser Partitionierungsmethode können aufgrund der bekannten Positionen der
Agenten genaue Angaben über den Netzwerkverkehr zwischen den Instanzen gemacht werden.
Da der PDNS bei der Simulation dieses komplexen Netzwerks häufig Fehler produziert hat, wurde zusätzlich ein sehr einfaches, kleines Netzwerk aus 8 Knoten erzeugt,
um Messergebnisse für spezielle Situationen zu erhalten (siehe Abbildung 4.3).
26
4. Auswertung
Abbildung 4.2.: Ein komplexes Netzwerk: 8 Teilnetze mit je 100 Knoten (Testnetz
I)
4.3.
Messergebnisse und Auswertung
Die Messergebnisse sind aufgrund der oben beschriebenen Probleme des PDNS und
der diversen Fehler bei den Testläufen nicht vollständig und nur eingeschränkt interpretierbar. Trotzdem lassen sich auch schon bei diesen wenigen Ergebnissen Erkenntnisse sowohl über Simulationen mit dem PDNS als auch über unterschiedliche
Partitionierungsmethoden gewinnen1 .
Der Test 1 und die Tests 3 - 6 wurden auf einem Workstation Cluster mit Doppelprozessormaschinen (P3) durchgeführt, Test 2 lief auf dem HPCline Cluster des
P C 2.
Die einzelnen Tests wurden mit den in Tabelle 4.1 aufgelisteten Parametern durchgeführt. Dabei wurde die Menge des Netzwerkverkehrs, der während der Berechnung
simuliert werden sollte, über die Sendedauer2 reguliert.
1
Da die einzelnen Zeiten auf unterschiedlichen Hardwareplatformen gemessen wurden, können
nicht alle Tests untereinander verglichen werden
2
Die Zeit, in der ein Agent Pakete sendet
27
4. Auswertung
Abbildung 4.3.: Einfache Netzwerke mit 8 Knoten (Testnetze II und III)
Test
1
2
3
4
5
6
Agenten
256
256
200
200
200
200
Testnetz
I
I
II
II
III
III
Sendedauer
10s
50s
100s
400s
400s
400s
rLinks
ja
ja
nein
nein
ja
ja
rLink Kommunikation
ja
ja
nein
nein
nein
ja
Tabelle 4.1.: Parameter der Tests
Anzahl der
Instanzen
2 (PDNS)
2 (PDNS)
8 (PDNS)
Partitionierungsmethode
simple
fm
simple
Test 1
Test 2
38s
27s
137s
39s
Tabelle 4.2.: Testergebnisse für das Testnetz I
Die Zeitmessungen auf dem komplexen Testnetzwerk I in Tabelle 4.2 lassen folgende
Schlüsse zu:
1. In Test 1 ist zu erkennen, dass der Einsatz unterschiedlicher Partitionierungen einen deutlichen Geschwindigkeitsunterschied zur Folge hat. Die fmPartitionierung berücksichtigt sowohl die Knoten- als auch die Kantengewichte
und versucht, alle Instanzen gleichmäßig zu belasten.
28
4. Auswertung
2. Eine Erhöhung der Anzahl der PDNS-Instanzen kann laut Test 2 eine Verringerung der Laufzeit bewirken.
Anzahl der
Instanzen
1 (ns)
2 (PDNS)
4 (PDNS)
Partitionierungsmethode
simple
simple
Test 3
Test 4
Test 5
Test 6
32s
18s
12s
168s
81s
169s
105s
171s
185s
Tabelle 4.3.: Testergebnisse für die Testnetze II und III
Auf dem Netzwerk mit 8 Knoten (siehe Abbildung 4.3) wurden einige Extremfälle
getestet, um das Verhalten des PDNS in solchen speziellen Situationen zu bestimmen.
Die Messdaten, die mit diesem Netzwerk gewonnen wurden, unterstützen größtenteils die für das komplexe Netzwerk gewonnenen Erkenntnisse, zusätzlich kann aufgrund von diesen Ergebnissen noch festgestellt werden:
3. Bei diesem Netzwerk bewirkt die verteilte Simulation mit dem PDNS eine
deutliche Verkürzung der Gesamtsimulationsdauer. Die Simulationszeiten des
ns sind bei Test 3, Test 4 und Test 5 deutlich höher als die Zeiten der Simulationen mit dem PDNS.
4. Das Vorhandensein von Remote Links beeinflusst die Laufzeit der Simulation,
auch, wenn kein Netzwerkverkehr über die reale Verbindung simuliert werden
muss (siehe Test 5 ).
5. In Simulationen, bei denen zwischen den PDNS-Instanzen aufgrund von
ungünstig gewählten Partitionierungen sehr viel realer Netzwerkverkehr fließt,
kann die PDNS-Simulationsdauer durchaus die ns-Simulationsdauer überschreiten (siehe Test 6 ).
29
5. Zusammenfassung und Ausblick
Das in dieser Studienarbeit entwickelte Werkzeug PNDG kann sehr einfach eingesetzt werden, um große Netze zu partitionieren und damit effizient zu simulieren.
Allerdings gibt es dabei auch wichtige Einschränkungen, die es nicht möglich machen, beliebige Netzwerke ohne Modifikationen als Eingabe zu Nutzen. Das größte
Problem stellen die Fehler bzw. Einschränkungen im PDNS dar, die komplexe Partitionierungen mit intelligenten Algorithmen von Netzwerken mit unbekannter Topologie quasi unmöglich machen (siehe 4.1).
Allerdings haben die Messergebnisse in Kapitel 4 gezeigt, dass bei einer erfolgreichen
Partitionierung auf bestimmten Netzwerken eine deutliche Verringerung der Gesamtlaufzeit der Simulation zu erreichen ist. Außerdem hat der Vergleich zwischen einer
sehr einfachen und einer intelligenteren Partitionierung erkennen lassen, dass auch
hier noch Potential steckt, die Laufzeit zu verbessern. Durch neue Algorithmen ist
hierdurch möglicherweise eine noch größere Effizienzsteigerung zu erreichen.
Prinzipiell kann der PNDG jede Art von Netzwerken partitionieren und für eine
verteilte Simulation vorbereiten, wenn die Fehler im PDNS korrigiert worden sind.
Allerdings machen die statischen Bewertungen und Partitionierungen, mit denen
der PNDG arbeitet, nur bei statischen Netzwerken Sinn. Wenn ns-Funktionalitäten
genutzt werden, die Links dynamische verändern (z.B. bei der Simulation eines LinkAusfalls), kann der PNDG dieses Netzwerk nicht geeignet partitionieren und damit
auch keine effiziente Simulation durch den PDNS ermöglichen, da eine Anpassung
der PDNS-Beschreibungsdateien während der Simulation nicht möglich ist.
Einer der wichtigsten Punkte einer Weiterentwicklung des PNDG ist das Einpflegen
neuer Versionen des PDNS, damit die aufgeführten Probleme eine verteilte Simulation nicht sofort unmöglich machen.
Die eingeschränkte Syntax stellt kein schwerwiegendes Problem dar, da sie problemlos sukzessive ausgebaut werden kann, wenn ein für eine Simulation notwendiger
OTCL-Befehl noch nicht unterstützt wird.
Es scheint - besonders für sehr komplexe Netzwerke - sinnvoll, den PNDG automatisch zu konfigurieren und durch Scripte nach einer Partitionierung direkt die
Simulation durch den PDNS auszuführen, also im Endeffekt den PNDG nicht mehr
als eigenständiges Programm zu betreiben, sondern zusammen mit dem PDNS zu
einem verteilten Simulationstool zu kombinieren. Durch die Konfigurationsdatei als
Schnittstelle zum PNDG ist hierzu bereits der Grundstein gelegt.
30
A. Unterstützte OTCL-Befehle
Die zu dieser Studienarbeit durchgeführte Implementierung kann nur eine Auswahl
aller möglichen OTCL-Befehle interpretieren. Grundsätzlich werden keine Schleifenund Blockstrukturen verarbeitet.
Im Folgenden befindet sich eine Auflistung aller gültigen Sprachelemente. Diese reichen aus, viele Netzwerksimulationen zu beschreiben.
• set simulatorName [new Simulator]
Generierung eines neuen Simulators.
Werden in einer Beschreibungsdatei zwei Simulatoren erstellt, wird lediglich
der zweite bearbeitet. In diesem Fall können unvorhergesehene Probleme auftreten.
• set nodeName [$simulatorName node]
Generierung eines neuen Knotens
• set agentName [new Agent/AGENTTYPE]
Generierung eines Agenten
• set trafficName [new Application/Traffic/TRAFFICTYPE]
Generierung einer Traffic Source
• $linkName simplex-link $startNode $targetNode bandwidth delay queue
Generierung eines simplex-Links
z.B. $link0 simplex-link $node1 $node2 1.5Kb 120ms DropTail
• $linkName duplex-link $startNode $targetNode bandwidth delay queue
Generierung eines duplex-Links
z.B. $link0 duplex-link $node1 $node2 1.5Mb 10ms DropTail
• $simulatorName at time $trafficName start“
”
Starten einer Traffic Source
• $simulatorName at time $trafficName stop“
”
Stoppen einer Traffic Source
• $trafficName set packetSize packetSize
Setzen der Paketgröße für die Pakete, die diese Traffic Source sendet
31
A. Unterstützte OTCL-Befehle
• $trafficName set interval interval
Setzen der Frequenz, in der die Pakete von dieser Traffic Source gesendet
werden
• $simulatorName at endTime
$simulatorName at endTime
Beendet die Simulation
finish“
”
exit 0“
”
• $simulatorName connect $agent1Name $agent2Name
Mit diesem Befehl werden zwei Agenten verbunden
• $simulatorName attach-agent $nodeName $AgentName
Platzierung eines Agenten auf einen Knoten
• $trafficName attach-agent $agentName
Verbinden einer Traffic Source mit einem Agenten
• # comment line
Kommentarzeile
• puts string
Ausgabe. Der Text string wird auf den Bildschirm ausgegeben
• $simulatorName namtrace-all $namTraceFile
Tracing aller Ergebnisse
• set identifier [open fileName w]
Öffnen einer Datei zum Schreiben
• set identifier [clock seconds]
Die aktuelle Zeit wird in einer Variablen gespeichert. Dieser Befehl kann in
Verbindung mit puts eingesetzt werden, um Zeitmessungen durchzuführen.
Die letzen drei Befehle sind Spezialfälle, welche nicht vollständig unterstützt werden. Sie sind nur eingeführt worden, da diese Befehle regelmäßig in den ns-Dateien
vorkommen und deshalb beim Parsen keine Fehler erzeugen sollten.
Im Allgemeinen gilt, dass die Implementierung lediglich diese Befehle unterstützt.
Sollte der Parser beim Bearbeiten der Originaldatei ein unbekanntes Kommando
finden, bricht er die Bearbeitung mit einer Fehlermeldung ( PARSE ERROR“) ab.
”
32
B. Konfigurationsdatei-Einträge
Mit Hilfe der Konfigurationsdatei können Angaben für die resultierenden Beschreibungsdateien des PDNS gemacht werden. Außerdem besteht hiermit die Möglichkeit,
Bewertungen und Partitionierungen zu steuern und zu parametrisieren. Die Syntax
der Konfigurationsdatei lehnt sich an die OTCL-Syntax an, d.h. die Zuweisung eines
Wertes an eine Variable geschieht durch die Syntax:
set variablenName zuzuweisenderWert
Z.B. weist die Zeile
set number_of_tcl_files 16
der Variablen number of tcl files den Wert 16 zu.
Beginnt eine Zeile mit #, wird diese als Kommentarzeile angesehen und nicht bearbeitet. Sollte die Konfigurationsdatei ungültige Zeichen oder Befehle enthalten,
bricht die Verarbeitung ab und es wird eine Fehlermeldung ausgegeben.
33
C. Implementierte Funktionen
• int showStatistics()
Die Informationen, die diese Funktion liefert, sind hilfreich, um die Güte der
Partitionierung zu überprüfen. Sie gibt tabellarisch Auskunft über die in jeder PDNS-Datei enthaltene Knoten-, Link-, rLink- und Agentenanzahl und
summiert das Knotengewicht für jede Datei auf. Im besten Fall sollten die
Knotengewichte gleichmäßig verteilt und in jeder PDNS-Datei eine ähnlich
große Anzahl von Agenten vorhanden sein.
• int showInformation()
Mit Hilfe dieser Funktion können sehr detailliert Informationen angezeigt werden, die in den einzelnen internen Datenstrukturen gespeichert sind. Im einzelnen werden dargestellt:
– Alle Knoten, die darauf lokalisierten Agenten und alle Kanten, die an
diesem Knoten starten
– Alle Agenten, alle Traffic Sources zu diesen Agenten und die Agenten,
mit denen sie verbunden sind.
– Alle Traffic Sources mit Typ, Start-, Endzeit, Paketgröße, Intervall und
Agenten, mit denen sie verbunden sind
– Alle Links mit Start- und Endknoten, Bandbreite und Delay
– Der generierte Netzwerkgraph in einer Adjazenzdarstellung
• int createTCLFiles(nodeTargetsStruct nodePositions)
Diese Funktion führt einen wichtigen Schritt durch: Sie generiert die endgültigen PDNS-Beschreibungsdateien. Als Parameter erwartet sie eine Liste aller
Knoten mit deren PDNS-Dateinummern. Diese Liste wird bei der Partitionierung des Netzwerkgraphen erstellt.
Näheres zum Vorgehen dieser Funktion kann unter 2.4 nachgeschlagen werden.
• int startPartitioning()
Ein Netzwerkgraph kann mit verschiedenen Algorithmen bewertet und partitioniert werden. In dieser Funktion werden die Bewertungs- und Partitionierungsalgorithmen aufgrund der Einstellungen in der Konfigurationsdatei ausgeführt. Wichtig ist hierbei, dass nur genau ein Partitionierungsalgorithmus
34
C. Implementierte Funktionen
ausgeführt werden kann, jedoch beliebig viele Bewertungsalgorithmen. Sollten mehrere Partitionierungsalgorithmen aktiviert sein, wird nur einer durchgeführt und die restlichen Einstellungen ignoriert.
Nachdem die Bewertungen und die Partitionierung vorgenommen wurden, ruft
diese Funktion die createTCLFiles-Funktion mit den Daten auf, die sie aus der
Partitionierung erhalten hat.
• int createGraph()
Diese Funktion wurde eingesetzt, um das Programm soweit wie möglich unabhängig von einer Graph Library zu entwickeln. Falls von der GTL zu einer
anderen Implementierung gewechselt werden soll, ist an dieser Stelle die Initialisierung des Graphen durchzuführen.
• int createNode(string nodeName)
An dieser Stelle wird, aus denselben Gründen wie bei createGraph(), ein Knoten im Graphen angelegt. Da auf diesen Knoten später noch zugegriffen werden soll, wird sowohl in der Knotenliste ein Verweis auf den Graphen-Knoten
angelegt, als auch für die Gegenrichtung im Graph-Knoten ein Verweis auf
den Knoten in der Datenstruktur. Adressiert werden die Knoten über ihren
eindeutigen Namen.
• int createLink(node startNode, node endNode, string linkName)
siehe createNode()
• node findOutgoingLink(graph graphToSearch, node startNode, node
targetNode)
Um einem Knoten eine IP-Adresse zu geben, benötigt man den nächsten Knoten vom Startknoten auf dem Weg zum Zielknoten. Diese Information wird
von dieser Funktion geliefert.
• node findBorderNode(graph graphToSearch, nodeTargetsStruct
nodePositions, node startNode, node targetNode)
Zum Festlegen eines Routingknotens, der als letzter Knoten aus einer PDNSBeschreibungsdatei den Verkehr über einen rLink zu einer weiteren PDNSInstanz leitet, liefert diese Funktion einen Knoten zurück. Sie geht den Weg
vom Startknoten zum Zielknoten und liefert den Knoten zurück, der am Rand
eines Teilnetzes liegt.
• int assessLinks(string startNode, string targetNode, float
increaseValue)
Diese Hilfsfunktion wird von Gewichtungsfunktionen eingesetzt. Sie erhöht
jeden Link, der auf dem Weg vom Start- zum Zielknoten benutzt wird, um
den Wert increaseValue.
35
Literaturverzeichnis
[1] Network Simulator NS. http://www.isi.edu/nsnam/ns/, November 2001.
[2] Georgia Institute of Technology.
PDNS - Parallel/Distributed NS.
http://www.cc.gatech.edu/computing/compass/pdns/index.html, June 2001.
[3] Raitner Forster, Pick. Graph Template Library. http://www.infosun.fmi.unipassau.de/GTL/.
[4] Scannergenerator flex. http://www.gnu.org/software/flex/flex.html.
[5] Parsergenerator bison. http://www.gnu.org/software/bison/bison.html.
[6] James Demmel. CS 267 Applications of Parallel Computers Lecture 15: Graph
Partitioning - II. http://www.cs.berkeley.edu/∼demmel/cs267 Spr99, 1999.
[7] C.M Fiduccia and R. M. Mattheyses. A Linear Time Heuristic for Improving
Network Partitions. Proc. ACM/IEEE Design Automation Conf., pp. 175-181,
1982.
[8] Y. Wei and C. Cheng. Ratio cut partitioning for hierarchical designs. IEEE,
Transactions on Computer-Aided Design, 10:911–921, 1991.
36
Herunterladen