Forum: PC Hard- und Software UDP-Kommunikation bricht immer mal wieder zusammen?


von Frank (Gast)


Lesenswert?

Ein Online-Datenerfassungssystem besteht aus ca. 30 "echten" Client-PCs 
(Win XP Embedded) und einer Server-Applikation, die unter Windows 2003 
Server auf einer VM läuft.
Dieses System arbeitet rund um die Uhr. Die Clients bauen nur sporadisch 
(alle par Minuten) eine "gehandshakte" UDP-Verbindung auf und senden 
oder lesen einige hundert Bytes.

Nun passiert es seit ca. 14 Tagen so aller 2...3 Tage, das die 
Kommunikation zwischen den Clients und dem Server komplett versagt, so 
als ob plötzlich kein UDP mehr transportiert würde. Ein Zusammenhang zu 
bestimmten Benutzeraktionen kann (bisher) nicht entdeckt werden. Nach 
mehreren (!) Neustarts der Serverapplikation gehts dann immer wieder. Es 
gab die letzten zwei Monate kein Update der Server-Applikation, so dass 
versehentlich eingabute Programmfehler eher unwahrscheinlich sind. Es 
hat den Anschein, als ob irgendwelche Puffer vollaufen, bis dann Nichts 
mehr geht. Als Anwendungsentwickler habe ich nicht so den tiefen 
Einblick in die Windows-Innereien.

Ist irgenjemandem etwas bekannt, dass UDP-Kommunikation mit VMs oder 
nach einem der jüngsten Windows-Updates irgendwie gestört ist? Der Admin 
und ich - wir versichern uns inzwischen gegenseitig in immer harscher 
werdendem Ton, dass wir Nichts geändert hätten. Vor dieser Zeit lief die 
Anwendung mehrere Wochen störungsfrei ...

von __tom (Gast)


Lesenswert?

udp verbindungen sind per definition keine sicheren verbindungen. d.h. 
es gibt weder eine garantie das die daten ankommen, noch das daten, die 
ankommen, richtig sind, noch das der sender eine nachricht über das 
nicht ankommen bekommt. möchtest du all das haben, dann musst du zu tcp 
wechseln.

von Klaus (Gast)


Lesenswert?

__tom schrieb:
> noch das daten, die
> ankommen, richtig sind,

Wenn Daten ankommen, sind sie immer richtig, Ethernetframes haben ein 
CRC, UDP selbst meistens auch noch. Fehlerhafte Frames verwirft der 
Stack. Die Reihenfolge kann aber falsch sein, wenn mehrere Wege durch 
das Netz möglich sind. Das ab und zu UDP Frames verloren gehen, ist 
normal. Zu viele verlorene Frames können auf Überlastungen in einem 
Switch hindeuten.

MfG Klaus

von Peter II (Gast)


Lesenswert?

schau mal mit netstat -a -n oder im Taskmanager bei den Handels nach ob 
eventuell die Port nicht richtig geschlossen werden. Nicht das Windows 
die Handls ausgehen.

von Rolf (Gast)


Lesenswert?

Klaus schrieb:
> Wenn Daten ankommen, sind sie immer richtig,

Aus Interesse würde ich mal ping -t auf das Ziel einige Zeit laufen 
lassen um offensichtliche Paketverluste zu sehen.

von Klaus (Gast)


Lesenswert?

Rolf schrieb:
> Klaus schrieb:
>> Wenn Daten ankommen, sind sie immer richtig,
>
> Aus Interesse würde ich mal ping -t auf das Ziel einige Zeit laufen
> lassen um offensichtliche Paketverluste zu sehen.

Was mir gerade noch einfällt: wenn das Netz stark gestört ist, ich meine 
hier physikalisch, und damit viele Frames fehlerhaft sind, merkt man das 
bei UDP nicht, es sieht dann so aus, als ob es unterbrochen ist. Die 
fehlerhaften Frames werden ja schon im Stack verworfen. Wireshark kann 
das Interface im promiscuous mode betreiben und sollte die Frames 
trotzdem zeigen. Man könnte wireshark also eine Weile parallel zu Server 
betreiben und sehen ob man so eine Ursache findet.

MfG Klaus

von (prx) A. K. (prx)


Lesenswert?

Klaus schrieb:

> Was mir gerade noch einfällt: wenn das Netz stark gestört ist, ich meine
> hier physikalisch, und damit viele Frames fehlerhaft sind

Gemanagten Switch fragen, der führt Statistik über sowas. Evtl. auch 
entsprechende Support-Software / erweiterter Treiber vom PC-Adapter.

von Frank E. (Firma: Q3) (qualidat)


