Server laggt aber ich weiß nicht warum

Wichtiger Hinweis: Bitte ändert nicht manuell die Schriftfarbe auf schwarz sondern belasst es bei der Standardeinstellung. Somit tragt ihr dazu bei dass euer Text auch bei Verwendung unseren dunklen Forenstils noch lesbar ist!

Tipp: Ihr wollt längere Codeausschnitte oder Logfiles bereitstellen? Benutzt unseren eigenen PasteBin-Dienst Link
  • Mache doch nur 2 Timer
    Du könntest schon den 15min und den 10sek Timer rausnehmen
    Mach einfach ne Schleife und schon haste 2 Timer weniger ;)

    dcmd_greenpeace(playerid,params[]) {
    #pragma unused params
    SendClientMessage(playerid, Grün, "Rettet die Wale,esst mehr Bieber!");
    return 1;
    }


    Mapplanung:
    Etwas einzigartiges was noch kein anderer veröffentlicht hat.
    70% fertig.

  • Ne das doch auch blöd, alles auf 15 und 10 Minuten wird so selten aufgerufen, dass da ein kleiner lagg nich spürbar ist.


    Und den 10 Sek Timer rausnehmen und das alle 10 Sekunden im 1 Sek Timer zu machen erscheint mir auch nicht gerade logisch.

  • tipp nimm doch auch mal playerid nicht immer max_player^^

    Zitat

    naja aufm homeserver mit kumpel getestet und nix laggt von daher sollte nen richtiger server mit sowas keine probs haben

    *an Kopf schlag
    sowas kommt Raus wenn man erst absendet ohne nachzudenken. Bitte Leute Hirn einschalten beim Posten...

  • Um mal kurz die Leute die grad viel mit "logischem Denken" um sich werfen aufzuklären und zu verhindern, dass Neulinge in diesem Bereich sofort mit Fehlinformationen konfrontiert werden und diese dann auch noch glauben:



    Ich betreue seit mehr als 2 Jahre Scripts unterschiedlicher Personen deren ursprünglichen Zustände mit heutigen nicht mehr vergleichbar sind (vorallem war häufig der Code anfangs Mist, aber es hat sich auch viel getan, neue Callbacks, SA-MP updates etc.). Es war oft der Fall das unnötige Timer aufgestellt wurden, Timer Funktionen aufruften die es gar nicht gab etc.pp.


    All diese Scripts funktionierten jedoch ohne Lags.


    Das Script, dass ich - auch auf Basis dieser Erfahrungen - "from scratch" geschrieben habe kommuniziert so gut wie permanent mit dem mySQL server.


    Ich verwende momentan 7 Timer die OnGameModeInit gestartet werden und zusätzl. nochmal ca. 10 weitere Timer die durch bestimmte Events während des Gameplays ausgelöst werden können. Ob 10 Spieler oder 80 - der Server laggt nicht.


    Ich habe mich lange mit dem Verhalten von Timern beschäftigt insbesondere ihrer Latenzen im Vgl. zu den eig. ms mit denen man sie aufruft, habe Testserver etliche Zeit laufen lassen um Vergleichswerte auszuspucken und letzten Endes bin ich zu dem Schluss gekommen, dass die Timer wie ich sie verwende keine Probleme darstellen. Das mag sich vll mit einem Playercount jenseits der 150 dann mal ändern, jedoch glaube ich es kaum. Und selbst wenn wäre es ein leichtes den Code umzuschreiben und zu optimieren.


    Dennoch, was ich damit sagen will, verbreitet bitte nicht Euer Halbwissen wenn Ihr nicht wisst wovon gesprochen wird bzw. nur Aufgeschnapptes nachsprecht. Ihr schadet damit einzig und allein denen die Euch Glauben schenken.


    Timer sind eine Frage des Servers und des optimierten Codes. Das allg. Gerücht Timer würden immer Lags hervorrufen stimmt einfach nicht.

    GameMode / Filterscript / Plugin Development via
    - PAWN / C/C++
    - Database (mySQL) & Filebased - Systems


    Webdevelopment / Interfaces Webapplications - SA:MP Server via
    - HTML & CSS
    - PHP, JavaScript, Ajax

  • das allg. gerücht dass timer laggs verursachen hat hier auch keiner verbreitet , und dass du 7 timer verwenden musst zeigt auch , dass du nicht ressourcensparend scripten kannst .


    bisschen ot:Ich will hier in diesem Thread hinweisen , dass es eine timestamp funktion gibt die in vielen fällen einen Timer ersetzen können ;)
    Oder was auch besser ist , man hat einen SetTimer der jede minute läuft dann sollte man auch keine settimerex machen die eine minute laufen , nach meiner erfahrung sind weniger , aber anspruchsvollere timer besser als viele kleine timer die nur kleine funktionen machen ... natürlich mehr oder weniger bei so einem fall wie ich es oben geschildert habe

  • Was den SA:MP-Prozess auch sehr belastet, ist Logging.
    Musst drauf achten, dass du nicht jeden Furz in den Log schreiben lässt, denn während solcher Vorgänge macht der Server nichts anderes.
    Das nur als Tipp nebenbei! ;D
    /edit: Weiss ich, weil ich mich laaange mit Scriptoptimierung beschäftigt habe.



    Einmal editiert, zuletzt von maddin911 ()

  • das allg. gerücht dass timer laggs verursachen hat hier auch keiner verbreitet , und dass du 7 timer verwenden musst zeigt auch , dass du nicht ressourcensparend scripten kannst .


    Wenn ich 7 Timer gleichzeitig ohne jedwede Nachteile verwenden kann und damit andere Stellen im Script entlaste, neue oder bessere Features schaffe kann man von "ressourcensparend" nicht reden - darunter wird allg. etwas anderes verstanden. Zum Thema Codeoptimierung zeigt es vll. dass es mit sauberem Code durchaus möglich ist, eine hohe Zahl an Timern laufen zu lassen. Sprech doch bitte keine Vermutungen aus und unterstelle mir nicht was Du nicht wissen kannst.


    Zitat

    Oder was auch besser ist , man hat einen SetTimer der jede minute läuft dann sollte man auch keine settimerex machen die eine minute laufen


    Auch das ist leider eine weitere Fehlinformation - bzw. zwei Dinge werden hier vermischt. Um serverseitige Events hervorzurufen bleibt dir nicht viel anderes übrig als auf SetTimer/SetTimerEx zurückzugreifen. Nun spielt es aber gar keine Rolle, welche Zeitspannen deine SetTimer im Vgl. zu SetTimerEx calls haben oder ob es sich um SetTimerEx anstelle von SetTimer handelt. Der Unterschied im Übrigen zw. SetTimer und -Ex ist auch nur die Variablenübergabe als Funktionsparameter. Ob man SetTimer oder SetTimerEx verwendet macht für die reine Laufzeit keine merklichen Unterschiede.

    GameMode / Filterscript / Plugin Development via
    - PAWN / C/C++
    - Database (mySQL) & Filebased - Systems


    Webdevelopment / Interfaces Webapplications - SA:MP Server via
    - HTML & CSS
    - PHP, JavaScript, Ajax

  • Was den SA:MP-Prozess auch sehr belastet, ist Logging.
    Musst drauf achten, dass du nicht jeden Furz in den Log schreiben lässt, denn während solcher Vorgänge macht der Server nichts anderes.
    Das nur als Tipp nebenbei! ;D
    /edit: Weiss ich, weil ich mich laaange mit Scriptoptimierung beschäftigt habe.

    Soweit ich weiß, gibt es bei SA-MP kein Multi Threading und somit kann nur alles nacheinander gemacht werden, also nicht nur logging.

  • do.de - Domain-Offensive - Domains für alle und zu super Preisen
  • Das ist korrekt. Allerdings muss man von threaded processes die nur den jeweiligen Spieler und solche die alle betreffen unterscheiden.


    Das mysql plugin das ich verwende beispielsweise loggt jedes Query, an einem Tag entstehen da im Schnitt gut 100mb an Logfile - allerdings als threaded process, von daher kriegt wenn dann nur der Spieler der es ausgelöst hat was mit - und selbst die merken davon nix ;). Man muss aber hinzufügen, dass es über C/C++ und nicht über pwn geloggt wird.

    GameMode / Filterscript / Plugin Development via
    - PAWN / C/C++
    - Database (mySQL) & Filebased - Systems


    Webdevelopment / Interfaces Webapplications - SA:MP Server via
    - HTML & CSS
    - PHP, JavaScript, Ajax

  • [qoute]SetTimer/SetTimerEx zurückzugreifen. Nun spielt es aber gar keine Rolle, welche Zeitspannen deine SetTimer im Vgl. zu SetTimerEx calls haben oder ob es sich um SetTimerEx anstelle von SetTimer handelt. Der Unterschied im Übrigen zw. SetTimer und -Ex ist auch nur die Variablenübergabe als Funktionsparameter. Ob man SetTimer oder SetTimerEx verwendet macht für die reine Laufzeit keine merklichen Unterschiede.[/quote]


    Ich meinte im oberen Beispiel was anders , es ist zu 100% besser einen SetTimer zu haben als einen SetTimerEx pro spieler ....Natürlich verhelfen nur timer zum gewünschten Ergebnis , aber du wirst es nach und nach merken , bei wachsender Spieleranzahl , dass sich dein Server verlangsamt . Das ist keine Vermutung oder so , da spreche ich aus erfahrung .Mich würde auch mal deine Prozessorauslastung und Ram auslastung interessieren . Zum loggen empfehle ich mysql vor allem das Plugin von strickenkid da es multi threading unterstützt . Aja wenn du jedes Query loggst merkt es der Spieler ja auch nicht , aber hier ist wieder der Punkt , dass bei Wachsender Spieleranzahl der server immer mehr zu tun haben wird ;)

  • Ich meinte im oberen Beispiel was anders , es ist zu 100% besser einen SetTimer zu haben als einen SetTimerEx pro spieler ....


    Soleid es mir tut aber wenn Du versuchst einer Person etwas zu erklären solltest Dich dann auch verständlich genug ausdrücken.


    Zitat

    Natürlich verhelfen nur timer zum gewünschten Ergebnis , aber du wirst es nach und nach merken , bei wachsender Spieleranzahl , dass sich dein Server verlangsamt . Das ist keine Vermutung oder so , da spreche ich aus erfahrung .


    Das Timer den Server u.U. bei großer Spielerzahl verlangsamern können ist ein Fakt. Darauf habe ich auch nicht geantwortet. Die Vermutung/Unterstellung die Du geäußerst hast betraf folgendes Zitat (welches ich direkt verwendet habe, von daher dachte ich hier könnten gar keine Missverständnisse auftreten):


    Zitat

    und dass du 7 timer verwenden musst zeigt auch , dass du nicht ressourcensparend scripten kannst


    Du kennst meinen Code nicht, Du sprichst hier von absolut keiner "Erfahrung" denn soweit ich weiß warst Du innerhalb der letzten 2-3 Jahre nicht auf einem unserer Server. Ob der Server sich spürbar verlangsamern würde bei einer Spielerzahl jenseits der 150 konnten wir bis jetzt noch nicht feststellen, bis 150 war es jedoch kein Problem und sollte es mal zu einem werden ist es auch kein Problem dem vorzubeugen.


    Zitat

    Mich würde auch mal deine Prozessorauslastung und Ram auslastung interessieren . Zum loggen empfehle ich mysql vor allem das Plugin von strickenkid da es multi threading unterstützt . Aja wenn du jedes Query loggst merkt es der Spieler ja auch nicht , aber hier ist wieder der Punkt , dass bei Wachsender Spieleranzahl der server immer mehr zu tun haben wird ;)


    Ich hab noch kein Api dafür geschrieben, da es im Moment nicht nötig ist, werde es aber demnächst machen. ServerFFS ist unser host - dessen Ressourcen sind völlig ausreichend für uns. Was Du meinst ist threading - nicht multi-threading - was von allen "großen" mySQL plugins mittlerweile unterstützt wird... und jetzt nochmal, mit Halbwissen bitte nicht Neulinge in Versuchung führen.

    GameMode / Filterscript / Plugin Development via
    - PAWN / C/C++
    - Database (mySQL) & Filebased - Systems


    Webdevelopment / Interfaces Webapplications - SA:MP Server via
    - HTML & CSS
    - PHP, JavaScript, Ajax

  • multi-threaded compatibility ok sorry dass ich das nicht ins Englische übersetzen kann .... Vielleicht habe ich ein halbwissen dafür kann ich googlen und nachlesen bevor ich hier etwas dummes reinschreibe ;) , aber egal b2t ....

  • Oka Danke schon mal für die Antworten und Erläuterungen zu Timern, echt super Arbeit.


    Ich habe einen PN Ratschlag von Templer mal befolgt und nach dieser Methode die Bearbeitungszeiten der Timer ermittelt. Jeweils über 30 Sekunden gemessen.


    0 Spieler:



    Mit einem Spieler:


    Dies ist exakt das Selbe.


    Heißt also, dass nicht die Zeit in der der Timer läuft gebraucht wird um den Inhalt auszuführen.


    Ich werde das Script jetzt laufen lassen und die Timerwerte bei verschiedenen Spieler begutachten.


    Werdet ihr aber vllt jetzt schon schlau aus den Werten ?


    edit: Hier mal die Werte bei 8 Spielern


    Einmal editiert, zuletzt von Hagi ()

  • Das Problem ist, dass du (warsch.) gerade ausgibst - wie lange die jeweilige Funktion zum Ausführen braucht die durch SetTimer/Ex aufgerufen wird - nicht jedoch wann diese ausgeführt wird (denn letzten Endes geht es darum).


    Das könntest du z.B. mit einer global "_SekTimer" machen.


    Unter OnGameModeInit:


    _SekTimer = GetTIckCount();
    SetTimer(...); // Funktion welche jede Sek aufgerufen werden soll



    Unter:
    public ...()// Funktion welche jede Sek aufgerufen werden soll
    {
    print("Timed callback:");
    printf("-> Difference: %d ms",GetTickCount()-_SekTimer);
    }


    Da wirste überrascht sein was zum Teil rauskommen wird anstelle der erwarteten 1000ms ;)

    GameMode / Filterscript / Plugin Development via
    - PAWN / C/C++
    - Database (mySQL) & Filebased - Systems


    Webdevelopment / Interfaces Webapplications - SA:MP Server via
    - HTML & CSS
    - PHP, JavaScript, Ajax

  • Ich kenn das Include nicht - allerdings dürfte es wenn du sauberen Code verwendest einfach keine Probleme geben. Kann es sein dass der Host schlecht ist (hab keine Erfahrungen mit diesem gemacht)?


    Ansonsten kann ich nur noch auf mangelhaften Code tippen (ohne Dir da was unterstellen zu wollen!).

    GameMode / Filterscript / Plugin Development via
    - PAWN / C/C++
    - Database (mySQL) & Filebased - Systems


    Webdevelopment / Interfaces Webapplications - SA:MP Server via
    - HTML & CSS
    - PHP, JavaScript, Ajax

  • Also der Host hat noch andere Server, grad auch komplexere Reallife. Die laggen nicht.


    Es muss bei meinem Code an den Timern liegen, denn wenn ich deren Intervalle ändern d.h. vergrößere (zum Beispiel auf 5 Minuten) dann laggsts nicht.
    Den Code der Timer hab ich ja ein paar Post vorher schon gepostet. Aber ich wüsste nicht wie ich das optimieren könnte.

  • do.de - Domain-Offensive - Domains für alle und zu super Preisen