Frage

Ich frage mich, wie teuer es viele Threads zu haben, ist der Zustand in Java 1.6 x64 in warten.

Um genauer zu sein, ich schreibe Anwendung, die über viele Computer läuft und sendet / Daten von einem zum anderen erhält. Ich fühle mich bequemer für jede angeschlossene Maschine und Aufgabe separaten Thread zu haben, wie 1) Senden von Daten, 2) Empfangen von Daten, 3) Wiederherstellung der Verbindung, wenn es fallen gelassen wird. So gegeben, dass es N Knoten in Cluster, jede Maschine 3 Threads für jeden der N-1 Nachbarn haben wird. Typischerweise wird es 12 Maschinen sein, die zu 33 Kommunikations Fäden kommen.

Die meisten dieser Themen werden die meiste Zeit schlafen, so zu Optimierungszwecken I Anzahl der Threads reduzieren könnte und mehr Arbeit zu jedem von ihnen geben. Wie zum Beispiel. Verbindungswiederherstellung ist die Verantwortung des Empfangens Gewinde. Oder an alle angeschlossenen Maschinen Senden von einzelnen Thread durchgeführt wird.

So gibt es eine erhebliche Perfomance Auswirkungen viele Schlaf Fäden auf, die?

War es hilfreich?

Lösung

Für die meisten Fälle, die von einem schlafenden Thread verbrauchten Ressourcen werden sein Stack-Speicher sein. Mit einem 2-Gewinde-per-Anschluss-Modell, das ich denke, ist ähnlich dem, was Sie beschreiben, ist bekannt, große Skalierbarkeit Probleme aus diesem Grund zu verursachen, wenn die Anzahl der Verbindungen groß werden.

Ich habe mich in dieser Situation gewesen, und wenn die Anzahl der Verbindungen über 500 Verbindungen wuchs (etwa tausend Fäden), neigen Sie dazu, in vielen Fällen zu bekommen, wo Sie OutOfMemoryError bekommen, da die Fäden Raumnutzung übersteigt den Stapel maximale Speichermenge für einen einzelnen Prozess. Zumindest in unserem Fall, die in einem Java auf 32-Bit-Windows-Welt war. Sie können tune Dinge und ein wenig bekommen weiter, nehme ich an, aber am Ende ist es einfach nicht sehr gut skalierbar, da Sie viele Speicher verschwenden.

Wenn Sie eine große Anzahl von Verbindungen, Java NIO (neuen IO oder was auch immer) brauchen, ist der Weg zu gehen, so dass es möglich viele Verbindungen im selben Thread zu behandeln.

Having said that, Sie nicht mit unter ein 100 Fäden viel von einem Problem begegnen sollten auf einem halbwegs modernen Server, auch wenn es wahrscheinlich noch eine Verschwendung von Ressourcen.

Andere Tipps

Wir hatten sehr viel das gleiche Problem, bevor wir nach NIO geschaltet, so dass ich zweiten Liedmans Empfehlung mit diesem Rahmen zu gehen. Sie sollten ein Tutorial der Lage zu finden, aber wenn Sie die Details wollen, kann ich Java empfehlen NIO von Ron Hitchens.

Swithcing auf NIO erhöhte die Anzahl der Verbindungen, die wir viel umgehen konnte, was für uns wirklich entscheidend war.

Dies wird nicht sehr gut skalieren. eine große Anzahl von Fäden, bedeutet, dass der VM mehr Zeit kontextSchalt und Speicher useage zu jedem Thread wird höher sein aufgrund verbringen hat seinen eigenen Stapelspeicher zu erfordern. Sie wäre besser dran, mit einer geringeren Anzahl von Threads in einem Pipeline-Verarbeitung oder den Thread-Pool mit asychronous Techniken verwenden.

Viele Fäden gleichsetzen zu viel Stack-Speicher, die Ihr Gedächtnis essen -. Überprüfen Sie die Einstellungen -Xss out für wie viel, dann die Mathematik zu tun

Und wenn Sie schon einmal eine notifyAll () aus irgendeinem Grunde zu tun haben, dann natürlich Sie aufwachen Lasten von zusätzlichen Threads -. Wenn Sie nicht, dass in der vorgeschlagenen Architektur zu tun, müssen

Ich bin mir nicht sicher, dass Sie leicht vermeiden können in diesem Modell pro Horchsocket ein Gewinde (obwohl ich sehr wenig über NIO wissen - was auch dieses Problem beheben könnte), aber einen Blick auf die java.util.concurrent.Executor Schnittstelle und deren Umsetzung Klassen zu viele zusätzliche Fäden, rumhängen für eine anständige Art und Weise zu vermeiden. Tatsächlich könnte der ThreadPoolExecutor ein guter Weg, um Ihr Hörverständnis Threads zu verwalten, so dass Sie nicht zu viel Zeit damit verbringen, zu schaffen und Threads unnötig zu zerstören.

Von den Tests, die ich in C, Lua und Python getan haben, können Sie Ihre eigenen Schlaf machen oder Funktion warten mit sehr wenig Zeilen Code eine einfache leichte Schleife zu machen. Verwenden Sie eine lokale Variable mit der Zeit in der Zukunft, die Sie erreichen wollen, und testen Sie dann für den aktuellen Zeitstempel in einer while-Schleife. Wenn Sie in einem Bereich sind, wo Sie mit fps arbeiten, macht die Funktion Warte läuft einmal pro Frame auf Ressourcen zu sparen. Je mehr Präzision, die Sie benötigen, sollten Sie die Uhr anstelle des Zeitstempel verwendet wird, da Zeitstempel Sekunden begrenzt. Je mehr Zeilen Code hinzufügen, die Sie in eine Wartefunktion, die weniger präzise wird es und desto mehr Ressourcen verbraucht, obwohl etwas unter 10 Zeilen sollte schnell genug sein.

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