Klar, zu viele Schleifen, insbesondere im 1Sek. Timer.
Server laggt aber ich weiß nicht warum
- Hagi
- Geschlossen
- Erledigt
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
-
-
hm ich muss also iwi die Schleifen da raus bekommen. Das Problem ist aber, dass ich viele Dieser Werte halt auf einer Sekunde brauche. Ist es vllt besser mehrere Timer zu machen , die eine Sekunde laufen ?
-
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 -
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^^
-
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.
-
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. -
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.
ZitatOder 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.
-
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.
-
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.
-
[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
-
Will ich mal sehen wenn du 20 Timer gleichzeitig drin hast
ich hab 18 nur bei ongamemodeinit und es laggt kein bisschen..
-
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.
ZitatNatü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):
Zitatund 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.
ZitatMich 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.
-
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:
Zitat
[15:39:55] ONESEK: 0 Millisekunden
[15:39:56] ONESEK: 0 Millisekunden
[15:39:57] ONESEK: 0 Millisekunden
[15:39:59] ONESEK: 0 Millisekunden
[15:40:00] ONESEK: 0 Millisekunden
[15:40:01] ONESEK: 1 Millisekunden
[15:40:02] ONESEK: 0 Millisekunden
[15:40:03] ONESEK: 0 Millisekunden
[15:40:04] ONESEK: 0 Millisekunden
[15:40:05] TENSEK: 0 Millisekunden
[15:40:05] ONESEK: 0 Millisekunden
[15:40:06] ONESEK: 0 Millisekunden
[15:40:08] ONESEK: 0 Millisekunden
[15:40:09] ONESEK: 0 Millisekunden
[15:40:10] ONESEK: 0 Millisekunden
[15:40:11] ONESEK: 0 Millisekunden
[15:40:12] ONESEK: 0 Millisekunden
[15:40:13] ONESEK: 0 Millisekunden
[15:40:14] ONESEK: 0 Millisekunden
[15:40:15] ONESEK: 0 Millisekunden
[15:40:16] TENSEK: 0 Millisekunden
[15:40:16] ONESEK: 0 Millisekunden
[15:40:18] ONESEK: 0 Millisekunden
[15:40:19] ONESEK: 0 Millisekunden
[15:40:20] ONESEK: 0 Millisekunden
[15:40:21] ONESEK: 1 Millisekunden
[15:40:22] ONESEK: 0 Millisekunden
[15:40:23] ONESEK: 0 Millisekunden
[15:40:24] ONESEK: 0 Millisekunden
[15:40:25] ONESEK: 0 Millisekunden
[15:40:27] ONESEK: 0 Millisekunden
[15:40:28] TENSEK: 0 MillisekundenMit einem Spieler:
Zitat[15:39:55] ONESEK: 0 Millisekunden
[15:39:56] ONESEK: 0 Millisekunden
[15:39:57] ONESEK: 0 Millisekunden
[15:39:59] ONESEK: 0 Millisekunden
[15:40:00] ONESEK: 0 Millisekunden
[15:40:01] ONESEK: 1 Millisekunden
[15:40:02] ONESEK: 0 Millisekunden
[15:40:03] ONESEK: 0 Millisekunden
[15:40:04] ONESEK: 0 Millisekunden
[15:40:05] TENSEK: 0 Millisekunden
[15:40:05] ONESEK: 0 Millisekunden
[15:40:06] ONESEK: 0 Millisekunden
[15:40:08] ONESEK: 0 Millisekunden
[15:40:09] ONESEK: 0 Millisekunden
[15:40:10] ONESEK: 0 Millisekunden
[15:40:11] ONESEK: 0 Millisekunden
[15:40:12] ONESEK: 0 Millisekunden
[15:40:13] ONESEK: 0 Millisekunden
[15:40:14] ONESEK: 0 Millisekunden
[15:40:15] ONESEK: 0 Millisekunden
[15:40:16] TENSEK: 0 Millisekunden
[15:40:16] ONESEK: 0 Millisekunden
[15:40:18] ONESEK: 0 Millisekunden
[15:40:19] ONESEK: 0 Millisekunden
[15:40:20] ONESEK: 0 Millisekunden
[15:40:21] ONESEK: 1 Millisekunden
[15:40:22] ONESEK: 0 Millisekunden
[15:40:23] ONESEK: 0 Millisekunden
[15:40:24] ONESEK: 0 Millisekunden
[15:40:25] ONESEK: 0 Millisekunden
[15:40:27] ONESEK: 0 Millisekunden
[15:40:28] TENSEK: 0 MillisekundenDies 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
Zitat
[16:25:08] ONESEK: 0 Millisekunden | Spieleranzahl: 8
[16:25:09] ONESEK: 0 Millisekunden | Spieleranzahl: 8
[16:25:10] ONESEK: 0 Millisekunden | Spieleranzahl: 8
[16:25:11] ONESEK: 0 Millisekunden | Spieleranzahl: 8
[16:25:12] ONESEK: 1 Millisekunden | Spieleranzahl: 8
[16:25:13] ONESEK: 0 Millisekunden | Spieleranzahl: 8
[16:25:14] ONESEK: 0 Millisekunden | Spieleranzahl: 8
[16:25:14] TENSEK: 1 Millisekunden | Spieleranzahl: 8
[16:25:15] ONESEK: 0 Millisekunden | Spieleranzahl: 8
[16:25:16] ONESEK: 0 Millisekunden | Spieleranzahl: 8
[16:25:17] ONESEK: 0 Millisekunden | Spieleranzahl: 8
[16:25:18] ONESEK: 0 Millisekunden | Spieleranzahl: 8
[16:25:19] ONESEK: 0 Millisekunden | Spieleranzahl: 8
[16:25:20] ONESEK: 1 Millisekunden | Spieleranzahl: 8
[16:25:21] ONESEK: 0 Millisekunden | Spieleranzahl: 8
[16:25:22] ONESEK: 0 Millisekunden | Spieleranzahl: 8
[16:25:23] ONESEK: 0 Millisekunden | Spieleranzahl: 8
[16:25:24] ONESEK: 0 Millisekunden | Spieleranzahl: 8
[16:25:25] TENSEK: 1 Millisekunden | Spieleranzahl: 8
[16:25:25] ONESEK: 0 Millisekunden | Spieleranzahl: 8
[16:25:26] ONESEK: 0 Millisekunden | Spieleranzahl: 8 -
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 sollUnter:
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
-
-
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!).
-
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.