2014-10-16 7 views
14

Ich und ein paar andere Entwickler haben einen AI-Wettbewerb. Grundsätzlich haben wir ein einfaches Brettspiel und wir haben jeweils KIs geschrieben, die auf unseren eigenen Webservices gehostet werden, um gegeneinander zu spielen.Ist Azure Throttling My WebApi?

Ich habe eine und läuft, das ist ein einfacher WebApi 2-basierter Dienst, der in Azure veröffentlicht wird. Meine Erwartung ist, dass es die meiste Zeit ruhig sein wird, und dann plötzlich, wenn ein Spiel beginnt, wird es sehr schnell 200-400 Anfragen bekommen (ein Spiel kann nur ein paar Sekunden dauern). Der Spieleserver und die KI kommunizieren mit normalen JSON POSTs.

Mein Problem ist, Azure scheint die Anforderungen zu drosseln. Die ersten paar Züge passieren sehr schnell und dann wird alles langsamer.

Ich frage mich, ob Azure denkt, dass es eine mögliche DOS-Attacke oder etwas ist. Es kann eine Sekunde dauern, um einen Schritt zurückzukommen, wenn die Dinge langsamer werden. Ein paar Punkte von Interesse:

  • Dies passiert nie, wenn lokal gehostet wird.
  • Es gibt keine Datenbank.
  • Es passiert sogar mit einer einfachen Test-KI, die nur Teile zufällig bewegt (also keine Rechenlast)
  • Es passiert, wenn der Spiel-Host auch auf Azure bereitgestellt wird (so sind es zwei Azure-Websites miteinander zu sprechen).

Also, wie kann ich das beheben? Gibt es eine Einstellung irgendwo, wo ich vermisse, wo ich Azure sagen kann, dass diese Art von Verhalten erwartet wird? Ich habe es derzeit als Shared Service, aber ich testete es als ein Basic-Dienst zuvor mit zwei Instanzen, und ich sah immer noch die Verlangsamung.

+0

Welcher Azure-Plan ist das? – usr

+0

Ich habe es sowohl als Shared als auch als Basic Plan ausprobiert. Beim Testen als Basic versuchte ich auch, die Instanznummer auf 2 zu setzen. Es schien nicht zu helfen. – Pharylon

+2

Dieser Link kann für Sie von Nutzen sein: http://stackoverflow.com/questions/7849884/what-is-limiting-the-of-simultaneous-connections-my-asp-net-application-can-ma – Shay

Antwort

2

Das Problem war die Anzahl der gleichzeitigen Verbindungen erlaubt. Der Client war sehr schlampig und stellte für jede Anfrage eine neue Verbindung her. Dadurch wurde die Anzahl der Verbindungen überschritten.Es hätte wie in this answer gelöst werden können (wie Shay in den Kommentaren darauf hingewiesen hat, ich wünschte, ich könnte einen Kommentar als die richtige Antwort markieren!). Da ich aber auch Zugriff auf den Client-Code habe, habe ich ihn dort behoben.

2

Ja, Sie könnten gedrosselt werden, wenn Sie auf Free oder Shared Plan waren. Mit kostenlosem Plan erhalten Sie 60 Minuten CPU-Zeit pro Tag und mit Shared erhalten Sie 240 Minuten CPU-Zeit pro Tag.

Auch die maximale durchschnittliche Speichernutzung (pro Stunde) für eine gemeinsam genutzte Website beträgt 1 GB. Aber ich nehme an, Sie hätten Ihren Code bereits für Speicherlecks profiliert.

Es gibt Beschränkungen für Websockets, aber ich bin mir nicht sicher, ob es ein allgemeines TCP-Verbindungslimit ist.

Here ist der Link für die Grenzen.

Ich denke, Grundplan sollte Ihnen vorhersehbare Leistung geben, aber es Kleine Instanz im Grundplan ist nur 1,6 GHz CPU, die wahrscheinlich weit weniger CPU und Cores als Ihre lokale Maschine sein wird.

Ich denke, Standard-A2-Größe Cloud-Service-Web-Rolle (2 Kerne) könnte besser geeignet sein als eine Website. Abhängig von Ihrem Code (wenn sie in der Lage sind, den größten Teil der CPU zu nutzen und Aufgaben zwischen Rollen zu verteilen), würden sogar mehrere A0-Instanzen viel mehr empfohlen.

Für einen fairen Wettbewerb, haben Sie möglicherweise CPU-Beschränkung, es ist sehr interessant.

die besten All und kann den besten Code-Sieg :)