Entwicklertagebuch #12
09.02.2023 11:00

Seit dem Wochenende darf der ReSi viele neue Spielende willkommen heißen. Wir haben zudem einen Rekord an gleichzeitig Spielenden erhalten, was uns sehr stolz macht. Die Kombination aus dem Ansturm vieler Spielenden und das WLF Update 2/2 haben allerdings dafür gesorgt, dass unser Server ganz schön unter der Last zu kämpfen hatte. Daher haben wir seither permanent Optimierungen vorgenommen, die wir den technisch Interessierten unter euch gerne näher bringen wollen.

Wer das hier noch nicht kennt: Im Entwicklertagebuch stellen wir in unregelmäßigen Abständen den Stand der aktuellen Entwicklung vor, reden über umgesetzte Themen und was in naher Zukunft geplant ist.

Feedback dazu kann immer gerne auf unserem Discord Server oder im Forum abgegeben werden.

Was sich seit dem letzten Tagebuch geändert hat

  • Wir haben 2 Updates veröffentlicht, nun sind endlich Wechsellader & Abrollbehälter verfügbar. Details zu den Updates gibt es in den entsprechenden Patch-Notes
  • Seit Samstag hatte unsere Datenbank unter extrem hoher Last zu kämpfen und wir haben enorm viel Zeit in die Analyse und Behebung von ressourcen-lastigen Datenbankabfragen gesteckt. Anbei einige technische Details:
    • In einer Datenbank werden alle veränderbaren Inhalte (bis auf Dateien) gespeichert, die nicht fix im Programmcode niedergeschrieben sind. Alle Benutzeraccounts, Fahrzeugtypen, Fahrzeuge, Wachen, Wegpunkte der Navigation etc. sind in verschiedenen Tabellen der Datenbank gespeichert. Um so größer die Datenbank wird, desto mehr machen sich schlecht optimierte Abfragen bemerkbar, die entweder Daten aus der Datenbank auslesen, oder diese verändern bzw. löschen wollen.
    • Bisher löschen wir abgeschlossene Einsätze nicht aus der Datenbank, da wir die für spätere Statistiken gerne noch aufbewahren möchten. Zudem brauchen wir vergangene Einsätze für die Vielfalt der Straßen & Orte in der Autovervollsändigung beim Anlegen von Einsätzen. Neben den Einsätzen sind auch die Einsatzprotokolleinträge noch alle vorhanden. Das waren bis zum Wochenende insgesamt 18 Millionen Einträge, obwohl wir vor einiger Zeit alle Protokolleinträge, die vor dem Juni 2022 erstellt wurden gelöscht haben. Wir haben nun erneut sehr viele Protokolleinträge von abgeschlossenen Einsätzen gelöscht und somit die Anzahl auf 3,8 Millionen senken können. Von einer Datenmenge von 1,8 GB der Einsatzprotokolle konnten wir auf 600 MB reduzieren. Das hat die Performance an einigen Stellen bereits verbessert, da deutlich weniger Datensätze durchsucht werden müssen. Der Löschprozess der ganzen Einträge war sehr rechenintensiv und hat leider für mehrere kürzere Ausfälle des ReSis gesorgt. Ausfälle generell über die Woche hinweg waren auch meist der Grund für feststeckende Fahrzeuge oder Einsätze, da diese mitten in der Bearbeitung abgebrochen sind, obwohl der Code an dieser Stelle eigentlich fehlerfrei funktioniert.
    • Um nach bestimmten Einträgen in Tabellen zu suchen, sollte man sogenannten Indexes anlegen. Das funktioniert ähnlich wie ein Lexikon, in dem man z.B. alle Fahrzeuge anhand ihrer Wache auslesen kann. Somit müssen nicht alle Fahrzeuge angeschaut werden um zu prüfen, ob sie von der gesuchten Wache stammen. Zu viele Indexes verlangsamen aber auch wiederum die Performance von Veränderungen oder Löschungen von Datensätzen, da dabei jedes Mal die Indexes auch aktualisiert werden müssen. Allerdings verbessert sich die Performance von gezielten Abfragen teils enorm. Hier ist viel Erfahrung und Ausprobieren nötig, um das perfekte Mittelmaß zu finden. In diesen Prozess ist viel Zeit geflossen, da man mühsam alle Datenbankabfragen mit den vorhandenen Indexes vergleichen muss um zu schauen, ob die passenden Indexes bereits existieren oder noch angelegt werden müssen.
    • Bei vielen Datenbankanfragen werden die Datensätze nach einem bestimmten Wert sortiert, z.B. die Fahrzeuge alphabetisch absteigend nach ihrem Funknamen. Eine Sortierung greif wenn möglich auch auf Indexes zurück, sollte aber wenn möglich vermieden werden, da sie extra Performance kostet - und Performance lässt sich spürbar in der Laufzeit einzelner Abfragen messen. Wir haben die ORDER BY Operatoren, die für die Sortierung einer jeweiligen Abfrage notwendig sind im ganzen ReSi geprüft und wenn möglich entfernt. Das war meist bei internen Abfragen der Fall, bei denen die Reihenfolge der Ergebnisse keine Rolle spielt. Sichtbare Auswirkungen auf anders sortierte Listenansichten etc. gab es dabei nur im kleinen Maß.
    • Einige Abfragen haben unnötig viele Datensätze durchforstet. Hier konnten wir durch Optimierung sehr viel Leistung einsparen. Ein Beispiel ist die Abfrage für die freigegeben Verbandseinsätze, die beim Laden der Seite einmalig in der Leitstelle reingeladen werden. Hier wurde bisher nicht darauf verzichtet, offene Notrufe und bereits abgeschlossene Einsätze rauszufiltern, bevor man nach Einsätzen aus dem eigenen Verband gesucht hat. Durch diese Anpassung benötigt die Abfrage statt bisher 4,5 Sekunden in einem großen Verband, nur noch 0,0047 Sekunden. Das macht sich beim Laden der Seite deutlich in schnelleren Ladezeiten bemerkbar. Eine ähnliche Abfrage konnten wir von 4 Sekunden auf 0,0009 Sekunden optimieren, das sind gigantische Verbesserungen mit dem selben Endergebnis.
    • Die Abfrage, die bei der Alarmierung die Fahrzeuge inkl. der Kopplungsfahrzeuge zurückgegeben hat, war so verschachtelt geschrieben, dass sie nur teilweise auf Indexes zurückgreifen konnte und eine Laufzeit von etwa 0,3 Sekunden hatte, bei der Alarmierung von nur 2 Fahrzeugen. Bei der Alarmierung mehrerer Fahrzeuge noch deutlich länger. Da diese bei jeder Alarmierung ausgeführt wird, und jedes Mal alle Fahrzeuge in der Tabelle durchsucht, hat sie einiges an Performance beansprucht. Wir konnten die Abfrage nun intelligent in 2 Teile splitten und diese haben nun eine Laufzeit von 0,0004 Sekunden und 0,0015 Sekunden. Dadurch läuft die Alarmierung spürbar schneller und der Server hat Kapazitäten für andere Aufgaben.
    • Insgesamt haben wir bisher etwa 20 Datenbankabfragen optimiert, und noch weitere durch die weitere Anlegung von Indexes verbessert. Im ReSi gibt es in Summe aber über 300 verschiedene Abfragen, die wir nach und nach optimieren werden. Viele sind bereits final optimiert und lassen sich kaum noch verbessern oder haben kaum Auswirkungen auf die Performance, da sie selten ausgeführt werden und nur Tabellen mit kleinen Datenmengen anfragen.
    • Die Autovervollständigung für Straßen & POIs beim Einsatz anlegen haben wir komplett neu geschrieben. Hier haben wir die Datenbankabfrage bei großen Spielern von etwa 1,5 Sekunden auf 0,044 Sekunden reduziert, indem wir eine ungenauere Liste von Ergebnissen aus der Datenbank abfragen und diese dann in einer Serverseitigen Routine auswerten und sortieren. Da diese Aktion bei jedem eingetippten Buchstaben in das Feld “Straße / Ort” ausgeführt wird, konnten wir auch hier viel Rechenleistung sparen und die Ergebnisse sind direkt spürbar. An dieser Funktion haben wir zu Zweit jeweils etwa 5 Stunden gearbeitet, um mal eine Einschätzung in den Aufwand dieser Optimierungen zu erhalten.
    • Wir haben noch 2 Datenbankabfragen im Visier, die noch enorme Leistungen beanspruchen und zudem noch mehrmals die Sekunde ausgeführt werden. Aufgrund deren Komplexität konnten wir hier noch keine Optimierung finden, die das Ergebnis nicht verfälscht. Dies werden wir uns in Kürze anschauen.
  • Es gibt neue Einsätze
    • Brand in Krankenhaus
    • Brand in Tunnel
    • Feuer auf Campingplatz
  • Zu folgenden Einsätzen wurden neue Varianten veröffentlicht und/oder bestehende überarbeitet
    • Sachbeschädigung
    • Sturz aus Höhe
    • Vermisste Person
    • Anzeige Graffiti
  • Wir haben einige Fehler behoben, darunter einige Probleme mit feststeckenden Fahrzeugen, Einsätzen & Patienten. Sowie auch falsche Einsatzpositionen bei Einsätzen, die POIs nutzen. Details dazu in den Patch Notes des nächsten Updates
  • Wir haben die Autovervollständigung für Straßen & POIs beim Einsatz anlegen komplett neu geschrieben. Vorteile:
    • Deutlich schnellere Ausgabe von Vorschlägen (bei großen Spielern bisher Wartezeiten von teils mehreren Sekunden)
    • Dadurch Performanceverbesserungen auf dem Server
    • Kleinere Schreibfehler werden ignoriert, das passende Element wird trotzdem vorgeschlagen
    • Dynamische Angabe von POI Namen möglich. Man ist nicht mehr starr an das bisherige Format gebunden, sondern kann z.B. auch POI Typ mit Straßenname kombinieren
  • Wir haben den Arbeitsspeicher unseres Servers verdoppelt

Woran wir gerade oder in Kürze arbeiten

  • Wir werden in den nächsten Tagen einige Fehler beheben. Aktuell sind etwa 80 gemeldete Fehler offen zur Bearbeitung. Bevor wir an anderen Stellen arbeiten, wollten wir eine saubere Basis schaffen, die nicht voller Fehler steckt. Du hast einen Fehler entdeckt? Schaue gerne im Forum bzw. auf Discord, ob der Fehler bereits gemeldet wurde und melde dich dort dann gerne mit Informationen zum Fehler.
  • Wir werden versuchen weitere Optimierungen an der Datenbank vorzunehmen, um die Performance stückweise weiter zu verbessern
  • Im Anschluss nehmen wir die Arbeiten an den Lehrgangsfreigaben wieder auf, die wir bereits vor langer Zeit begonnen hatten. Im gleichen Zug geht es auch darum, mehrere Klassenräume pro Schule zu bauen.
  • Nebenbei und danach werden wir Quality of Live Updates veröffentlichen, die kleinere Funktionen implementieren, die aber oft gewünscht wurden. Dazu gehören zum Beispiel die Anzeige der restlichen Anfahrtszeit auf Einsatzfahrten und die Anzeige von Fahrzeugen der Verbandsmitgliedern auf der Karte zu freigegebenen Einsätzen

Weiterführende Links