Lesenswert?

Im Eingangs-Posting schrieb ich ja nicht aus Spaß von "gehandshaktem" 
UDP. Ich habe ein simples Protokoll implementiert, dass normalerweise 
den Datenfluss recht zverlässig steuert. Gehen Datagramme verloren, 
werden sie bei Ausbleiben der Quittung wiederholt - DAS ist nicht das 
Problem.

Das Problem ist, dass die UDP-Kommunikation nach einiger Zeit komplett 
abstirbt, so als hätte jemand eine Firewall eingeschaltet, die genau das 
tut: UDP unterbinden. Würden einfach nur Datagramme verloren gehen, 
selbst wenn es 90% wären, würde die Kommunikation langsam weiterlaufen, 
evtl. immer schleppender werden, aber nicht von einem Moment auf den 
anderen vollkommen blockieren ...

Andere Protokolle, z.B. RDP oder VNC für den Zugriff auf diesen Server 
laufen dagegen ungestört weiter.

von Klaus (Gast)


Lesenswert?

Frank Esselbach schrieb:
> Gehen Datagramme verloren,
> werden sie bei Ausbleiben der Quittung wiederholt - DAS ist nicht das
> Problem.

Versuch herauszufinden, was verloren geht. Es können die Datagramme 
verloren gehen -> keine Quittung, Wiederholung geht verloren, ...
oder Datagram kommt an, Quittung geht verloren, Wiederholung ...

Damit kannst du das Problem eingrenzen. Ich würde auf jeden Fall einen 
Monitor wie wireshark auf dem Server mitlaufen lassen. Wenn das nicht 
geht, könnte man den Port des Switches, an dem der Server hängt, auf 
einen anderen Port spiegeln, und dort einen Monitor mitlaufen lassen. Im 
jetzigen Zustand hast du zuviele Spieler in deinem System.

Auch der Hinweis von Peter II bezügl. der Handels könnte hilfreich sein.

Ich bin eigentlich ein UDP Fan. Leider hilft einem die socket library 
dabei nicht sehr. Bei manchen Stacks bekommt man einen send positiv 
quittiert, obwohl das Interface down ist.

MfG Klaus

von JojoS (Gast)


Lesenswert?

ich würde auch auf ein Resourcen Problem tippen und erstmal mit 
Boardmitteln kontrollieren. Im Taskmanager dazu die Spalten priv. 
Arbeitsspeicher, EA Bytes, Threads, Handles usw. aktivieren. Vielleicht 
lief die App früher vermeintlich besser weil mehr Speicher 
(Auslagerungsspeicher) vorhanden war? Windows Eventlogs kontrollieren 
sollte auch Routine sein.

von __tom (Gast)


Lesenswert?

Frank Esselbach schrieb:
> aber nicht von einem Moment auf den
> anderen vollkommen blockieren

wenn du die möglichkeit hast, dann mit einem netzwerksniffer (tcpdump, 
wireshark) lauschen ob die pakete überhaupt am server ankommen. es gibt 
auch ping-tools die anstatt icmp nachrichten udp pakete verwenden.

wenn vorhanden, virenkiller testweise abschalten, das hatte ich schon 
bei 2 kunden das der virenwächter der meinung war er müsse wahllos 
verbindungen beenden (waren allerdings tcp connects).

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Frank Esselbach schrieb:
> Ich habe ein simples Protokoll implementiert, dass normalerweise
> den Datenfluss recht zverlässig steuert.

Ah, du hast TCP neu erfunden. ;-)  Neugierig: warum denn eigentlich?

von oszi40 (Gast)


Lesenswert?

Schon mal andere Netzwerkkarte und neues Kabel probiert? In einem von 
100 ganz dummen Fällen hat das auch schon geholfen.

von Peter II (Gast)


Lesenswert?

oszi40 schrieb:
> Schon mal andere Netzwerkkarte und neues Kabel probiert? In einem von
> 100 ganz dummen Fällen hat das auch schon geholfen.

sehr unwarscheinlich, es soll ja nach neustart der anwendung wieder 
gehen. Davon bekommt der Treiber und die Netwerkkarte aber nichts mit.

Wird wohl ein normaler Softwarefehler in der Anwendung sein.

von Klaus (Gast)


Lesenswert?

Jörg Wunsch schrieb:
> Ah, du hast TCP neu erfunden. ;-)  Neugierig: warum denn eigentlich?

Ich weiß nicht, was Frank motiviert hat, das so zu lösen. Ich hab was 
ähnliches gebaut aus folgenden Gründen:

