Beste Weg, um erzeugen Millionen tcp-Verbindung
Brauche ich, um eine beste Weg, um erzeugen eine Millionen tcp-verbindungen. (Mehr ist gut,weniger ist schlecht). So schnell wie möglich machinely 😀
Warum brauche ich diese ? Ich Teste eine nat, und ich möchte, um es zu laden mit so vielen Einträgen wie möglich.
Meine aktuelle Methode ist die Erzeugung eines Subnetzes auf eine dummy-eth und Seriell schließen Sie aus, dass der dummy zum eigentlichen eth-lan-nat zum host.
subnetnicfake----routeToRealEth----RealEth---cable---lan----nat---host.
|<-------------on my machine-------------------->|
- Eine million gleichzeitige verbindungen?
- haben Sie versucht, die
iperf
tool? - ich weiß nicht, wie iperf würde in diesem Fall helfen ?
- haben Sie versucht, EchoServerTest lenholgate.com/blog/2005/11/... ?
- ich war in der Lage, erhalten bis zu 600k wenn ich mich richtig erinnere. Ich hatte 2 laptops, dies zu tun. Der trick war, um reduzieren Sie die Größe des Puffers, cwnd-Größe und wscale etc für die TCP proto.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Einer Millionen gleichzeitigen TCP-Sitzungen könnte schwierig werden: Wenn Sie verlassen sich auf standard -
connect(2)
sockets-API zu erstellen, die Funktionen, die Sie ein viel physikalischer Speicher: jede Sitzung erfordert einestruct inet_sock
umfasst einestruct sock
umfasst einestruct sock_common
.Ich schnell erraten Größen:
struct sock_common
erfordert etwa 58 bytes.struct sock
benötigt ungefähr 278 bytes.struct inet_sock
benötigt ungefähr 70 bytes.Ist 387 MByte Daten , bevor Sie senden und empfangen Puffer. (Siehe
tcp_mem
,tcp_rmem
,tcp_wmem
imtcp(7)
für einige Informationen).Wenn Sie sich entscheiden diesen Weg zu gehen, würde ich vorschlagen, Einstellung der pro-socket Speicher steuert, so niedrig, wie Sie gehen. Ich wäre nicht überrascht, wenn 4096 ist die niedrigste können Sie es. (
SK_MEM_QUANTUM
istPAGE_SIZE
, gespeichert insysctl_tcp_rmem[0]
undsysctl_tcp_wmem[0]
.)Dass die anderen acht Gigabyte Speicher-vier für receive-Puffer, vier für den Sendepuffer.
... Und das ist zusätzlich zu dem, was das system benötigt für Ihre Programme zu öffnen, die eine million Datei-Deskriptoren. (Siehe
/proc/sys/fs/file-max
improc(5)
.)Alle dieser Speicher ist nicht-Swap - -- die kernel-pins seinem Gedächtnis-so sind Sie wirklich nur an dieses problem auf einem 64-bit-Maschine mit mindestens acht Gigabyte Speicher. Wahrscheinlich 10-12 würde es besser machen.
Einem Ansatz, den die Paketto Keiretsu-tools ist zu öffnen Sie eine raw-Verbindung führen Sie alle TCP-drei-Wege-handshakes mit einer einzelnen raw-socket, und versuchen zu berechnen, was nötig ist, anstatt zu speichern, zu handhaben, wesentlich größere Datenmengen als üblich. Versuchen, zu speichern so wenig wie möglich für jede Verbindung und auch nicht mit naiven Listen, Bäume oder Strukturen.
Den Paketto Keiretsu-tools wurden zuletzt aktualisiert um 2003, so dass Sie möglicherweise noch nicht die Waage in die Millionen reichen auch, aber Sie würde auf jeden Fall mein Ausgangspunkt, wenn das mein problem zu lösen.
Haben Sie versucht, mit tcpreplay? Sie bereiten könnte - oder capture - ein oder mehrere PCAP-Netzwerk-capture-Dateien mit dem traffic, den Sie brauchen, und eine oder mehrere Instanzen von tcpreplay wiedergeben zu stress-testen Sie Ihre firewall/NAT.
Nach der Suche nach vielen Tagen, fand ich das problem. Anscheinend ist dieses problem gut überlegt und es sein sollte ,da es so sehr basic. Das problem war, ich wusste noch nicht, was dieses problem genannt werden sollte . Unter know-ers, ist es offenbar genannt als c10k problem. Was ich wollte ist c1m problem. Aber es scheint einige Mühe gemacht zu bekommen C500k . oder Gleichzeitige 500k verbindungen.
http://www.kegel.com/c10k.html UND
http://urbanairship.com/blog/2010/09/29/linux-kernel-tuning-for-c500k/
@deadalnix.
Lesen, oben links ,zu erleuchten und sich selbst.
solange Sie 65536 port im TCP, das ist unmöglich zu erreichen, es sei denn, Sie haben eine Armee von Server zu verbinden.
So, dann, was ist der beste Weg ? Öffnen Sie einfach, wie viele Verbindung, wie Sie können auf Servern und sehen, was passiert.
bind(2)
,listen(2)
undaccept(2)
auf alle 64k ports. Vielleicht haben einige NAT-Systeme wird auseinander fallen, wenn dies betonte weit (siehe meine Erinnerung Berechnungen an anderer Stelle), aber das ist Teil dessen, was das testen der NAT-system ist. 🙂