Optimierung für den Hintergrund Daemon

Patrizier Sven

Da ich nun angefangen habe die Städte mit Gebäuden zu füllen, stehen mir nun Daten zur Optimierung der Hintergrund Prozesse bereit. Mit den aktuell 35 gefüllten Städten, welche jeweils 5 verschiedene Produktionstypen haben, kann man schon mal einige Tests fahren.

Optimierung des PHP Code

Als erstes habe ich mir die Routinen zur Berechnung der städtischen Produktion vorgenommen. Mit dem direkt runtergetippten und noch nicht überarbeiteten Code komme ich auf eine Ausführungszeit von 6,5 Sekunden. Diese Zeit finde ich nicht wirklich super, und mache mich an die Optimierung.

Nach einigen internen Code Reviews habe ich eine aufwendige Schleife im Code entfernen können, und außerdem gleichzeitig viele MySQL Ergebnisse in ihrer Datenmenge reduziert. Viele abgefragte Felder sind nach dem Umbau nicht mehr nötig, und können auch aus der Datenbankabfrage entfernt werden. Die Ausführungszeit des Daemon hat sich mit diesen Umbauten auf 4,5 Sekunden reduziert.

Optimierung von MySQL

Als zweites fällt mir nun bei Beobachtung der Rechnerauslastung auf, dass der PHP Prozess nur rund 20% Prozessorlast erzeugt, er also anscheinend auf die Datenbank wartet. Darauf hin habe ich mir die Einstellungen meines lokalen MySQL Servers vorgenommen. Das Spiel nutzt innerhalb von MySQL Tabellen vom Typ InnoDB, damit MySQL eine datensatzweise und nicht tabellenweise Sperrung bei Updates benutzt. Dies ist wichtig, da besonders die Daemons viele Updates in der Datenbank machen.

Als erstes habe ich InnoDB angewiesen Dateien pro Tabelle zu speichern, und nicht mehr in einer gemeinsamen Datei. Dies hat auf meinem Entwicklersystem den Vorteil, das der Plattenplatz wieder freigegeben wird, wenn ich Tabellen lösche.

innodb_file_per_table = 1

Außerdem habe ich die Puffer und die gleichzeitigen Threads erhöht

innodb_log_buffer_size = 32M
innodb_buffer_pool_size = 512M
innodb_thread_concurrency = 8

Diese Aktionen haben bei meinen wenigen Daten für die Geschwindigkeit nur eine kleine Auswirkung, aber immerhin ging der Daemon auf 4,2 Sekunden.

Die größte Entscheidung war auf die Sicherheit bei InnoDB Tabellen zu verzichten. Bei InnoDB Tabellen werden Daten umgehend in die Dateien auf der Festplatte geschrieben, was sich auch durch ein dauerhaftes Knattern meiner Festplatten im Rechner bemerkbar macht. Wer im Falle eines kompletten Absturzes des Betriebssystems auf die eventuell noch nicht geschriebenen letzten 2~3 Sekunden der Datenbank verzichten kann, kann dieses Verhalten ändern. Mit den Angaben

innodb_flush_method = O_DIRECT
innodb_flsuh_log_at_trx_commit = 2

macht MySQL bei weitem weniger Festplattenzugriffe, und der Daemon beschleunigt wie von Zauberhand auf 0,46 Sekunden. Der PHP Prozess nutzt seit dieser Änderung auch rund 90~95% des Prozessors, also steht die nächste Optimierungsstufe wieder im PHP Code an.

Als weiteren Test werde ich viele Dummyspieler mit vielen Kontoren und Betrieben erzeugen, und mir die Optimierung der Berechnung der Spielerproduktion vornehmen.


»«

Schreibe einen Kommentar

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