Testdatengenerierung und K6-Lasttests für den Suchdienst / Sudo Null IT News

Hallo alle! In diesem Artikel werde ich darüber sprechen, wie wir die Aufgabe der Lasttests für den Suchdienst gelöst haben, wie wir den wunderbaren K6 kennengelernt haben und wie sich die cloudbasierte Elastic Search unter Last verhält.

TK: Wir müssen einen mandantenfähigen Suchdienst testen. Jeder Mandant hat seinen eigenen Index in Elastic Search. Anzahl der Mandanten = 100 Anzahl der Dokumente in jedem Mandanten = 500.000 Anzahl der Benutzer 90 Mandanten mit 20 Benutzern + 10 Mandanten mit 100 Benutzern. Jeder Benutzer führt maximal alle 5 Minuten eine Anfrage aus.

Wahl des Ansatzes zur Generierung von Testdaten

Die erste Aufgabe besteht darin, Testdaten zu generieren. Zur Auswertung wurde ein Schema gezeichnet, nach dem die Daten in die Suche in unseren Diensten gelangen

Gemäß dem Schema erfordert der frontale Ansatz die Nutzung vieler anderer Dienste und Ressourcen. Wir entschieden, dass dies nicht gut ist – und vereinfachten das Schema

Es wurde beschlossen, alle Zwischendienste einzustellen. Der zu testende Dienst verwendete eine Methode zum Erstellen eines Index. Es wurde entschieden, Dokumente unter Verwendung einer ähnlichen Logik wie der zu testende Dienst direkt in Elastic zu schreiben.

Der Nachteil dieses Ansatzes: Wenn sich die Logik im Dienst ändert, muss sie auch im Dienstprogramm zur Generierung von Testdaten geändert werden.

Generierung von Testdaten

Wenn Sie ein Dokument 50.000.000 Mal zu Elastic hinzufügen, wird der Generierungsprozess natürlich nicht sehr schnell sein. Um den Generierungsprozess zu beschleunigen, haben wir zwei Tricks angewandt: Dokumente stapelweise in mehreren Streams zum ursprünglichen Index zu Elastic hinzugefügt. Dann wurde dieser Index so oft wie erforderlich geklont.

Als Ergebnis wurden 50.000.000 Dokumente in 1 Minute generiert.

Grafisch sieht der Generierungsprozess so aus

Hier ist ein Beispiel für ein Modul zum Arbeiten mit Elastic über NEST unter Verwendung von Nest; mit System; mit System.Collections.Generic; mit System.Dynamic; Namespace ElasticApiClient { public class NestClient { private readonly ElasticClient _api; public NestClient(string url, string user, string password) { var connectionSettings = new ConnectionSettings(new Uri(url)); _api = neuer ElasticClient (Verbindungseinstellungen); connectionSettings.BasicAuthentication (Benutzer, Passwort); } public void DeleteUnusedIndices() { var response = _api.Indices.GetAsync(new GetIndexRequest(Indices.All)).GetAwaiter().GetResult(); foreach (var index in response.Indices) { var indexName = index.Key; var countRequest = new CountRequest(Indices.Index(indexName)); var numberOfDocuments = _api.CountAsync(countRequest).GetAwaiter().GetResult().Count; if (numberOfDocuments == 0) { _api.Indices.DeleteAsync(indexName).GetAwaiter().GetResult(); } } } public void CloneIndices(string sourceName, List targetNames) { _api.Indices.UpdateSettingsAsync(Indices.Index(sourceName), u => u .IndexSettings(i => i .Setting(“index.blocks.write “, wahr) ) ).GetAwaiter().GetResult(); foreach (var targetName in targetNames) { _api.Indices.CloneAsync(new CloneIndexRequest(sourceName, targetName)).GetAwaiter().GetResult(); } _api.Indices.UpdateSettingsAsync(Indices.Index(sourceName), u => u .IndexSettings(i => i .Setting(“index.blocks.write”, false) ) ) ).GetAwaiter().GetResult(); } public void DeleteTestIndices(List testTenantIds) { var testIndexNames = new List(); foreach (var testTenantId in testTenantIds) { testIndexNames.Add($”{testTenantId}-documents”); } var response = _api.Indices.GetAsync(new GetIndexRequest(Indices.All)).GetAwaiter().GetResult(); foreach (var index in response.Indices) { var indexName = index.Key; if (testIndexNames.Contains(indexName.Name)) { _api.Indices.DeleteAsync(indexName).GetAwaiter().GetResult(); } } } public void IndexMany(List expandos, string indexName) { var ids = new List(); foreach (var expando in expandos) { var byName = (IDictionary)expando; var documentId = (Guid)byName[“documentId”]; ids.Add (Dokument-ID); } Var-ID = 0; _api.Bulk(bd => bd.IndexMany(expandos, (descriptor, s) => descriptor.Index(indexName).Id(ids[id++]))); } } }

K6 ist eine megacoole Sache zum Laden!

Wir haben uns entschieden, den Dienst durchzuladen K6. Hier können Sie nachsehen Vergleich von K6 und JMeter.

Die eleganteste Dokumentation hat unsere Arbeit stark vereinfacht. Um das Problem zu lösen, brauchten wir:

  1. Installation

  2. Start

  3. Senden von Anfragen

  4. Butchi

  5. Schecks

  6. Feste Belastungsstufe

  7. Möglichkeit Grenzwerte einzustellen

  8. Berichte

Insgesamt passt der gesamte Code des Skripts zum Laden des Dienstes mit allen benötigten Goodies in 200 Zeilen.

Wie sich Elastic unter Last verhält

Wir verwenden eine Elastic-Cloud-Instanz. Es hat so etwas wie CPU-Guthaben. Das heißt, wenn die Last auf Elastic das bezahlte Limit überschreitet, werden die CPU-Credits schnell verbraucht, gehen auf Null und die Reaktionszeit beginnt dementsprechend stark zu wachsen. Wenn wir die Last entfernen, werden die CPU-Credits langsam wiederhergestellt. Grafisch sieht der Vorgang so aus

Laut TOR soll der Dienst mit maximal 9,33 Anfragen pro Sekunde arbeiten

maxRequestsPerUser = einmal in 5 Minuten = 0,2 Anfragen pro Minute totalNumberOfUsers * maxRequestsPerUser = 2800 * 0,2 = 560 Anfragen pro Minute = 9,33 Anfragen pro Sekunde maxRequestsPerSecond = 9,33 Anfragen\s

15 Anfragen pro Sekunde hat unsere Elastic-Instanz abgeschlossen kein Problem. Aber bei 20 Anfragen pro Sekunde – die Probleme sind schon da Wille und Sie müssen für eine leistungsfähigere Elastic-Instanz bezahlen.

Gesamt

Basierend auf den Ergebnissen der geleisteten Arbeit haben wir ein Dienstprogramm zum schnellen Generieren von Testdaten erstellt, das K6 beherrscht, und die maximal zulässige Anzahl von Anforderungen pro Sekunde für einen stabilen Betrieb des Dienstes bei bestimmten Kapazitäten ermittelt. Vielen Dank für Ihre Aufmerksamkeit. Frieden für alle!

PS Weitere Artikel über K6 auf Habré von wunderbaren Autoren

Wie ich den Code für Lasttests dreimal kürze

Lasttest-Tools und mehr

Integration von Lasttests auf Grafana K6 in CI/CD

Similar Posts

Leave a Reply

Your email address will not be published. Required fields are marked *