Lasttests in Skyforge oder Bots - Server-Ordnern. Teil 2

    Hallo nochmal, habrauser!

    Dies ist der zweite Artikel zum Testen des Skyforge- Servers . Für den Fall, ich erinnere Sie daran, dass Skyforge ein MMORPG ist, dessen Server für Hunderttausende von Spielern ausgelegt und in Java geschrieben ist.
    Im Gegensatz zum ersten Teil , der sich mit der Rolle von Bots befasst, befasst sich dieser Artikel mit Stresstests und Metriken.





    Belastungstest


    Die Leser von Habr wissen, dass Stresstests eine Sammlung von Software-Leistungsindikatoren sind, um die Konformität zu überprüfen.

    Unsere Anforderungen für solche Tests sind recht einfach: Die Belastung des Servers unter "Kampfbedingungen" sollte innerhalb normaler Grenzen liegen, und die Benutzererfahrung sollte nicht darunter leiden. Bei der Durchführung von Belastungstests muss daher zunächst ermittelt werden, welche Bedingungen als „Kampf“ gelten. Für uns bedeutet dies zum Beispiel Folgendes: 5000 Spieler tummeln sich auf zwei Servern mit Spielmechanik, einem Datenbankserver und einem Server mit unterschiedlichen Unterstützungsdiensten. Zweitens müssen Sie bestimmen, welche Last als normal gilt. Wir glauben, dass ein Server die Last bewältigen kann, wenn er weniger als 20 Millisekunden pro Server-Tick verbringt.

    Wir haben eine serviceorientierte Architektur - dies bedeutet, dass die Topologie der Services während des Tests mit der Topologie unter "Kampfbedingungen" übereinstimmen sollte. Das Volumen des Inhalts sollte auch in der Nähe des Volumens liegen, das im "Kampf" enthalten sein wird. Im Allgemeinen handelt es sich beim Lasttest um eine Produktion im Miniaturformat, bei der es anstelle von echten Benutzern Bots gibt.

    Prüfungsorganisation


    Alle Tests, einschließlich der Verwendung von Bots, für unser Projekt werden in einem kontinuierlichen Integrationssystem gestartet. Zu Beginn des Tests aktualisiert und startet der Build-Agent den Server, startet die Bots und wartet auf die festgelegte Zeit. Danach stoppt er den Server, analysiert die Ergebnisse und fährt mit dem nächsten Test fort.

    Aufgrund der Tatsache, dass die Ressourcen begrenzt sind (wir haben nur eine Bot-Site), müssen wir ihre Verwendung irgendwie synchronisieren. Daher werden alle Tests mit Bots auf einem dedizierten Build-Agent ausgeführt.

    Nacht-Bot-Test


    Der Hauptlasttest, bei dem der gesamte Inhalt geprüft wird, dauert 8 Stunden in der Nacht. Warum wird diese Dauer gewählt? Es wurde experimentell festgestellt, dass die schwerwiegendsten Fehler nach 4,5 bis 6 Stunden auftreten, und um sie zu finden, müssen wir einfach so lange Tests durchführen. In diesem Intervall tritt eine FullGC-Pause auf ( mehr zu diesem Phänomen ), deren Bekämpfung auch das Ziel der Tests ist. Wir planen, über das Wochenende laufende Tests durchzuführen, die 56 Stunden dauern. Aber im Moment sind dies leider nur Pläne.

    Server


    Und jetzt werde ich mir erlauben, Ratschläge zur Organisation von Belastungstests zu geben und darüber zu sprechen, wie es bei uns funktioniert. Ja, ich verstehe, dass diese Tipps für jemanden die Notizen des berüchtigten Captains sein werden, aber für jemanden können sie dennoch nützlich sein.

    Die wichtigste Phase des Auslastungstests ist die Auswahl und Vorbereitung von Servern für Tests. Da wir keine Battle Server haben, haben wir diejenigen ausgewählt, die den zum Zeitpunkt der Veröffentlichung des Spiels verfügbaren am nächsten kommen. Andernfalls sollten Sie Server verwenden, die der "Schlacht" ähneln.
    Server müssen genau so konfiguriert sein, wie sie im "Kampf" -Modus verwendet werden. Übrigens erwägen wir die Verwendung der Thread-Affinitätstechnologie .Hiermit können Sie einzelne Prozessorkerne an bestimmte Threads anheften, z. B. an Threads der Spielmechanik. Und wenn diese Technologie "schießt", bedeutet dies, dass diese Einstellung während des Stresstests aktiviert werden sollte. Andernfalls unterscheidet sich das Verhalten des Servers unter Last in der Testumgebung und in der Realität erheblich.

    Sie müssen sich auch daran erinnern, dass moderne Server über die Betriebsmodi „Grüne Umgebung“ oder „Stromsparen“ verfügen. Ich empfehle, dass Sie sie sofort ausschalten und die Prozessoren auf volle Leistung einstellen, da die Server keine Zeit zum Ausruhen haben. Es ist jedoch eine schlechte Idee, nicht vorhandene Leistungsprobleme während des Tests im Eco-Modus zu beheben.

    Es ist wichtig, dass Sie uneingeschränkten Zugriff auf Ihre Website haben, damit Sie sich jederzeit anmelden und sehen können, was dort geschieht, welche Prozesse ausgeführt werden usw. Es sollte keine Armee bösartiger Administratoren zwischen Ihnen und dem Server geben, die jedes Niesen kontrollieren. Dies ist aus zwei Gründen notwendig. Erstens, indem Sie Ihren Stand selbst aufbauen und für dessen Zustand verantwortlich sind, können Sie die möglicherweise auftretenden Probleme besser verstehen. Zweitens erhalten Sie vollständige Informationen darüber, was mit Ihrer Testwebsite geschieht. Dies ist sehr nützlich, wenn Anomalien in den erhaltenen Daten analysiert werden.

    Voller Zugriff bedeutet auch, dass Sie alleine da sind. Wenn Sie Auslastungstests durchführen, müssen Sie sicherstellen, dass Ihr Kollege nicht an denselben Arbeiten auf dem Server beteiligt ist, und auch herausfinden, ob die Sicherungsdatenbank aktiv ist. Sie müssen zu 100% sicher sein, dass Sie alleine da sind.

    Aufgezeichnete Statistiken


    Die einfachste und intuitivste Möglichkeit, Lastdaten zu analysieren, besteht darin, sie zu visualisieren. Wir verwenden die Highcharts- Bibliothek zum Plotten , die sicher jqPlot ersetzt . Schauen wir uns einige Beispiele an.

    Grafik laden




    Ich sehe jeden Morgen einen ähnlichen Zeitplan. Damit können Sie die Ladung verfolgen. Die Serverlast ist ein Wert, der dem Zeitverhältnis in Millisekunden entspricht, das für die Verarbeitung von Daten für einen Tick des Servers bis zu 20 Millisekunden benötigt wird. Wenn in der Grafik der Indikator mehr als eins ist (mehr als die Norm), ist alles schlecht, wenn weniger, ist alles gut.

    Speicherauslastungsdiagramm




    Dies ist ein allgemeines Diagramm zur Speichernutzung. Damit können Sie die Arbeit des "Garbage Collectors" näherungsweise bewerten.

    GC-Zeitplan




    Dies ist wahrscheinlich eines der wichtigsten Diagramme für Java-Server. Es ist unwahrscheinlich, dass Spieler während der gesamten Garbage Collection keine Pause bemerken. Darauf ist entlang der Y-Achse die Dauer der einen oder anderen Phase des Garbage Collectors markiert.

    Die Schlüssel, die wir zum Sammeln von GC-Leistungsdaten verwenden
    -verbose: gc
    -XX: + PrintGCTimeStamps
    -XX: + PrintGCDetails
    -XX: + PrintGCDateStamps
    -XX: + PrintTenuringDistribution
    -XX: + PrintGCApplicationStoppedTime
    -XX: + PrintPromotionFailure
    -XX: + PrintClassHistogramBeforeFullGC
    -XX: + PrintClassHistogramAfterFullGC
    -XX: + PrintGCApplicationConcurrentTime


    Stoppt den Fahrplan am Safepoint




    Safepoint ist der Punkt in der Java Virtual Machine, an dem sie jedes Mal angehalten wird, wenn Sie einen Stack-Trace oder eine Garbage-Collection erfassen müssen. Weitere Informationen zu Sicherheitspunkten finden Sie hier . Dieses Diagramm zeigt, wie viele Millisekunden ein Server an diesen Punkten in einer Minute verbringt.

    Datenblatt Betriebstabelle




    Und hier sind die wunderbaren „Schals“, die Randll in Auftrag gegeben hat und deren Bericht über Datenbanken Sie früher lesen konnten. Mit diesen „Schals“ können wir bewerten, welche Datenbankoperationen in welcher Menge wir ausführen.

    Darüber hinaus werden mehrere Dutzend Statistiken protokolliert, die Sie sowohl über Indikatoren auf hoher Ebene (die Anzahl der Mobs in einem Kampf mit einem Spieler) als auch über Indikatoren auf niedriger Ebene (die Anzahl der übertragenen Pakete) informieren. Die meisten dieser Statistiken wurden im Rahmen von Untersuchungen zur Zunahme der Arbeitsbelastung erstellt.

    Zu den gleichen Zwecken mit der Yourkit-APIAm Ende des Tests haben wir den Speicherauszug und das Ladeprofil automatisch entfernt. Jetzt werden sie nur im manuellen Modus analysiert, es ist jedoch geplant, diesen Prozess ebenfalls zu automatisieren.

    Kirsche


    Am Ende des Tests wird der sogenannte Fehleranalysator gestartet. Wir nehmen alle Fehler - und bis zu 100 Gigabyte davon laufen manchmal über Nacht - und stellen sie in die Regale. Wir vergleichen, welche Fehler am häufigsten und welche am seltensten auftreten, und unterteilen sie in Gruppen. Sortieren Sie nach Typ - Fehler, Warnung oder Informationsmeldung - und stellen Sie fest, ob dies ein Inhaltsfehler ist. Wir leiten Inhaltsfehler an QA-Inhaltsspezialisten weiter und untersuchen die Fehler im Servercode selbst. Der Bericht gibt an, wie oft und in welchen Zeitintervallen der Fehler wiederholt wurde. Die Zahl kennzeichnet indirekt die Schwierigkeit, diesen Fehler zu wiederholen, die Kosten für den Server (vergessen Sie nicht, dass das Kätzchen beim Sammeln jedes Anrufstapels auf dem Server stirbt) und die Priorität im Bugtracker.




    Der Zeitpunkt des Auftretens ermöglicht es, die Verteilung der Fehler nach Testzeit abzuschätzen. Es ist eine Sache, wenn Fehler gleichmäßig verteilt sind, und eine andere, wenn sie in einem bestimmten Zeitintervall beginnen und enden.

    In Zukunft planen wir, dieses System so zu entwickeln, dass es möglich ist, Fehler mit Aufgaben in JIRA zu verknüpfen und eine Revision zu finden, in der der Fehler zum ersten Mal bemerkt wurde.

    Die Probleme


    Load-Night-Tests haben sehr teure Iterationen. Die Kosten für jeden Test betragen einen Tag. Natürlich bemühen wir uns, den Test jede Nacht zu bestehen, aber in Wirklichkeit besteht er weniger erfolgreich und Iterationen werden sogar noch teurer. Jeder Ausfall eines beliebigen Knotens der Infrastruktur kann den Test stören.

    Fazit


    Regelmäßige Belastungstests mit Statistiken aller Art sind das beste Werkzeug für Entwickler von gesundem Schlaf. Jetzt kann ich mir nicht vorstellen, wie Sie ohne diese Art von Tests leben können, denn dank ihm sehe ich jeden Morgen, wo wir einen vollständigen „Notfall“ haben können . Es hilft uns, in die richtige Richtung zu gehen. Vielen Dank für Ihre Aufmerksamkeit!

    Andere Materialien können auf der Skyforge-Entwicklerwebsite und in unserer Vkontakte-Community eingesehen werden .

    Vielen Dank für die Hilfe beim Erstellen des Berichts und beim Schreiben des Artikels an das gesamte Skyforge-Serverteam.

    Jetzt auch beliebt: