Java-Massive-Multiplayer-Game-Server-Skalierbarkeit

Habe ich ein massive-multiplayer-online-Spiel für Android namens Infinite Black:
https://market.android.com/details?id=theinfiniteblack.client

In meiner Naivität, ich hatte erwartet, mäßige Wachstumsrate von über 1.000 Spieler im Monat, und benötigen, um zu verwalten, ~20 live-TCP/IP-clients tops.

Das Spiel hat unerwartet Explosives Wachstum mit über 40.000 neue Nutzer in einer Woche, und durchschnittlich ~300 live-verbindungen auf einmal, und wächst exponentiell.

Server-Architektur besteht aus 2 threads pro Verbindung (blocking read/write), ein ServerSocket-thread, um zu laichen neue Kunden, und einen controller thread, der fragt jedes client für neue Aktionen, gilt es die Spielwelt, dann spült die Daten wieder heraus, wenn Sie fertig.

Den server gebaut wird in Java, die ich bin nicht sehr versiert, insbesondere in einem high-stress-situation wie dieser. C# hat wirklich verwöhnt mich, wenn es um die Speicher-und thread-management.

Auf den Punkt zu bringen.. ich habe gerade bestellt zwei sehr leistungsfähige Systeme, um als dedicated game-Server und wollen zu maximieren der Ressourcennutzung. Viele der Informationen, die auf Java-Ressourcen-Konfiguration erwiesen, die irreführend, unrichtig oder veraltet sind.

Derzeit nutze ich -Xss512k als meine launch-argument, und verstehen, dass diese diktiert stack-Größe, die Zuteilung für jeden thread, den ich aber noch nicht vollständig verstehen alle, die es mit sich bringen kann. Welche tools oder Methoden verfügbar sind, um mir zu sagen, wenn ich bin hinausschießen und skalieren es runter? Was andere BefehlszeilenArgumente sollte ich beachten?

Den neuen Server mit 16gb RAM und i7-2600K Sandy Bridge 3.4 GHz-Prozessoren: Welche Optionen verfügbar sind, in die Konfiguration zu nehmen, so viel Vorteil wie möglich? Mein Ziel ist 1.200 online-Kunden auf einmal pro server (bis zu 2.400 threads).

Welche Art von unerwarteten Fallstricke und Probleme, sollte ich besorgt sein?

Ich gelesen habe, Wild widersprüchliche Geschichten auf maximale Fadenzahl: Werden sich die Dinge auseinander fallen, wenn ich versuche zu drücken bis zu 2.400 aktive threads?

Java scheint nicht, wie es entworfen wurde, für diese Art von Aufgabe. Sollte ich erwägen eine Migration der server auf eine andere Sprache?

Mir läuft der server im debug-Modus von Eclipse während der Entwicklung (igitt..)

Dies ist mein Eclipse .ini-Konfiguration:

--launcher.XXMaxPermSize
256M

-Xms256m

-Xmx1024m

  • Tatsächlich, Java wurde für diese Aufgabe. 🙂
  • Ja, wer würde jemals gedacht, bei der Verwendung von Java für die massiven Server? 😉 Aber das problem ist leider die ganze Lösung - 2threads/user einfach nicht korrekt skaliert, keine Sprache würde helfen.
  • kegel.com/c10k.html, Wie groß moderne TCP-Server, um Zehntausende von TCP-verbindungen
Schreibe einen Kommentar