2015-07-14 14 views
19

Wir haben einen node.js-Webserver, der einige ausgehende HTTP-Anfragen an eine externe API sendet. Es läuft in Docker mit dokku.
Nach einiger Ladezeit (30 req/s) bekommen diese ausgehenden Anfragen keine Antworten mehr.Docker blockiert ausgehende Verbindungen bei hoher Auslastung?

Hier ist ein Diagramm, habe ich während mit konstanter req/s testen: graph incoming und outgoing die Menge gleichzeitiger Anforderungen ist (nicht die Anzahl der initialisierten Anfragen). (Es ist schwer zu sehen in der Grafik, aber es ist ziemlich konstant bei ~ 10 Anfragen für jeden.)
response time ist nur für externe Anfragen. Sie können deutlich sehen, dass sie auf einmal (schlagen unsere 1000ms Timeout) starten.


Je mehr erf/s wir, desto schneller können wir in dieses Problem senden laufen, also müssen wir eine Art Grenze haben wir immer näher an mit jeder Anforderung.


I verwendet netstat -ant | tail -n +3 | wc -l auf dem Host die Anzahl der offenen Verbindungen zu bekommen, aber es war nur ~ 450 (die meisten von ihnen TIME_WAIT). Das sollte nicht das Socket-Limit treffen. Wir treffen auch keine RAM- oder CPU-Grenzen.


Ich versuchte auch außerhalb Docker die gleiche Anwendung auf der gleichen Maschine laufen und es geschieht nur in Docker.

+0

Haben Sie versucht, es in Docker laufen aber nicht in Dokku? – blacklabelops

+0

Definieren Sie "aktuell bearbeitet". 1000ms ist viel zu kurz für eine Anfrage Timeout. Probier etwas Sinnvolles wie zehn Sekunden. – EJP

+0

@maybeg Ich habe nicht, weil die Dokku Jungs mir gesagt haben, dass sie keine Netzwerk-Dinge berühren. Ich werde das später versuchen. – jomo

Antwort

3

Es könnte aufgrund des Docker Userland-Proxy sein. Wenn Sie eine neuere Version von Docker ausführen, versuchen Sie, den Daemon mit der Option --userland-proxy=false auszuführen. Dies bewirkt, dass Docker Port-Forwarding mit nur iptables ausführt und weniger Overhead hat.

+0

Ich habe das gerade versucht, es scheint keinen Unterschied zu machen. – jomo

+0

@jomo, in diesem Fall könnte es eine Kernel-Konfiguration sein. Vielleicht könnte diese SO Frage/Antwort Ihnen etwas geben, um in http://stackoverflow.com/questions/410616/increasing-the-maximum-number-of-tcp-ip-connections-in-linux –

+0

das ist, was wir zunächst dachte, war das Problem, aber es würde nicht erklären, warum es außerhalb Docker (wo wir hatten tatsächlich mehr Verbindungen als in Docker) – jomo

Verwandte Themen