Wie kann ich verhindern, dass die Buchse/den Port Erschöpfung?

Ich bin versucht, performance-test einer website, indem Sie es mit Anfragen über mehrere threads. Jeder thread führt n Zeiten. (in einer for-Schleife)

Allerdings bin ich in Probleme laufen. Speziell die WebException ("Unable to connect to remote server") mit der inneren Ausnahme:

Ein Vorgang auf einem socket konnte nicht ausgeführt werden, weil das system
Pufferspeicher fehlte oder weil eine Warteschlange voll war
127.0.0.1:52395

Ich bin versucht zu laufen 100 threads bei 500 Iterationen pro thread.

Anfangs war ich mit HttpWebRequest im System.Net um die GET-Anforderung an den server. Derzeit bin ich mit WebClient da bin ich davon ausgegangen, dass jede iteration wurde mit einem neuen sockel (also 100 * 500 Steckdosen in einem kurzen Zeitraum von Zeit). Ich nahm WebClient (die instanziiert wird einmal pro thread) würde nur ein sockel.

Brauche ich nicht 50 000 sockets gleichzeitig öffnen, wie ich möchte zum senden der GET-Anforderung, die Antwort erhalten, und schließen Sie die Steckdose, mit der Freigabe für den Einsatz in der nächsten Schleife iteration. Ich verstehe, dass es ein großes problem wäre,

Aber auch mit WebClient, eine Reihe von sockets angefordert wird, was in einer Reihe von Steckdosen in TIME_WAIT - Modus (überprüft mit netstat). Dies bewirkt, dass andere Anwendungen (z.B. internet-Browser) zu hängen und nicht mehr funktioniert.

Kann ich betreiben mein test mit weniger Iterationen und/oder weniger threads, wie es scheint, die sockets zu tun schließlich verlassen Sie diese TIME_WAIT-Zustand. Dies ist jedoch keine Lösung, da es nicht ausreichend testen Sie die Fähigkeiten des web-Servers.

Frage:

Wie kann ich explizit einen socket schließen (von der client-Seite) nach jedem thread iteration, um zu verhindern, dass TIME_WAIT-Staaten und Buchse Erschöpfung?

Code:

Klasse, wickelt die HttpRequest -

Edit: Gewickelt WebClient in einer Verwendung, so wird eine neue instanziiert,verwendet und entsorgt werden für jede iteration. Das problem noch besteht.

  public sealed class HttpGetTest : ITest {
    private readonly string m_url;

    public HttpGetTest( string url ) {          
        m_url = url;
    }

    void ITest.Execute() {
        using (WebClient webClient = new WebClient()){
            using( Stream stream = webClient.OpenRead( m_url ) ) {          
            }
        }
    }
}

Den Teil meiner ThreadWrapperClass, erstellt einen neuen thread:

public void Execute() {
    Action Hammer = () => {
        for( int i = 1; i <= m_iterations; i++ ) {
            //Where m_test is an ITest injected through constructor
            m_test.Execute();
        }       
    };
    ThreadStart work = delegate {
        Hammer();
    };
    Thread thread = new Thread( work );
    thread.Start();
}
Eine Sache zu prüfen, ist nicht zu testen, mit dem "trinken aus dem Feuerwehrschlauch" - Methode. Sie sollten langsam anfangen und Rampe bis die requests/sec, um eine Feste maximale, richtig zu testen Sie Ihr system. Dann können Sie erhöhen Ihre maximale über eine Anzahl der Durchläufe, bis Sie an die Grenzen. Unbegrenzte web-Anforderungen wird Ihnen sagen, sehr wenig.
Denken Sie daran, es gibt nur ~65000 ports zur Verfügung, und nicht alle von Ihnen können verwendet werden, für ausgehende verbindungen. So würden Sie brauchen, um mehrere IPs/NICs zu tun, die 50000 verbindungen, die Sie versuchen zu tun
Ich verstehe, das wäre ein Problem, wenn ich war, die Ausführung einer großen Anzahl von threads, jedoch, sobald eine iteration der Schleife ist fertig, ich brauche die Steckdose nicht mehr, aber es sticks um, wodurch die nächste iteration eine neue zu öffnen. Ich bin auf der Suche einen Weg zu finden, um zu verhindern, dass
Du machst einen auf dem stream sind Sie immer zurück, aber nicht Ihre web-client. Sie könnten versuchen, eine using-Anweisung auf Ihrem WebClient als auch so, es wird entsorgt. Oder manuell entsorgen Sie es, sobald Sie fertig sind Lesen.

InformationsquelleAutor James | 2012-07-19

Schreibe einen Kommentar