Frage

Ich habe eine Server-Anwendung, die Kunden-Anforderungen in anderer Weise behandelt.

Ich möchte wissen, wie viele Benutzer mit minimaler Latenzzeit bedient werden können, so habe ich eine kleine Stresstest-Anwendung, die die Benutzer-Anforderungen simulieren; zur gleichen Zeit überwacht eine andere Anwendung die Speicher / CPU-Auslastung.

Das Belastungstest-Werkzeug erzeugt jeden zweiten Thread in dem jeder Faden einen Benutzer darstellt. Wenn der Stresstest nicht einen neuen Thread wegen des Mangels an Ressourcen erstellen kann es beginnt eine neue Instanz des Stresstests Werkzeug.

Das Problem ist, schreibt jeder Thread in die Datei für jede Anforderung die Latenzzeit und die aktuelle Anzahl der Threads ausgeführt wird, so führt dies zu I / O-Problem als nach ein paar Minuten Sie viele Threads haben, die in die Platte schreiben müssen auch dieses Verhalten wird in dem realen Szenario nicht als der Client nur die Daten fordert existieren werden.

Wie kann ich dieses Problem überwinden, als ich die maximale Latenz pro Benutzer messen möchten?

PS:

Einige Antworten sagen auf verschiedene Rechnern laufen zu berücksichtigen, die Netzwerklatenz ok, das auch mein letzter Stresstest wird zur Zeit ich diesen Test auf demselben Server tue zu finden, wie viele Benutzer mit minimaler Latenzzeit unterstützt werden.

War es hilfreich?

Lösung

Es ist nicht wirklich klar, ob dies eine vernetzte Anwendung ist oder nicht. Wenn es vernetzt ist, dann können Sie einfach den Stresstest skalieren, indem jeder Desktop über das Wochenende zu stehlen den Stresstest auszuführen. Dies kann der einfachste Weg, um den Test zu skalieren, wenn es nur ein paar Ad-hoc-Tests ist.

Es ist jedoch klingt wie könnte es einige einfache Verbesserungen sein. Wenn damit gemeint ist, ein langer Laufstresstest sein, statt einen neuen Thread für jede Anforderung erstellen, können Sie einen Pool von Threads erstellen aus arbeiten (oder noch einfacher, verwenden Sie den Thread-Pool, der automatisch skaliert). Sie würden also einen Test definieren 2000-Benutzer sagen, und Spin-up 2000 Threads, die den Server hämmern. Jeder Thread würde im wesentlichen in einer Schleife, die den Test nicht, und wiederholt.

Ein weiterer Punkt, der nicht klar ist, ob alles, was Sie Threads versuchen, eine einzelne Datei zu teilen. Eine Möglichkeit, diese weniger von einem Engpass zu machen wäre, die Informationen im Speicher zu halten, bis das Programm wird heruntergefahren. Oder Spin einen Writer-Thread auf, die für die Dateischreib verantwortlich ist, und alle sind Sie andere Threads geben Informationen. Wenn IO aufsteht nicht gesichert, sind Sie Writer-Thread einfach im Speicher halten, bis IO verfügbar ist, und Sie sind Worker-Threads können weiterhin den Server in der mittleren Zeit hämmern. Denken Sie nur daran, dass aufgrund der Thread-Synchronisation beteiligt sind, dies nicht gut skalieren kann, so sollten Sie einige Einträge in der Worker-Thread puffern und synchronisieren nur in die Datei Writer-Thread einmal alle 100 Anfragen. Ich glaube nicht, das viel ein Problem sein wird, da es nicht klingt wie Sie etwas mehr als die Antwortzeiten sind zu verfolgen.

Edit: Basierend auf Kommentar Ich würde versuchen, vorschlagen, einen einzigen Thread zu Manager zu verwenden sind Sie IO-Operationen in diesem Fall. würde stattdessen eine Datei zu schreiben, alle von Ihnen sind Worker-Threads, erstellen Sie eine Datei, ein Objekt mit dem, was die Details sind, und übergeben sie geschrieben in eine Warteschlange werden. Zur Senkung des Verriegelungs- / entsperrt, eine Warteschlange innerhalb des Arbeiter-Thread als auch verwenden, und nur sync jeder so oft. Stellen Sie sicher, Sie sperren, wenn Sie die Informationen im Thread sind auszutauschen. Außerdem würde ich vielleicht die Speichernutzung beobachten, da dies alles ermöglicht anhängiges im Speicher aufzubauen. Wenn dies immer noch verursachen Sie io zu blockieren sind, ich aussehen würde entweder das Schreiben weniger, oder vielleicht Tuning oder das Hinzufügen einer schnellere Festplatte.

Andere Tipps

Wenn Sie in der maximalen Latenzzeit pro Benutzer interessiert sind, warum sammeln diese nicht nur in dem Thread und wenn der Test gestoppt haben alle Fäden unsere dort max Latenz schreiben. Sie könnten Statistiken auch tun, Berechnung min / max / Varianz und Anzahl der Threads / Benutzer ausgeführt wird. Sie sollten nicht die Bildschirmausgabe entweder aktualisieren. wenn Sie einen Datenverlust befürchten, schreibt die Daten auf der Festplatte häufig.

Themen sind suboptimal diesen Test für eine Client / Server-Anwendung zu tun. nur eine begrenzte Anzahl von Kernen, nur sehr wenige der Fäden wirklich parallel laufen, aber ihre Zeitscheiben erhalten. Es ist viel besser, und gibt Ihnen einige Zahlen über die Netzwerk-Latenz als auch, Ihr Programm auf mehrere Clients zu starten. Der die Server-Software kann - wenn in der Lage, dies zu tun - verwendet es ist Hardware, wie es in der endgültigen Einstellung, wo Kunden in einem LAN oder WAN ausgeführt werden

.

Natürlich werden Sie eine gemischte Umgebung haben, wie Sie kein vielen Client-Rechner als Benutzer simuliert haben, aber Szenarien wie gleichzeitige Anrufe von unabhängigen Hardware wird in einem solchen Stresstest zeigen sich als Anrufe nicht quasi sind durch Zeitschlitz serialisiert.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top