UDP ist message orientiert, TCP stream. Bei TCP muß ich den Anfang und 
das Ende einer Nachricht aus dem Inhalt entnehmen, und muß damit 
rechnen, daß die Nachricht fragmentiert ist.

Wenn der Client eigene Aufgaben hat ist es einfacher, eine Message 
abzuschicken, ein Flag für "Quittung ist noch offen" zu setzen, und 
weiterzumachen. Bei TCP kann ein (erfolgloser) Verbindungsaufbau lange 
dauern (2 bis 3 stelliger Sekundenbereich). Damit der Client 
weiterarbeiten kann, muß die TCP Connection in einem eigenen Thread 
(oder Task) laufen, sonst blockiert der Client. Bei Problemen kann ein 
Socket auch schon mal minutenlang blockiert sein.

Beim Server ist es ähnlich. Wenn ich mit 30 Clients rechne, muß ich den 
Server entweder 30 mal starten (oder mich von sowas wie inetd starten 
lassen). Dann wirds aber mit gemeinsamen Daten problematisch. Oder ich 
ermögliche 30 Threads innerhalb des Servers, mit allen Konsequenzen bei 
der Datensynchronisation. UDP ist da viel einfacher. Der Stack 
serialisiert die Messages für mich. Sie sind nie fragmentiert (auf der 
Leitung möglicherweise, aber nicht am Socket). Ich kann sie bearbeiten 
und direkt dem Absender quitieren.

Dies waren einige meiner Überlegungen, UDP gegenüber TCP den Vorzug zu 
geben.

MfG Klaus

von Frank E. (Firma: Q3) (qualidat)


Lesenswert?

Jörg Wunsch schrieb:
> Ah, du hast TCP neu erfunden. ;-)  Neugierig: warum denn eigentlich?

"Stehende" TCP-Verbindungen brauchen eine Menge Resourcen auf der 
Serverseite und wie bereits bemerkt, führen Verbindungs-Störungen zu 
hässlichen Hängern. Mit meiner UDP-Klasse landen (im Normalfall) alle 
eingehenden Messages schön in einer Warteschlange, von der sie in Ruhe 
gelesen und nach und nach abgearbeitet und beantwortet werden können.

Es gibt zwei Arten von Messages, die Kommunikation wird immer vom Client 
ausgelöst. Entweder will dieser etwas vom Server wissen, dann ist die 
Antwort der Handshake. Will er etwas auf dem Server schreiben, wartet 
der Client auf ein simples "OK" als Antwort. Nicht beantwortete Messages 
werden nach ca. 10 Sekunden vom Client wiederholt. Bei 
Lese-Anforderungen ist das nicht weiter schlimm. Damit Schreib-Aufräge 
aber nicht mehrfach ausgeführt werden, hat jede Message eine Nummer, die 
sich der Server merkt, sobald er sie ausführt. Kommt die selbe 
Aufforderung (mit der gleichen Nummer) nochmal beim Server an, gibts als 
Antwort nur ein "OK", ohne sie nochmal auszuführen ...

Mein System arbeitet auch unter Stress bis zu mehreren Tagen 
einwandfrei, um dann plötzlich irgendwann "durchzudrehen". Ein simpler 
Programmierfehler sollte sich eigentlich wesentlich früher zeigen. Der 
Fehler ist entweder extrem exotisch oder es sind eben Fremdeinflüsse, 
die ich noch nicht erkannt habe.

Ich habe sowohl Server als auch Client über mehrere Stunden mit dem 
Taskmanager beobachtet, ohne Auffälligkeiten zu bemerken. Weder steigt 
der Speicherbedarf kontinuierlich an, noch die Zahl der Handles. Die 
Server-Applikation benötigt z.B. ca. 30 MB und belegt konstant um die 
150 Handles.

Netzwerktools installieren und Konfigurationen an den Switches vornehmen 
ist etwas kompliziert, weil ich derzeit nur über RDP Zugriff habe.

von Simon H. (simi)


Lesenswert?

Mach mal auf Deiner Maschine, auf der der Server läuft, einen 
Email-Client oder irgendwas anderes rein, das Verbindungen nach aussen 
öffnet.

Ich ärgere mich mit einem Zyxel VDSL-Router rum, bei dem man ab und zu 
(spätestens nach 1-3 Tagen) die Leitung so von innen "durchblasen" muss, 
damit bestehne NATings erhalten bleiben. Dies muss durch den selben Host 
geschehen, für den das NATing stattfindet. Ist ein FW-Bug.

Schau mal im Log nach, was der Router zu den verlorenen Paketen meint.

von Peter II (Gast)


Lesenswert?

