VServer anmieten?

Übersicht Sonstiges Smalltalk

Neue Antwort erstellen

Mathias-Kwiatkowski

Betreff: VServer anmieten?

BeitragMo, Sep 14, 2015 18:49
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi Leute ich plane wie lang zuvor mein mmo zu realisieren. was mir aufgefallen ist, das mein VServer den ich angemietet habe viel zu wenig leistung hat.

Was habe ich getan?

Mein Server Programm verfügt über 4 Threads ( Das Main Thread und 3 weitere )

Das Main Thread prüft ob ein thread nicht Läuft also if not threadrunning .... dann starte dieses thread
das heisst das das Programm Thread nur prüft sind alle weiteren 3 threads online wenn nicht dann starten

die 3 unter threads
(Game , UDP , TCP)

Game dort werden monster & spieler upgedatet (also bewegung ballern ect.)
UDP ist eben alles das was über udp rein und oder raus geht
TCP ebenso wie udp nur eben für TCP

so das zur erklärung... nun weitere technische daten

ich habe ein VServer (Windows Basierend VCores garantiert 2 , RAM garantiert 2)

so nun zu dem wichtigsten das Server Programm und dessen unter threads laufen auf 20 FPS so wie es soll (waittimer createtimer(20)) funktioniert auch. problem ist je länger der server online ist desto weniger leistung hat er. hier schaut das bild (das sind die schwankungen )

user posted image
( server prog sendet zum client die einzellnen FPS daher wurde das bild vom client erstellt "Server hat keine grafische ausgabe")

die programm game und udp bzw tcp threads schwanken zwischen 2 und 20 fps von jetzt auf gleich

meine frage und für mich nun die wichtigste ist. wie stark muss ein VServer sein um es stabiel am laufen zu halten?
der nächste aufstieg der sich für mich finanziell "lohnt" bzw ich bereit bin auszugeben hat diese "hardware"

VServer Windows 6 Cores garantiert (8 GB Arbeitsspeicher garantiert)
meine frage ist reicht das? oder würde ich damit genauso enttäuscht werden? danke für erfahrung + antworten.
Skype: Anarchie1984
http://projektworks.de/maxbase/
Icq - Erneuert am 21.08.2017
Yahoo - Erneuert am 21.08.2017

Eingeproggt

BeitragMo, Sep 14, 2015 18:58
Antworten mit Zitat
Benutzer-Profile anzeigen
Du hast dein Server-Programm in BMax programmiert?
Damit hab ich leider wenig Erfahrung, aber das geschilderte Problem klingt eher nach einem "Speicherleck", also dass irgendwo zB Stream-Handles nicht mehr sauber gelöscht werden nach Verwendung usw.

In BB gibt es dafür RuntimeStats, wo du kontrollieren kannst dass so ein Leck bei dir nicht auftritt.

mfG, Christoph
Gewinner des BCC 18, 33 und 65 sowie MiniBCC 9

Mathias-Kwiatkowski

BeitragMo, Sep 14, 2015 19:04
Antworten mit Zitat
Benutzer-Profile anzeigen
ja der server ist in blitzmax (darum auch multi TH) problem könnte es sein, habe auch schon drüber nachgedacht

aber wie check ich soetwas in blitzmax?

also was ich mache alle objekte egal ob tcp spieler oder monster sind Type's (objekte) stehen in jeweils dessen liste

Type
global List:Tlist=new tlist

wenn nun jemand offline geht wird dieser spieler aus der liste gelöscht

heisst ( list.remove Player )

reicht das nicht? muss es anders gemacht werden?
Skype: Anarchie1984
http://projektworks.de/maxbase/
Icq - Erneuert am 21.08.2017
Yahoo - Erneuert am 21.08.2017

Silver_Knee

BeitragMo, Sep 14, 2015 20:51
Antworten mit Zitat
Benutzer-Profile anzeigen
Ein Objekt in Bmax stirbt erst wenn die letzte Variable darauf verschwunden ist. Dabei sind zyklische Referenzen zu beachten:

Code: [AUSKLAPPEN]
Type Zyklus
Field ich:Zyklus
End Type

Local z:Zykus=new Zyklus
z.ich=z
z=null


Wenn du so was machst gibt es in dem Zyklus-Objekt selbst noch eine Variable die darauf zeigt und die verhindert dann die Löschung des Objekts.

Um sowas zu erkennen kannst du GCMemAlloced() dir regelmäßig ausgeben lassen. Da sollte dann so ne Sägezahn-Kurve geben: Immer mehr Objekte werden erstellt und damit immer mehr Speicher belegt, bis der garbage collector wieder alle nicht gebrauchten Objekte frei gibt. Wenn die Sägezahn-Kurve im Leerlauf nicht wieder zurück kommt sondern ständig ansteigt hast du ein Memory-Leak und das wird -wenn du nichts mit Pointern oder MemAlloc gearbeitet hast- wahrscheinlich eine zyklische Referenz sein oder ein Stream der auf und nicht wieder zu gemacht wird.

Mathias-Kwiatkowski

BeitragMo, Sep 14, 2015 21:23
Antworten mit Zitat
Benutzer-Profile anzeigen
wie genau finde ich es herraus um welchen type es sich handelt (wenn ich GCMemAlloced() ) benutze?

und wie genau bekomme ich eine "Sägezahn-Kurve" hin?



EDIT:

habe nun mal mit GCMEMAlloced() mir alles ausgeben lassen

also wir fangen bei 8652 an steigern uns zu 20934 fallen dann auf 16224 zurück um wieder zu steigen auf 26960 und fallen dann eben wieder auf 18836 danach würde wohl das steigern kommen... problem was ich dabei seh ist wohl das die zahlen evtl immer grösser werden der erste fall wäre auf 16224 der zweite auf 18836 und das ohne spieler ... was genau passiert dort?


EDIT_2: 350736 ist wohl ende höher ist es nich gestiegen. (ohne spieler) einfach nur laufen lassen...

Edit 3:
also grundlegend. steigt die zahl immer fällt aber auch und steigt dann wieder 977072 war der höchste wert



ich habe nun einfach mal ein test gemacht

Code: [AUSKLAPPEN]
Global MemHight:Int = 0

Type TUser
   Global List:TList = New TList
   Field Name:String
End Type

Function NewUser(Name:String)
   Local U:TUser = New TUser
   U.Name = Name
   TUser.List.AddLast U
End Function

NewUser "Mathias"

Local Timer:Int = MilliSecs()

Graphics 800, 600
Repeat
   For Local U:TUser = EachIn TUser.List
      Print "User: " + U.Name
   Next
   
   If MilliSecs() - Timer >= 5000 Then
      Timer = MilliSecs()
      TUser.List = New TList
      MemHight = 0
   EndIf
   
   Local GCMem:Int = GCMemAlloced()
   If GCMem > MemHight Then MemHight = GCMem
   DrawText MemHight, 0, 0
   Flip
   Cls
Until AppTerminate()


der wert von GCMemAlloced() ist weiter steigend auch nachdem ich die Tuser.list = new tlist gemacht habe, der wert steigt und steigt, es nimmt kein ende, ist dies normal=
Skype: Anarchie1984
http://projektworks.de/maxbase/
Icq - Erneuert am 21.08.2017
Yahoo - Erneuert am 21.08.2017

DAK

BeitragDi, Sep 15, 2015 13:56
Antworten mit Zitat
Benutzer-Profile anzeigen
Hmm, der Testcode von dir, der steigt bei mir nicht. Sein Maximum bewegt sich bei mir immer rund um die 37k.

Welche Version von BMax hast du?

Um wieder auf deine ursprüngliche Frage zurück zu kommen:

Zitat:
meine frage und für mich nun die wichtigste ist. wie stark muss ein VServer sein um es stabiel am laufen zu halten?


Das kommt voll drauf an, was du machst. Ein gemoddeter Minecraft-Server kann echt viel verbrauchen, weil er bei jedem Tick Tausende von Blocks updaten muss. Ein WoW-Server verbraucht viel, weil da Tausende Spieler drauf rennen. Ein UT99-Server mit ein paar wenigen Spielern verbraucht quasi keine Leistung, da er auch nicht so viel machen muss, und das Wenige was er macht auch sehr effizient macht.

Da wir hier keine Ahnung haben (oder zumindest ich nicht), was dein Spiel tut, kann man dir auch nicht sagen, was der verbrauchen soll.
Aber wenn du nur ein paar wenige Spieler auf einer Art Shooter hast, dann sollte sich das auf deiner originalen Kiste locker ausgehen.
Als Programmierer würde ich so oder so sagen, bevor du dir neue Hardware kaufst, schau lieber dass du dein Programm optimierst. Hast du z.B. ein Memory Leak, dann ist egal was du dort für eine Hardware hinstellst, nach einer Zeit ist auch die voll und wird langsam.
Wenn du nicht irgendwelche abartig komplexen Berechnungen drinnen hast (z.B. tausende NPCs) und es lahm wird, dann würd ich mal auf Programmierprobleme tippen.
Gewinner der 6. und der 68. BlitzCodeCompo

Mathias-Kwiatkowski

BeitragDi, Sep 15, 2015 14:05
Antworten mit Zitat
Benutzer-Profile anzeigen
jo was macht der code

derzeit nicht viel
maximum waren zur zeit 2 user. 55 Aliens

was konnte man ( herumfliegen ) also von Point A zu Point B
was konnten die Aliens? (sie flogen auch nur von Point A zu Point B )

und man konnte disconnecten.

Atan2 für winkel berechnung bei jedem Enemy alle 500ms ( wenn sie in bewegung gesetzt worden sind ) weiß das es viel frisst aber daran lag es sicher nicht. ( die bewegungsroutine stammt aus dem erst versuchten game wo diese probs bei weit aus mehr Aliens nicht entstanden sind )
Skype: Anarchie1984
http://projektworks.de/maxbase/
Icq - Erneuert am 21.08.2017
Yahoo - Erneuert am 21.08.2017

Thunder

BeitragMi, Sep 16, 2015 16:14
Antworten mit Zitat
Benutzer-Profile anzeigen
Mathias-Kwiatkowski hat Folgendes geschrieben:
so nun zu dem wichtigsten das Server Programm und dessen unter threads laufen auf 20 FPS so wie es soll (waittimer createtimer(20)) funktioniert auch. problem ist je länger der server online ist desto weniger leistung hat er. hier schaut das bild (das sind die schwankungen )

Meinst du das ernst?
BlitzMax: [AUSKLAPPEN]
WaitTimer CreateTimer(20)

Steht so in deinem Code? Shocked

Das müsste auf Windows nach genau 16 Aufrufen crashen. Siehe:

BlitzMax: [AUSKLAPPEN]
Strict
Framework brl.standardio
Import brl.timer

Local i

For i = 1 To 30
Local time = MilliSecs()
WaitTimer CreateTimer(5)
Print i+". Runde: "+time+" WaitTimer dauerte "+(MilliSecs()-time)+" ms"
Next

End


(Und das ist nichts ungewöhnliches, wenn man sich mal den Code vom brl.timer Modul ansieht Rolling Eyes )
Meine Sachen: https://bitbucket.org/chtisgit https://github.com/chtisgit

Jan_

Ehemaliger Admin

BeitragDo, Sep 17, 2015 7:58
Antworten mit Zitat
Benutzer-Profile anzeigen
hm, Server, Threads, Netzwerk und 3 Threads?

Ich glaube das Problem ist ein ganzes Stück höher gelegen.

1. Main thread
2. Berechnungsthread
3. Serverthread - nimmt verbindungen an
4.-10'000ster. werden von Thread 3 gestartet und bekommen die aktuell zu verarbeitende Verbindung mitgegeben

Jeder User hat seinen eigenen Thread!
ab den 4. kannst du auch mit Delay arbeiten, damit der Berechnungssthread nciht verhungern kann. aber alle auf 20 FPS zu begrenzen ist unsinn.
bedenke, bitte auch, dass die Daten die vom Berechnungsthread kommen Synchronisiert werden müssen.

BTW. wäre ein Linux server nciht um Welten günstiger?
between angels and insects

Mathias-Kwiatkowski

BeitragDo, Sep 17, 2015 19:08
Antworten mit Zitat
Benutzer-Profile anzeigen
@ Jan_ sollte es heissen das jeder user ein eigenes thread bekommen soll? oder ist dies falsch verstanden von mir?

und ja im thread arbeite ich mit delay 1 aufgrund dessen das - probiert es bitte aus waittimer createtimer(XX) in einem thread nicht funktioniert... egal wie hoch er angesetzt ist -

ps. Thunder ähm also auf 20 fps begrenzen funktioniert bei mir wunderbar, keine ahnung wo du probleme dabei hast?

das dein bsp nicht funktioniert liegt eben an etwas aderen

Dein bsp:
Code: [AUSKLAPPEN]
For i = 1 To 30
   Local time = MilliSecs()
   WaitTimer CreateTimer(5)
   Print i+". Runde: "+time+" WaitTimer dauerte "+(MilliSecs()-time)+" ms"
Next


So Funktioniert es bei mir

Code: [AUSKLAPPEN]
Global WTimer:TTimer=createtimer(20)
Repeat

waittimer wtimer
Forever



EDIT: ps. so zur info (windows server ist nicht teuerer als linux... kann das betriebsystem frei wählen)
Skype: Anarchie1984
http://projektworks.de/maxbase/
Icq - Erneuert am 21.08.2017
Yahoo - Erneuert am 21.08.2017

Thunder

BeitragDo, Sep 17, 2015 21:37
Antworten mit Zitat
Benutzer-Profile anzeigen
Mathias-Kwiatkowski hat Folgendes geschrieben:
und ja im thread arbeite ich mit delay 1 aufgrund dessen das - probiert es bitte aus waittimer createtimer(XX) in einem thread nicht funktioniert... egal wie hoch er angesetzt ist -

Irgendwo hab ich Mal gelesen, das Timer-Modul ist nicht threadsafe.
Ich weiß jetzt grad nicht, ob es mit lokalen Timern geht, aber ich würd's nicht probieren, da nach 16 Threads das Programm abstürzt (wegen 16 Timern, siehe oben).

[quote="Mathias-Kwiatkowski"]ps. Thunder ähm also auf 20 fps begrenzen funktioniert bei mir wunderbar, keine ahnung wo du probleme dabei hast?[/code]

Ich hab dich extra zitiert... Du hast "WaitTimer CreateTimer(20)" geschrieben (jetzt gerade noch einmal). Und auf meine Nachfrage, ob das wirklich so in deinem Code steht, schickst du einen Code, wo es eh richtig gemacht wird (mit globaler Timer-Variable) und fragst mich, wo ich Probleme habe?... Rolling Eyes
Ich hab das "WaitTimer CreateTimer(20)" nämlich als Quelle eines Fehlers vermutet - und auch gezeigt, dass es nicht funktioniert.
Wenn du dich schon nicht genau ausdrückst, dann lies doch wenigstens genau.
Meine Sachen: https://bitbucket.org/chtisgit https://github.com/chtisgit

Mathias-Kwiatkowski

BeitragDo, Sep 17, 2015 23:09
Antworten mit Zitat
Benutzer-Profile anzeigen
Oh entschuldige das wusste ich nicht.bin davon ausgegangen das es klar sein sollte das die Funktion wie richtig beschrieben benutzt wird.auch mit lokalen ct geht es nicht. Bei mir stürzt es egal wie Ab sobald createtimer wo anders als im Main th genutzt wird.
Skype: Anarchie1984
http://projektworks.de/maxbase/
Icq - Erneuert am 21.08.2017
Yahoo - Erneuert am 21.08.2017

DAK

BeitragDo, Sep 17, 2015 23:41
Antworten mit Zitat
Benutzer-Profile anzeigen
Magst du mir mal den Code von dem Server per PN schicken, damit ich dir mal ein Codereview machen kann?
Gewinner der 6. und der 68. BlitzCodeCompo

Jan_

Ehemaliger Admin

BeitragFr, Sep 18, 2015 7:29
Antworten mit Zitat
Benutzer-Profile anzeigen
Ja, jeder User bekommt einen Thread.

Der BerechnerThread ,Berechnet die Daten
Dann gibt es einen Verteiler
und dann viele viele User Threads, die auf den Verteiler zugreifen.
wenn du den Verteiler Threadsafe machst, dann sollte auch immer genug Performance für den BerechnerThread da sein.
between angels and insects

DAK

BeitragSa, Sep 19, 2015 23:47
Antworten mit Zitat
Benutzer-Profile anzeigen
Wobei, besser wäre es, für die User Threadpools zu verwenden. Die lassen sich sehr leicht schreiben. Da hat man ein paar Threads (angepasst am Besten an die Hardware-Thread-Anzahl des Servers), die die User-Updates abarbeiten. Wenn grad kein Update kommt, dann liegen diese Threads im Leerlauf. Wenn mehr Updates rein kommen als Threads da sind, dann landen die überschüssigen Updates in einer Liste, von der sich die Threads die Arbeitsaufträge abholen, sobald sie mit ihrer Arbeit fertig sind.

Auf diese Weise spart man sich unnötigen Overhead für hunderte Threads (der kann nämlich auch viel kosten).
Gewinner der 6. und der 68. BlitzCodeCompo

Jan_

Ehemaliger Admin

BeitragMo, Sep 21, 2015 14:31
Antworten mit Zitat
Benutzer-Profile anzeigen
auf servern fand ich die overhead kosten garnicht so schlimm, meistens haben die L3 Chachs genug und mehr als 100 sind meistens nicht drauf.
between angels and insects

Mathias-Kwiatkowski

BeitragMi, Sep 23, 2015 13:56
Antworten mit Zitat
Benutzer-Profile anzeigen
also um das thema abzuschliessen, ich bedanke mich an alle die fleissig geholfen haben. und tipps gegeben haben.

meine Idea kam letzendes von DAK (jeder user eigenes th. )klingt auch richtig logisch (wenn jeder user ein unterschiedlichen ping hat und immer gewartet wird bis alle daten über tcp angekommen sind dauert es eben....)

hier noch ein abschluss screen etwas über 11 std laufzeit:

user posted image

angaben werden in Mindestwert / Höchster wert / letzte sekunde (Je tiefer desto besser)

THX Exclamation Very Happy
Skype: Anarchie1984
http://projektworks.de/maxbase/
Icq - Erneuert am 21.08.2017
Yahoo - Erneuert am 21.08.2017

Neue Antwort erstellen


Übersicht Sonstiges Smalltalk

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group