Das Öffnen oberhalb von 1MLN-Verbindungen bleibt bei 469 KB stecken

324
Peter Shipilo

Ich muss den Server so konfigurieren, dass er mehr als eine Million geöffneter Websocket-Verbindungen (idealerweise 1,5-2,0) verarbeitet.

Ich habe die Konfiguration aus diesem Blogpost verwendet:

sysctl -w fs.file-max=12000500 sysctl -w fs.nr_open=20000500 ulimit -n 20000500 sysctl -w net.ipv4.tcp_mem='10000000 10000000 10000000' sysctl -w net.ipv4.tcp_rmem='1024 4096 16384' sysctl -w net.ipv4.tcp_wmem='1024 4096 16384' sysctl -w net.core.rmem_max=16384 sysctl -w net.core.wmem_max=16384 

Meine Anwendung beendet jedoch die Anwendung neuer Verbindungen, nachdem 469219 Verbindungen erreicht wurden. Was kann ich noch vermissen? Ich glaube wirklich, dass etwas in der OS-Konfiguration fehlt. Unsere Haupt-App wurde in Java geschrieben (mit Tomcat-Server), aber auch mit NodeJS-Server wurden ähnliche Ergebnisse erzielt.

Wir verwenden Ubuntu mit 16 GB RAM.

0

1 Antwort auf die Frage

0
Eugen Rieck

Im Blog-Post heißt es ganz ausdrücklich, dass 12M-Sockets 46 GB RAM für den TCP-Stack verwenden - zusätzlich zu den anderen Funktionen.

Wenn Sie nur 16 GB haben, starten Sie Tomcat mit einer Anwendung. Am Ende reicht einfach nicht mehr genügend Arbeitsspeicher aus, um weitere Verbindungen zu akzeptieren. Die NodeJS-Werte sind ähnlich, aber nicht gleich, da der freie Arbeitsspeicher ähnlich, jedoch nicht gleich ist.

Upgrade auf 128 oder 256 GB und ich vermute, dass es gut funktioniert.

Eigentlich benötigt die Java-Anwendung etwa 9 GB Arbeitsspeicher, während das gesamte Betriebssystem, das mit dieser App ausgeführt wird, etwa 11,9 GB benötigt. Es sind noch etwa 2,5 GB verfügbar. Über NodeJS zu sprechen ist noch besser. Es dauert weniger als 3 GB. Peter Shipilo vor 7 Jahren 0