Vraag Tomcat heeft geleidelijk aan weinig geheugen meer met geïmplementeerde WebSocket-apps


Ik heb Tomcat 8.5.9 uitgevoerd op een AWS-box met 10 verschillende WebSocket-apps die elk in wezen fungeren als een broker voor berichten. De https-connector gebruikt het Http11NioProtocol. De enige parameter die ik heb ingesteld is de maxThreads = 200 samen met de certificaatinformatie.

Het verzoekvolume is niet erg hoog. Het draait al sinds maandagochtend, en hier staat wat de status van de manager zegt:

Max. Threads: 200
  Huidige aantal threads: 38
  Huidige draad bezet: 0
  In leven houden sockets count: 1
  Max. Verwerkingstijd: 234 ms
  Verwerkingstijd: 17.254 s
  Verzoek telt: 33351
  Foutentelling: 325
  Ontvangen bytes: 0.00 MB
  Bytes verzonden: 34.07 MB

Na een paar dagen merk ik dat het geheugengebruik blijft groeien. Ik moet de Tomcat-services ongeveer om de twee weken of zo herstarten om te voorkomen dat ik een OutOfMemoryException krijg.

Ik heb heap-stortplaatsen genomen en geanalyseerd met de Eclipse MAT, die altijd naar de WsFrameServer-klasse verwijst als zijnde de probleemverdachte. De meest recente dump geeft het volgende weer:

5.146 instanties van "org.apache.tomcat.websocket.server.WsFrameServer",
  geladen door "java.net.URLClassLoader @ 0x6c0047c28" bezet 1.383.143.200
  (73,13%) bytes. Van deze exemplaren wordt verwezen
  "Java.util.concurrent.ConcurrentHashMap $ Node []"

De Dominator Tree heeft momenteel 106.000 entries, waarvan de meeste de WsFrameServer-klasse zijn.

Doe ik iets verkeerd of is dit "normaal"? Zijn er specifieke instellingen op Tomcat of op de connector die ik zou moeten instellen om te voorkomen dat dit gebeurt?

Bij voorbaat bedankt.

EDIT: Ik weet niet zeker of dit nuttig is, maar hier ziet de VisualVM-monitor er als volgt uit:

VisualVM Monitor


16
2017-07-21 16:17


oorsprong


antwoorden:


Moeilijk om zeker te zijn zonder meer details, maar dit is waarschijnlijk gerelateerd aan uw sessiebehoud. Wat ik denk dat er gebeurt, is dat het WsFrameServer welke zich uitstrekt WsFrameBase  wordt toegevoegd aan de sessie.
Als je een onbeperkt retentiebeleid voor sessies hebt, heb je uiteindelijk geen geheugen meer.

Probeer een niet-0 in te stellen sessionTimeout 


4
2017-07-31 06:18



Code ontbreekt in uw vraag. (vooral hoe u websocket-verbindingen beheert)

Heb je tomcat in de async-modus gebruikt met ergens een lijst met verbindingen?

Vergeet u niet om een ​​EN-foutmelding te koppelen aan een code die de foutieve verbinding uit de lijst verwijdert?


0
2017-08-04 12:19



Zoals we allemaal weten, is Java GC lui. Het geheugen zal blijven groeien totdat het geen geheugen meer heeft, waarna een GC wordt geactiveerd om afval te verzamelen.

Op de schermafbeelding van uw VisualVM zien we dat het geheugengebruik relatief normaal is: er wordt meer geheugen gebruikt naarmate de tijd vordert, het geheugengebruik daalde na GC.

Dus ik vraag me af of je app echt crasht omdat OOM. Je kunt het in je testomgeving proberen en de OOM JVM-dump laten analyseren, wat nuttiger is.

Trouwens, ik stel VisualVM voor over MAT, omdat MAT er enkele zal bevatten onbereikbaar objecten als GC-root. Het maakt de geheugenanalyse erg inefficiënt en geeft een ander resultaat als andere hulpmiddelen die ik in een van onze projecten heb ontmoet.


0
2017-08-05 01:57