Daemons im Hintergrund

Patrizier Sven
Debian Linux

Um den Spieler nicht mit unnötigen Wartezeiten beim Webseitenaufbau zu belasten habe ich mich für den Einsatz von Daemons zur Resourcenberechnung und Spielsteuerung entschieden. Diese arbeiten konstant im Hintergrund, können auf externe Rechner ausgelagert werden, und sollen in Zukunft auch automatisch skalieren.

Im folgenden die Daemons, welche bereits angelegt bzw. fertig implementiert sind:

Produktionsberechnung der Städte und Benutzer

Bei diesen Daemons kommt es vor allem auf die richtige Reihenfolge der Berechnungen an. Es wäre ja ziemlich unvorteilhaft, wenn der Spieler eine Nachricht über fehlende Ressourcen bekommt, nur weil die Produktion der Getreidefarm nach der Mühle berechnet wurde. Außerdem benötigen diese beiden ein besonderes Augenmerk auf Optimierungen – sie werden oft benötigt, und haben viele Berechnungen zu erledigen.

Handling der Schiffe und Konvois

Dieser Daemon überwacht alles, was rund um die Schiffe passiert. Er sorgt dafür, dass die Schiffe zur richtigen Zeit im Hafen ankommen, der Zustand der Schiffe sich mit der Zeit verschlechtert, diese in der Werft auch wieder repariert werden, … . Alles im allem viele kleine Aufgaben, welche keinen großen Aufwand darstellen, aber erledigt werden müssen.

Bevölkerung

Nun geht es richtig zur Sache! Hier wird die Bevölkerung einer Stadt gesteuert. Dabei wird je nach Versorgungsstatus die Zu- und Abwanderung berechnet und freie Arbeitskräfte auf die Betriebe sowie Wohnhäuser verteilt. Dabei dürfen nur Arbeitskräfte eingestellt werden, wenn auch der entsprechende Wohnraum vorhanden ist.

Daemon der Nebenaufgaben

Natürlich muss auch das Anlegen, das Ausführung oder Verpennen von Nebenaufgaben gesteuert werden. So gibt es bereits in der Alpha Version die Möglichkeit Aufträge zur Warenlieferung vom schwarzen Brett im Rathaus zu erfüllen, und dabei Gold und Ansehen zu verdienen. Des weiteren sind schon Entwürfe für Schatzsuchen, Diebe und Informanten vorhanden 😉

Im Ganzen erfüllen die Daemons aktuell 16 kleinere und größere Aufgaben, und sorgen damit dafür, dass der Spieler nicht ständig auf Berechnungen warten muss.


»«

8 Kommentare zu “Daemons im Hintergrund”

  • Exe sagt dazu:

    Mich wuerde mal interessieren, mit welcher Sprache du deine Daemons geschrieben hast.

    .. Und was dein Server so fuer Hardware hat. Ist es ein V-Server ?

    Lg

    Ps: Sieht gut aus Ingame, wenn ich Zeit hab, werde ich heute Abend mal mitspielen.

    Antworten
    • Sven sagt dazu:

      Es ist alle PHP, auch der Daemon 😉 Einfach ein Skript, was in einer Endlosschleife läuft, und die Pausen per sleep() überbrückt. Dazu gibt es noch einen Cronjob, der nur prüft, ob das PHP Skript noch läuft. Bisher brauchte der Cronjob das Skript aber noch nicht neu starten, alles schön stabil.

      Antworten
  • Torsten sagt dazu:

    Hallo Sven,

    wie bringt dein Cronjob denn in Erfahrung ob die Daemons noch laufen? Schaut der in die Prozessliste? Wird geschaut wann der Daemon zuletzt ausgeführt wurden? (fileatime(‚/daemons/foo.php‘)) …

    Antworten
  • Torsten sagt dazu:

    Ein paar Informationen zu dem Thema wären sowieso super. Laufen reine PHP Daemons auf Dauer sauber etc.

    Bei Endlosschleifen soll es zu Zombies kommen können. Was machst du dagegen?

    lg

    Antworten
    • Sven sagt dazu:

      Hallo Torsten,

      das funktioniert wie vermutet über die PID. Der Daemon schreibt beim Start seine eigene PID in die Datenbank (ginge auch per File). Der Cronjob holt sich die dort raus, und prüft in der Prozessliste ob es die noch gibt. Die letzte Ausführung, wie von dir angesprochen, ist ja völlig egal. Entweder läuft der Daemon noch, oder eben nicht.

      Mein PHP Daemon läuft tip top, bisher gab es keinerlei Aussetzer (außer ich hatte Quark programmiert). Der Cronjob musste den Daemon noch nie neu anstoßen. Zombies sind mir bisher auch noch nicht untergekommen, da der PHP Daemon nicht als Child läuft, sondern per

      shell_exec( 'nohup ..... > /dev/null & echo $!' );

      als eigener Prozess gestartet wird.

      Auch ist der genutzte Speicher des Daemon absolut konstant. Die längste Laufzeit (bei einem Release muss der neu gestartet werden) waren bisher knapp 4 Wochen. Und das viel besprochen „PHP ist langsam“ kann ich hier auch nicht feststellen. Dadurch, dass die Skripte nur beim Daemonstart geladen werden, sind die Ausführungszeiten hervorragend. Mein Protokoll gibt mehr derzeit folgende Durchschnittswerte von einigen Aufgaben:

      Ships::moveReady(516) - average 0.029 Sek for 586 loops
      CityPostings::checkExecution() - average 0.009 Sek for 162 loops
      Cities::calculateConsumption() - average 0.027 Sek for 243 loops
      Cities::calculateUserProduction() - average 0.199 Sek for 244 loops

      und dabei läuft noch das Debuglog in mehrere Dateien mit und die Caches sind abgeschaltet 😉

      Antworten
  • Torsten sagt dazu:

    Danke 🙂

    Und der Datenbankserver (mysql?) macht auch keine Probleme wenn man den mit Anfragen überhäuft?

    Antworten
    • Sven sagt dazu:

      Hallo Torsten,

      das Spiel nutzt MySQL als Datenbank. Ich weiß aber nicht, warum es Probleme mit vielen Anfragen geben soll. Eine Datenbank ist doch genau für so etwas programmiert und optimiert. Wenn man das Datenbankmodel sinnvoll anlegt, richtig indiziert sind einige hundert Abfragen pro Sekunde möglich 😉

      Antworten

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.