Beschreibung der Ablaufumgebung

Aus LM Wettbewerb

Wechseln zu: Navigation, Suche

Auf dem FTP-Server des Linux-Magazins liegt ein run 878 MByte großes, mit Bzip2 komprimiertes Archiv mit allen Daten, die notwendig sind, um den Spielverlauf nachzustellen. Es entpackt sich in eine Dateistruktur unterhalb von /home eines Kubuntu 10.04 LTS in eine Reihe von Verzeichnissen und belegt dann über 8 GByte an Daten.

Inhaltsverzeichnis

[Bearbeiten] Einrichten der Ablaufstruktur

Es wird empfohlen, einen eigenen Rechner oder eine eigene virtuelle Maschine für das Nachstellen des Turniers zu verwenden, da einzelne Schritte tief in die Installation eingreifen und bisweilen aus Gründen der Bequemlichkeit nicht mit maximaler Konsequenz auf Sicherheitsfragen achten.

  1. Out-of-the-Box-Installation von Kubuntu 10.04 LTS
  2. Entpacken des Archivs in /home
  3. Anlegen der User "gamesrv" (UID 1002), "bots" (UID 1005) sowie "bot001" bis "bot130" (UIDs 10001 bis 10130)
  4. Installation der 314 Pakete, die in bots/pakete.txt stehen

[Bearbeiten] Bedeutung der User

Es gibt drei Arten von Benutezraccounts: "bots" steuert die einzelnen Einsendungen clientseitig, "gamesrv" sorgt sich um den Server und jeder Bot hat einen eigenen Account.

[Bearbeiten] "bots"

Der Benutzer "bots" steuert das Turnier. Es ist vermutlich sinnvoll, ihn in der /etc/sudoers zu berechtigen die UIDs aller einzelnen Bots anzunehmen. Dabei hilft die Zeile

%admin ALL= (ALL) NOPASSWD: ALL

und die Aufnahme von "bots" in der Gruppe "admin". Auf einem Produktivsystem, das auch andere Aufgaben hat, ist solch ein Vorgehen natürlich nicht empfehlenswert.

[Bearbeiten] "gamesrv"

Der Benutzer "gamesrv" betreibt als unabhängiger User den Server auf der gleichen Maschine. Um ihn zu starten, muss (mit Rootrechten) in "/etc/hosts" noch

127.0.0.1       localhost wettbewerb.linux-magazin.de
127.0.1.1       gambler
1.0.0.127       pascal.wettbewerb.linux-magazin.de

eingetragen werden, da einige Bots den Server fest codiert haben und damit auch wirklich der lokale Server benutzt wird.

Der Gameserver startet durch die Befehle nach einem Login auf die Servermaschine, die auch X-Verbindungen weiterreicht, etwa durch

ssh -X gamesrv@gambler

Auf der Maschine sind folgende Kommandos abzusetzen:

cd gamesrv/src/dodserver-0.5.0
./dodservergui 127.0.0.1 3333 > LOGS/meinlog.txt

Danach startet das Qt-Frontend des Servers und zeigt eingehende Verbindungen an. Aus dem Befehl geht auch hervor, wo die Logfiles für die Auswertung liegen. Das Turnier selbst besteht aus dem Zusammenschnitt mehrerer Logfiles, da es zwischenzeitlich zu Neustarts der Gameserver-Hardware kam.

[Bearbeiten] Die Bot-Accounts

Die Benutzer "bot001" bis "bot130" sind die einzelnen Teilnehmer. Jeder hat eine eigene UID und kann unter dieser auch gestartet werden. Das verhindert, dass die Bots sich gegenseitig beeinflussen.

Jeder einzelne Account hat eine ähnliche Verzeichnisstruktur:

  • In "./orig" liegen die unveränderten Orginaldateien, wie sie die Teilnehmer eingeschickt haben.
  • Nach "./src" hat das Linux-Magazin die Einsendungen aus "./orig" ausgepackt und eventuell leicht verändert, sodass die Bots auch mit der Ablaufumgebung zurechtkamen. Dabei geschahen keine inhaltlichen Änderungen. Der Zustand im Tar-Archiv dokumentiert die Orginal-Turnierbedingungen.
  • In "./logs" sollte ursprünglich jedes einzelne Match dokumentiert werden. Letztlich hat sich dieses Verfahren als nicht praktikabel erweisen. Bei mehreren Millionen Matches gäbe es dann ebensoviele kleine Dateien, was das Dateisystem (Ext4 auf dem Turnierserver) vor ernsthafte Probleme gestellt hat. Daher wurde später das loggen der einzelnen Matches deaktiviert. In dem Verzeichnis liegen jedoch immer noch einige Testläufe gegen Sparringspartner, die dazu verwendet wurden, um zu testen, ob jeder Teilnehmer auch mit der Umgebung zurechtkommt.
  • Manche Bots haben eine komplexe Verzeichnisstruktur, andere liegen direkt im obersten Verzeichnis. Der Symlink "./target" zeigt je nach Bot auf das Directory, in dem ein Makefile liegt, das letztlich den Bot startet. Auf diese Weise kann universell und geskriptet jeder Bot gestartet werden.