Klaus schrieb:
> Beim Server ist es ähnlich. Wenn ich mit 30 Clients rechne, muß ich den
> Server entweder 30 mal starten (oder mich von sowas wie inetd starten
> lassen). Dann wirds aber mit gemeinsamen Daten problematisch. Oder ich
> ermögliche 30 Threads innerhalb des Servers, mit allen Konsequenzen bei
> der Datensynchronisation.

nein, man kann ohne Problem 30 server sockets in einen Thread 
bearbeitet. dafür. Man kann TCP auch non-blocket benutzten!

von Klaus (Gast)


Lesenswert?

Peter II schrieb:
> nein, man kann ohne Problem 30 server sockets in einen Thread
> bearbeitet. dafür. Man kann TCP auch non-blocket benutzten!

Einen Code der mit 30 Connections in den verschiedensten Zuständen 
gleichzeitig jongliert möchte ich nicht debuggen.

MfG Klaus

von Peter II (Gast)


Lesenswert?

Klaus schrieb:
> Einen Code der mit 30 Connections in den verschiedensten Zuständen
> gleichzeitig jongliert möchte ich nicht debuggen.

wo ist der unteschied ob man es in 30 Threads oder in einem macht? Für 
jede verbindung legt man sich eine Struktur oder ein Objekt an und 
fertig.

Schwer wird es nur wenn man dinge machen muss die blockierend sind, dann 
geht auf allen verbindungen nichts mehr. Aber das Problem gibt es bei 
UDP mit einen Thread genauso.

von oszi40 (Gast)


Lesenswert?

Frank schrieb:
> Nach mehreren (!) Neustarts der Serverapplikation gehts dann

net statistics -?

Wäre auch mal zu prüfen, ob das Übel nur zu bestimmen Zeiten auftritt, 
um so den Fehler einzukreisen. Evtl. ist irgendwo eine neue Maschine 
aufgetaucht, die Störungen im LAN verursacht?

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Frank Esselbach schrieb:

> "Stehende" TCP-Verbindungen brauchen eine Menge Resourcen auf der
> Serverseite und wie bereits bemerkt, führen Verbindungs-Störungen zu
> hässlichen Hängern.

Nun ja.  Aktuell debuggst du aber gerade UDP-Hänger. ;-)  Das allein
widerspricht dem bereits.

So ähnlich wie du hat NFS anfangs auch argumentiert.  Die sind schon
vor 10 Jahren davon abgekommen und benutzen seither TCP, weil es
sinnvoller ist, dass sich gut ausgefeilte und über Jahrzehnte
etablierte Algorithmen darum kümmern, die Daten auch unter schwierigen
Bedingungen auszuliefern, anstatt vergleichbare Algorithmen in jeder
Applikation aufs Neue implementieren zu wollen.

Ich würde mal behaupten, dass du bei TCP erst in Probleme laufen
würdest bei einer Verbindungsqualität, bei der deine UDP-Implementierung
sowieso schon am Verzweifeln wäre.

Dinge wie ein Timeout bei Verbindungsaufnahme sollten in einem modernen
TCP-Stack einstellbar sein.

von Klaus (Gast)


Lesenswert?

Peter II schrieb:
> wo ist der unteschied ob man es in 30 Threads oder in einem macht? Für
> jede verbindung legt man sich eine Struktur oder ein Objekt an und
> fertig.

Da man non blocking arbeiten muß, muß man dann alle pollen, mit allen 
Konsequenzen. Wenn man das dann fertig entworfen hat, hat man eigentlich 
Threads neu erfunden. Da nehm ich doch lieber die von anderen schon 
verifizierten Threadfunktionen.

Peter II schrieb:
> Aber das Problem gibt es bei
> UDP mit einen Thread genauso.

Da UDP Verbindungslos ist, geht das so wie du beschrieben hast, 
Struktur/Objekt pro Client, alles non blocking.

Der klassische TCP-Server, der HTTP Server lief früher als eine Task pro 
Connection und ließ sich via inetd vielfach starten. Später ging man 
dazu über, inetd außen vor zu lassen. IMHO ist die aktuelle Strategie 
bis zu einer gewissen Anzahl von Verbindungen Threads zu verwenden, und 
wenn mehr gebraucht wird, eine weitere Task zu starten.

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

UDP kann dennoch nützlich sein wenn man ein Broadcast realisieren will, 
ich benutz dafür ganz gerne JGroups.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Läubi .. schrieb:
> UDP kann dennoch nützlich sein wenn man ein Broadcast realisieren will,

