Socket reconnect langsam
Benne
- perl
Hallo,
ich habe ein kleines Benchmark Skript für einen Dienst auf meinem Server geschrieben. Dieses empfängt zunächst den hello vom Server und gibt ihn aus. Danach sendet es 100 newline-terminierte Zeichenketten
Allerdings ist der Reconnect sehr langsam. (ca. 1s pro Schleife)
Lasse ich das Perl Skript nach jedem Schleifendurchgang beendet und starte es wieder neu, so geht der Reconnect rasant schnell:
while [ 1 ]; do ./test.pl; done
hier mal der prinzipielle Aufbau:
my $socket;
while(1) {
$socket = IO::Socket::INET->new("$server:$port")
or die "Connection failed. $!\n";
print while(<$socket>);
print $socket "test $_\n" for(0..99);
$socket->close();
}
hat jemand eine Idee woran das liegen könnte?
Danke und Gruß,
Benne
Hallo
ich habe das gleiche Programm eben nochmal in Python geschrieben. Nach einigen Sniffs mit Ethereal habe ich gesehen, dass ich eine neue Verbindung aufgebaut werden sollte, bevor die alte überhaupt richtig geschlossen war. Von der Gegenstelle kam dann irgendwann ein RST das gar nicht so recht reingepasst hat.
Mit diesen Anhaltspunkten habe ich einfach mal einen kurzen sleep (50ms) eingefügt, der genau die beschriebenen Probleme behebt.
Nun habe ich zunächst auch einen sleep in Perl eingefügt. Leider ohne Erfolg. Jetzt habe ich schon voller Verzweiflung diesen Text zur Hälfte geschrieben, als mir plötzlich folgende Idee kam: vielleicht blockt der perl-sleep ja die IO. also könnte man system
sleep 0.2s;
probieren.
Und siehe da: Erfolg!
Ehrlich gesagt hätte ich fast nicht damit gerechnet und ich kann es mir auch jetzt noch nicht bis ins letzte Detali erklären, wo das Problem lag.
Kann mir da jemand auf die Sprünge helfen?
Danke und Gruß,
Benne
Hell-O!
ich habe ein kleines Benchmark Skript für einen Dienst auf meinem Server geschrieben. Dieses empfängt zunächst den hello vom Server und gibt ihn aus. Danach sendet es 100 newline-terminierte Zeichenketten ... Allerdings ist der Reconnect sehr langsam. (ca. 1s pro Schleife)
Welche, die for-Schleife?
$socket = IO::Socket::INET->new("$server:$port")
or die "Connection failed. $!\n";
Sieht ungewöhnlich aus, welche Version von IO::Socket verwendest du? Wie sind die Optionen gesetzt, insbesondere "Proto", "Type" und "Timeout"? Falls es eine etwas antiquierte Version sein sollte, könnte eventuell ein $socket->autoflush(1) helfen (in neueren Versionen ist das IIRC standardmäßig aktiviert).
Mehr fällt mir aber leider auch nicht ein :-)
Siechfred
Hallo,
Welche, die for-Schleife?
der Vorgang Verbinden-Senden-Schließen wird sehr oft wiederholt.
beim Aufbauen der neuen Verbindung gibt es dann eine Verzögerung.
$socket = IO::Socket::INET->new("$server:$port")
or die "Connection failed. $!\n";
Sieht ungewöhnlich aus, welche Version von IO::Socket verwendest du?
ungewöhnlich? vielleicht bist du einfach nicht mit IO::Socket::INET (1) vertraut?
meine Version ist 1.28 (1.30 ist aktuell)
IO::Socket gehört zu den Standard Ein-/Ausgabemodulen ist also bei Perl (bei mir 5.8.7) dabei.
Wie sind die Optionen gesetzt, insbesondere "Proto", "Type" und "Timeout"?
alles default. Siehe (1)
Falls es eine etwas antiquierte Version sein sollte, könnte eventuell ein $socket->autoflush(1) helfen (in neueren Versionen ist das IIRC standardmäßig aktiviert).
ja, flush wird spätestens bei Schließen ausgeführt.
Mehr fällt mir aber leider auch nicht ein :-)
jo, ist ja wie in meinem 2. Posting erwähnt nicht mehr dringend.
Trotzdem danke.
Gruß,
Benne
Welche, die for-Schleife?
der Vorgang Verbinden-Senden-Schließen wird sehr oft wiederholt. beim Aufbauen der neuen Verbindung gibt es dann eine Verzögerung.
Könnte es sein, dass der Server das nicht mag? Schließlich versuchst du innerhalb kürzester Zeit mit der gleichen IP und über den gleichen Port eine Vielzahl von Verbindung aufzubauen. Falls es das sein sollte, hilft dir vielleicht diese Diskussion weiter, die letztlich aber auch zu keinem Ergebnis kommt.
vielleicht bist du einfach nicht mit IO::Socket::INET (1) vertraut?
Ich als Laie kann keinen wesentlichen Unterschied zu dieser Version erkennen.
IO::Socket gehört zu den Standard Ein-/Ausgabemodulen ist also bei Perl (bei mir 5.8.7) dabei.
Ist mir bekannt.
Siechfred