Linux UDP-max die Größe des empfangspuffers
Was ist die maximale grösse des Linux-UDP-receive-buffer? Ich dachte, es ist begrenzt nur durch den verfügbaren RAM, aber wenn ich den
5GB für rmem_max:
echo 5000000000 > /proc/sys/net/core/rmem_max
und 4GB für die aktuellen socket-buffer (in Erlang):
gen_udp:listen(Port, [{recbuf, 4000000000}])
Wenn ich die Maßnahme den Puffer-Auslastung zeigt es:
# netstat -u6anp | grep 5050
udp6 1409995136 0 :::5050 :::* 13483/beam.smp
Kann ich nicht mehr als das 1,4 GB. Für kleinere Puffer-Größen, wie z.B. 500MB, tatsächliche Puffergröße entsprachen den eingestellten Wert. Mein system ist Debian 6.0, die Maschine hat 50 GB RAM zur Verfügung.
- Wo tut es sagen, es ist begrenzt nur durch den verfügbaren RAM? Und warum denkst du, du brauchst eine 4GB-Puffer?
- Tut es das nicht. Es nicht sagen, es ist begrenzt in irgendeiner anderen Art und Weise. Ich brauche so einen Puffer, um Datenverluste zu vermeiden während mehr Netzwerk-traffic peek.
- Im Gegenteil. Es sagt dem kernel, können Sie den Wert einstellen, den Sie liefern nach oben oder unten, und berät Sie zu nennen
getsockopt()
um zu sehen, was Wert war tatsächlich zugewiesen ist. Ich finde es schwer zu glauben, Sie brauchen, 4GB verarbeiten Hauptverkehrszeiten. Wahrscheinlich sollte man einfach schneller Lesen. - "Es sagt, kann der kernel und passen Sie den Wert, den Sie liefern nach oben oder unten" wo hast du diese Informationen? Wie kann man schneller Lesen als "while(true){recv(Socket)}" innerhalb eines Threads? Ich bin Drop-Pakete nach dem Empfang für die test ' s sake. Ich bin in der Lage zu Lesen 60000 600B-sized-Pakete pro Sekunde, während es kein problem zu generieren 200000/s Datenverkehr. Unter diesen Bedingungen ist der Puffer füllt nach 16 Sekunden. Man kann nicht Objektiv sagen, dass der 10s ist ein Blick, aber der 20er Jahre nicht. Ich würde eher erwarten, dass mit einer besseren Maschine, die ich bin in der Lage, länger zu überleben peek.
- Ich habe gelesen, dass die Anweisung in man-pages für über 20 Jahre. Es ist für Sie nichts neues. Wie Sie wissen, sind Sie fallenlassen der Pakete an den Empfänger?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Scheint es, dass es ein limit in linux.
Ich habe versucht Einstellung rmem_max auf 2^32-1-mit Erfolg.
2^32 war zu viel:
Einstellung Erträge 5000000000:
Habe ich getestet in python, das die Einstellung und erste socket receive-Puffer mit
Wenn 'bufferSize' ist weniger als 1024^3 Programm druckt verdoppelt 'bufferSize', sonst fällt es wieder auf 256.
Den Wert 705032704*2 = 1410065408 ist in der Nähe der 1409995136 erhalten, indem Sie den Befehl netstat.
2^32-1 (2147483647, maximale 32-bit signed integer)
Echo in der
/proc
Dateisystem scheint überlauf, wenn Sie versuchen, größere Werte.