Um einen Bot zu starten, sind als User "bots" daher folgende Schritte nötig:

  1. sudo -i -u botXXX # XXX ist die Nummer des gewünschten Bots
  2. cd target
  3. make game

Bei einzelnen Bots war es trotz intensiver Fehlersuche nicht möglich, sie entweder insgesamt zum Laufen zu bringen (die Minderheit) oder aber sie haben den Turnierablauf so aufgehalten, dass dies die lange Laufzeit der Berechnung nochmals deutlich verlängert hätte. Die Probleme der ersten Art sind mit den Einsendern abgesprochen, jeder Bot sollte mindestens einmal gegen einen Dummy-Gegner gelaufen sein. Beim Durchführen des Turniers war das dann nicht mehr so einfach möglich, da es mitunter Paarungen gab, die sich offenbar ineinander festgebissen hatten. Konnte ein Bot trotz intensiver Bemühungen nicht geeignet aktiviert werden, musste er leider durch einen Unterstrich in seinem Homedirectory deaktiviert werden. Die Turnierskripte führen ihn dann nicht aus.

[Bearbeiten] Durchführen eines Turniers

Soabld der gameserver mit einem neuen Logfile läuft, obliegt es alleine dem User "bots", die Teilnehmer und Paarungen auszuwählen und zu starten.

Wie im Magazin-Artikel erläutert, erwies sich dieses Unterfangen als komplizierter, als es zunächst schien. Da der Gameserver mehrere Paarungen gleichzeitig behandelt (und behandeln muss, wenn die Laufzeit insgesamt nicht explodieren soll), gibt es keine Gewähr dafür, dass beim Start von "bot001", "bot002", "bot003" und "bot004" auch tatsächlich B1:B2 und B3:B4 spielt. Wartet etwa B1 auf seinen Gegner und braucht B2 lange, um erst irgendwelche Dateien zu laden und sich zu initialisieren, so könnte sich B3 quasi vordrängeln und gegen B1 spielen.

Aus diesem Grunde wurde der Vorschlag eines Teilnehmers im Wiki umgesetzt, einfach beliebige Bots gegeneinander spielen zu lassen und dann die ersten n Matches einer Paarung gegeneinander zu werten. Das Verfahren zeigt sich auch als recht effektiv, jedoch benötigten einige wenige Bots um mehrere Größenordnungen länger für Matches, an denen sie beteiligt waren als der Rest. Ein typisches Match benötigte selten mehr als einen Bruchteil einer CPU-Sekunde pro Spieler. Im Turnier wurden später die Spiele abgebrochen, die mindestens 10 CPU-Sekunden verbraucht hatten, weil dies in etwa dem Hundertfachen eines durchschnittlichen Spiels entsprach (Skript "kill-longrunner.sh").

Später wurde dann noch versucht, bestimmte Paarungen explizit aufzurufen, teilweise, aber nicht alle Teilnehmer konnten so noch Teilnehmer am Turnier teilnehmen.

Um den Überblick zu behalten und möglichst viele Paarungen parallel zu spielen, wurde "screen" eingesetzt. Im Homedirectory von "bots" liegt eine ".screenrc", die sich durch den Aufruf von

screen

aktivieren lässt. Die Datei startet zwanzig parallele Bots über das Shellskript "stream.sh", das seinerseits in einer Endlosschleife zufällig einen Bot auswählt und startet ("stream.sh" startet mittlerweile nur noch Nachzügler, die nicht genügend Paarungen gespielt hatten, das ursprüngliche Skript heißt nun "save-stream.sh").

Alle Steuerungsskripte liegen im Verzeichnis "/home/bots/bin".

[Bearbeiten] Auswerten des Turniers

Die Auswertung basiert alleine auf der Grundlage der Logfiles. Durch Neustarts usw. wurden letztlich mehrere Dateien in eine große Datei zusammengeführt. Sie heißt "/home/bots/auswertung/turnier.log" und enthält ungefährt 6,8 Millionen Paarungen. Abgedruckt im Linux-Magazin ist die "finale-tabell.csv", die in Open Office eingelesen und dort ein wenig aufgehübscht wurde.

Sollte jemand Fehler in der Tabelle finden, bin ich gespannt, davon zu hören, denn ich hatte
keinen Proofreader und habe alles nach bestem Wissen und Gewissen ausgewertet. Bei der schieren
Menge an Daten ist es jedoch ziemlich schwer noch einen echten fallweisen Überblick zu behalten.
  
                                       -- Nils Magnus
Persönliche Werkzeuge