Könnte das Warten auf das Netzwerk Client-Timeouts verursachen?

9

Ich habe einen Server, der Arbeiten ausführt, die von einer Azure-Warteschlange angewiesen werden. Es ist fast immer eine sehr hohe CPU, die mehrere Tasks gleichzeitig ausführt und einige der Tasks verwenden Parallel.ForEach . Während der Ausführung der Aufgaben schreibe ich analytische Ereignisse in eine andere Azure-Warteschlange, indem ich CloudQueue.AddMessageAsync mit await aufrufe.

Ich habe Tausende dieser analytischen Schriften bemerkt, die mit folgendem Fehler versagen:

WebException: The remote server returned an error: (500) Internal Server Error.

Ich habe die Speicherereignisprotokolle von Azure überprüft, und ich habe einen netten Haufen von PutMessage -Befehlen, die endlos 80.000ms benötigen, aber sie benötigen nur 1 ms für Azure selbst. Der HTTP-Statuscode, den ich bekomme, ist 500 und Azure beschreibt den Grund als Client-Timeout.

Was ich denke ist, dass mein Code AddMessageAsync aufruft und ab diesem Zeitpunkt mein Thread freigegeben wird und der Netzwerktreiber die Anfrage sendet und auf eine Antwort wartet. Wenn der Netzwerktreiber eine Antwort erhält, benötigt er einen Thread, um die Antwort zu erhalten, und eine Aufgabe wird geplant, und ruft meine Fortsetzung auf. Da der Server ständig hoch ausgelastet ist, dauert es lange, bis ein Thread abgerufen wird. Der Azure-Server entscheidet, dass dies ein Client-Timeout ist.

Der Code, der azurblau ruft:

%Vor%

Die Ausnahme:

%Vor%

Habe ich recht, warum das passiert? Wenn ja, wäre die Verwendung eines single-threaded Synchronisationskontexts für diesen Anruf besser für mich?

Eine Zeile aus dem Azure-Speicherprotokoll Sie finden Details darüber, was jede Eigenschaft hier bedeutet.

%Vor%

Danke.

    
Moti Azu 31.07.2014, 11:35
quelle

2 Antworten

0

Der Fehler 500 bedeutet, dass der Server eine ungültige Anforderung erhalten hat oder aus verschiedenen anderen Gründen abgestürzt ist. Ich glaube nicht, dass es mit der hohen Belastung Ihrer Fäden zu tun hat. Bitte beachten Sie folgende Maßnahmen:

  • Überprüfen Sie den Namen der Warteschlange, die Sie verwenden. Der Name muss klein geschrieben sein und mit einem Zeichen beginnen. Dies ist ein häufiges Problem, das den Fehler 500 verursacht, ohne dass eine Fehlermeldung vom Server angezeigt wird.
  • Richten Sie die Wiederholungsrichtlinie des Azure Storage SDK-Clients ein, vorzugsweise mit einer Exponential-Wiederholungsrichtlinie.
  • Stellen Sie sicher, dass Sie das neueste Azure Storage SDK verwenden, da das zugrunde liegende Protokoll kürzlich in ein effizienteres geändert wurde.
DrinkBird 06.08.2014 18:04
quelle
0

"Bad Request" ist ein Fehler von 400, kein Fehler von 500 . Ein 500-Fehler weist auf einen Serverfehler hin, daher ist es durchaus sinnvoll, diese Antwort zu erhalten, und viele clientseitige Bibliotheken verwenden einen 500-Fehlercode für ähnliche unerwartete Probleme.

Normalerweise würde eine Client-Timeout-Antwort niemals zum Client gelangen (weil das Zeitlimit überschritten wurde!). Die einzige Situation, die mir einfällt, wo eine Client-Timeout-Antwort den Client erreichen könnte, wäre, wenn die Anfrage mehr als ein einzelnes Netzwerkpaket wäre und der Client zu langsam beim Senden von Paketen nach dem ersten war. Dies könnte leicht durch CPU-Konflikte auf dem Client-Gerät verursacht werden. Ich würde empfehlen, einen Thread mit höherer Priorität zum Abhören von Netzwerkantworten zu verwenden, aber dann die Verarbeitung der Antwort sofort an einen Thread mit normaler Priorität weiterzuleiten. Überlastete CPU verursacht alle Arten von Timeout-Problemen, da der Code den Unterschied zwischen einer Netzwerkantwort, die nicht bald genug eingeht, und der CPU, die den Listener nicht rechtzeitig terminiert, um die Antwort zu empfangen (oder sogar die Anforderung zu senden), nicht erkennen kann. Selbst lokale Festplatten-E / A und Sperren können in diesen Situationen abhängig von der zugrunde liegenden Implementierung Timeouts verursachen.

    
James 14.11.2014 04:33
quelle