Ja, aber das ist so fast der einzige Fall, bei dem es wirklich noch
Sinn hat.  Oder, wenn man in kurzer Zeit viele verschiedene Server
nach ein und demselben Fragen will (DNS), oder wenn es tatsächlich
auf ein möglichst exaktes Timing ankommt (NTP).  Selbst bei DNS
werden aber Antworten, die die Größe eines Antwortpakets übersteigen,
per TCP abgeholt (weil man an dieser Stelle ja bereits einen Server
kennt, von dem man weiß, dass er gewillt ist, die Daten zu liefern).

Das sind so die einzigen UDP-basierten Protokolle, die mir auf Anhieb
einfallen.  Ach ja, multicast-basierte Dinge natürlich noch, bei
denen das "Streamen" der Daten wichtiger ist als die Integrität.

von Klaus (Gast)


Lesenswert?

Sowie alle Echtzeitprotokolle wie VoIP aka RTP und (außer bei MS) SIP 
und NFS ...

MfG Klaus

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Klaus schrieb:
> Sowie alle Echtzeitprotokolle wie VoIP aka RTP

Ja, da ist das Zeitverhalten kritischer als die Datenintegrität.  Wenn
ein Paket weg ist, ist es weg, es nützt ohnehin nichts, wenn es erst
3 s später nachgeliefert wird.

> und (außer bei MS) SIP

Für das reine signalling gibt's eigentlich keinen Grund, UDP zu
benutzen.  Folgerichtig ist SIP auch auf beiden genormt.

> und NFS ...

Nein, siehe oben.  Das war vor 10 Jahren.  Heutzutage wird NFS
standardmäßig über TCP erledigt.

von Sven P. (Gast)


Lesenswert?

Also wieder so ein Fall von 'Ich kann keine Zustandsautomaten 
programmieren'?

Irgendwer hatte schon vor Jahrzehnten mal gesagt: Niemand braucht 
Threads. Threads sind für Leute, die keine Zustandsautomaten bauen 
können. Und er hatte Recht ;-)

In der Tat wird UDP aber gerade wieder ganz stark ausgegraben für 
Multicast und Streaming. Da aber hauptsächlich, um Protokolloverhead zu 
sparen und weil es beim Streaming ohnehin witzlos ist, Pakete erneut 
anzufordern. Wenn im Echtzeit-Stream ein Päckchen fehlt, ruckelts oder 
knallts halt gerne.

Wegen der stehenden Verbindungen: Oft geht man da mehrspurig heran. 
Apache lässt z.B. mit prefork mal eine Reihe von Prozessen vom Stapel, 
die dann auf Verbindungen warten. Mit worker macht er genau das: Eine 
Handvoll Prozesse, jeweils mit vielen Threads.

von Peter II (Gast)


Lesenswert?

Sven P. schrieb:
> Irgendwer hatte schon vor Jahrzehnten mal gesagt: Niemand braucht
> Threads. Threads sind für Leute, die keine Zustandsautomaten bauen
> können. Und er hatte Recht ;-)
ich habe beides schon gemacht, da aber heute fast jeders notebook schon 
4CPUs hat, kann man mit Threads mehr leistungs rausholen. Auf eine 
Single-Core ist die Lösung mit nur einen Threads sogar schneller weil es 
weniger Taskwechsel gibt,

von Sven P. (Gast)


Lesenswert?

Das ist vollkommen korrekt, fällt aber für meine Begriffe in die 
MPM-Kiste.

Der OT schrob oben:
- ...ca. 30 "echten" Client-PCs
- ...(Win XP Embedded)
- ...(alle par Minuten)
- ...oder lesen einige hundert Bytes.

All das spricht irgendwie aber gegen MPM, viel Leistung und so weiter. 
Da würde vermutlich mehr Leistung bei der Threadverwaltung und beim 
synchronisieren der Speicherzugriffe flöten gehen, als durch 
Mehrkernauslastung gewonnen wäre.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Sven P. schrieb:
> Irgendwer hatte schon vor Jahrzehnten mal gesagt: Niemand braucht
> Threads. Threads sind für Leute, die keine Zustandsautomaten bauen
> können. Und er hatte Recht ;-)

Naja, und außerdem sind sie was für Betriebssysteme, deren Prozess-
wechselgeschwindigkeit eher an Schildkröten denn Gazellen erinnert.
;-)

Wenn Frank bei der bestehenden UDP-Lösung bleiben will/muss, dann
wird wohl um ausgedehnte Sitzungen mit wireshark & Co. auf beiden
Seiten kein Weg drumrum führen.  Allerdings wird wohl die Auswertung
der Suche einer Nadel im Heuhaufen gleichen.

Gut synchronisierte Uhren auf beiden Seiten können bei der Auswertung
recht hülfreich sein.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.