Wie viel Speicher muss ein Tomcat-thread nehmen?
Wenn ich erhöht meine Tomcat-thread-pool von N auf N+1 threads, wie viel zusätzliche Speicher wird das dauern?
Natürlich, meine app möglicherweise verantwortlich für einige zusätzlichen Speicher, aber wir ignorieren das, ich bin nur daran interessiert, wie viel Tomcat nimmt.
Ich denke, ich könnte führen Sie ein paar tests und Messen Sie es selbst, aber ich bin der Hoffnung, dass schon jemand gemacht und kann Sie teilen, oder zeigen die Ergebnisse.
- Der virtuelle Speicher? Der physische Speicher?
- Ja 🙂 Was auch immer Informationen zur Verfügung stehen. Vielleicht ist die interessantere Frage für Java ist, ob es PermGenSpace vs. Heap usw.
- Ist Ihr Anliegen die Vermeidung von out-of-memory-Fehler, verursacht durch nicht genügend virtueller Speicher? Oder ist Ihre Sorge, performance-Probleme, die von unzureichendem physikalischen Speicher?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Zusätzlichen physischen Speicher verbraucht wird effektiv gar keine. Bis und es sei denn, der thread funktioniert, das Betriebssystem wird nicht Abfall physischen Speicher hielt seinen stack oder Verwandte Strukturen. (Es wird wahrscheinlich verbrauchen einige physischen Speicher, natürlich, weil es die anfänglichen stack. Aber das kann und wird ausgelagert werden ohne Schaden für die Leistung, wenn der thread nicht ausgeführt wird.)
Aber der thread-stack verbraucht virtuellen Speicher. Sie können tune den thread maximale stack-Größe, und es ist die maximale stack-Größe, die steuert, wie viel virtuellen Speicher verbraucht. Wenn das Gewinde sitzt nur da, es ist effektiv kostenlos. Es zählt gegen den virtuellen Speicher begrenzt, obwohl es verbraucht keine echte, begrenzte Ressourcen.
Wenn Sie Fehler aufgrund der virtuelle Speicher von thread-stacks, wahrscheinlich die beste Möglichkeit ist die Erhöhung des virtuellen Speichers beschränken. Der Zweck des virtuellen Speichers zu begrenzen, ist bis zum cap Verwendung des physischen Speichers der indirekt-physische Speicher verwenden, wird nicht mehr als virtuellen Speicher zu verwenden. Aber wenn Sie die Programmierung von mustern (wie viele threads), die verbrauchen virtuellen Speicher ohne entsprechende Nutzung des physikalischen Speichers, die Grenzen nur kick, wenn Sie nicht sollten.
Natürlich ein 32-bit Prozess ist grundsätzlich beschränkt auf 2GB, 3GB oder 4GB virtueller Speicher (je nach Plattform). So haben Sie möglicherweise keine Wahl, sondern reduzieren die maximale thread-stack-Größe. (Ein thread sofort verbraucht virtuellen Speicher gleich seine maximale stack-Größe, weil der Adressraum reserviert werden müssen, auch wenn es nie benutzt.)
Verringert sich die maximale thread-stack-Größe ist auch eine option. Dies ist ein Kompromiss aber. Eine größere maximale verhindert, dass der Faden verursacht eine Ausnahme, wenn es braucht eine Menge der stack, die jemals im Laufe seines Lebens. Und die einzige Ressource, die verbraucht wird, Adressraum, der ist normalerweise Billig. Aber die einzige praktische Grenze, die Sie verhängen kann auf das Programm, um es zu halten über wenig physischen Arbeitsspeicher und schlecht, ist die Begrenzung des virtuellen Speichers. Also die regler, die Sie wirklich wollen, ist nicht vorhanden.
Ich glaube, der primäre Speicher-Nutzung werden die stack-Speicherplatz pro thread. Dies ist steuerbar, auf der Kommando-Zeile via -Xss
Basierend auf was ich gesehen habe, eine neue Leerlauf-thread dauert bis zu 20 KB - 50 KB Speicher.
Von dort kann es wachsen, wie es läuft auf der Grundlage der stack-Tiefe (geschachtelte Methodenaufrufe) und die Anzahl der Parameter und lokalen Variablen (alle primitive und Zeiger in Methodenparameter und lokale Variablen, die Hinzugefügt werden auf den Stapel. In der Erwägung, dass die Objekte selbst werden auf dem heap).
Work-load (wenn der thread zu arbeiten), fügen Sie einige memory-Nutzung, und dann kann es gelöscht, indem die Zeit, die die Anforderung abgeschlossen wird. Aber Sie können nicht führen dies auf den neuen thread, da das Arbeit-Last hat man wieder durch einen thread oder die anderen.
Lange Geschichte kurz: Einen zusätzlichen thread hinzufügen, etwa 0,05 MB Speicherauslastung.
Hinweis 1:
Es scheint ein pro-Prozess-Grenze für die Anzahl der threads. So, eine linux-Implementierung erlauben könnte, eine JVM zu erstellen, größter 1000 oder 2000 threads.
Also, Sie haben, um sicherzustellen, dass alle thread-pools, die in Ihrer Anwendung weniger als 2000 threads. Sonst stürzt die JVM möglicherweise ab, wenn plötzlich das limit gebrochen wird.
Hinweis 2:
JVM NMT falsch reports Java 8 committed memory, automatisch Einstellung zu reservierten Speicher. Siehe: https://bugs.openjdk.java.net/browse/JDK-8191369