Archiv verlassen und diese Seite im Standarddesign anzeigen : ping nur dann senden wenn server nix zu tun hat
Hi
folgendes..
stellt euch nen server vor der ein paar tausend dauerhafte verbindungen zu genausoviel usern hat...
um nun zu schaun ob gewisse user noch da sind soll der server alle paar minuten einen ping senden.
damit nun dieser ping nicht an ein paar hundert user genau dann gesendet wird, wenn ein paar andere hundert user zB einen regulären command ausführen wollen, muss ich mir etwas überlegen das den ping command nicht einfach ans ende de queue liste schiebt sondern ihn dann ausführt wenn der server noch platz hat etwas auszuführen ODER wenn es zwingend nötig wird...
da ich erst in der testphase feststellen werde ab wann der server nun genau ausgelastet ist, muss ich mir nun erstmal nen plan mit Prozenten aufstellen 8)
ich hab nen timer pro einzelnden user, der zB alle 5 minuten einen Ping senden soll... wie soll ich diesen nun verzögern, wenn der server zB kurz vorher zu 80% ausgelastet ist? oder, wenn in den 5 minuten 4,9 minuten 100% waren aber kurz vorher der server 0% auslatung hat ???
aber es nur in dem moment wo der ping abgesendet werden sollte die auslastung abzufragen und neu zu entscheiden hat genau den effekt das ich den ping einfach nach hinten verschiebe und im schlimmsten fall er niemals ausgeführt wird... oder halt zu spät :D
wäre für jede idee dankbar..
hmm ist das nicht egal.. nen ping ist doch so nen unbelastender befehl....
und so an die grenze der leistung nen server betreiben zu lassen ist ja auch ned gerade so gut...
Wozu willst du denn nen Ping senden? Um die Verbindng zu trennen wenn eine Bestimte Zeit verstrichen ist? Normalerweise wird die Verbindung zu einer Netzwerkverbindung erst bei Abmeldung des Benutzers getrennt, selbst wenn du Anmeldezeiten festlegst bleiben bestehende Verbindungen erhalten.
Jan Krüger
18.05.2002, 03:09
Naja, es geht hier wahrscheinlich um etwas ähnliches (oder vielleicht sogar genau ;)) wie IRC-Netzwerke.
Jede IRC-Verbindung zu halten, auch wenn der Client schon lange nichts mehr senden kann, wäre absolute Ressourcenverschwendung, bei 5000 Verbindungen oder so merkt man das schon. :)
Ich denke, das Problem ist mit Hilfe eines festen Timers nicht einfach zu lösen.
Wie wäre es mit einer solchen Lösung (ich weiß aber nicht, ob das in das jetzige Design reinpassen würde):
- Es wird eine Liste mit Timestamps der letzten Aktivität sämtlicher Verbindungen geführt. Diese Liste sollte nach Timestamps sortiert sein.
- Wenn die Auslastung gerade gering ist, werden x Verbindungen (den Algorithmus, um ein passendes x zu berechen, überlege ich mir später ;)) von der Timestampliste abgearbeitet, und zwar diejenigen, die als allerunterstes drinstehen (also am längsten keine Aktivität mehr gezeigt haben). Danach werden sie vom unteren Ende der Liste entfernt und oben wieder angehängt.
- Sollte die Serverlast plötzlich wieder ansteigen, kann x jederzeit während der Ping-Serie verringert werden.
- Es sollte zum Einsparen von Ressourcen eine Einschränkung hinzugefügt werden, derzufolge das Durchwühlen der Liste erstmal wieder verschoben wird, wenn der jüngste Timestamp jünger als, sagen wir, eine oder zwei Minuten ist.
- Desweiteren sollte eine Funktion eingebaut werden, die in regelmäßigen Abständen (z.B. fünf Minuten) überprüft, ob es Verbindungen gibt, die wirklich überfällig sind (z.B. fünf Minuten), und diese dann sofort anpingt.
Mit diesem Konzept wäre es gewährleistet, dass Ping schon etwas früher stattfinden, wenn es möglich ist, aber niemals zu spät.
So, ich hoffe, ich habe trotz der etwas späten Uhrzeit keine wesentlichen Aspekte übersehen.
Ist es sehr ressourcenintensiv, die momentane Auslastung festzustellen?
@brice.. jo wenn einer halt mal abschmiert mit seinem rechner, dann will ich den socket für einen anderen user frei machen.. oder für leute die aus spass connecten aber nix machen, damit ich sie kicken kann vom server...
@Jast
jau ist ne gude idee.. einen dringlichkeitsbereich in der queue liste, anhand der verstrichenen zeit des letzten commands (inklusive ping) anzulegen... ich werde aber denke ich mal keine extra queue liste für den ping anlegen sondern alle commands mit einem dringlichkeitswert versehen und einer commandID und diese in einer liste behandeln wobei die liste nach dem dringlichkeitswert sortiert wird...
jeder reguläre command bekommt zB die höchste dringlichkeitsstufe, wärend ein ping command ans hinterste ende der liste geadded wird... sollte der timer der jede minute die liste nach ping CIDs durchschaut einen idler über eine gewisse zeit entdeckt haben erhöht er die dringlichkeit des Pings und da die liste aktiv sortiert ist rutscht der command nach oben...
usw...
zusätzlich braucht man dann noch einen timer der, einen eintrag in diese queue liste mit dem ping befehl vornimmt, ausgeführt wird, wenn ein command von diesem user ankam, oder er gerade connected ist... und der bleibt statisch auf zB 5 minuten...
war nen sehr guter denkanstoss.. werd mich auch mal über nen genauen algo hermachen... 8)
hi,
versucht's doch mal mit tcp keep-alive. wenn der server eine verbindung annimmt (mit accept oder so) dann kann man eine socket-option aktivieren, damit das tcp in den pausen zusätzliche acks sendet, die vom client beantwortet werden müssen. gibts keine antwort, dann wird der socket automatisch geschlossen. man muss nix dafür programmieren, nur eine funktion (setsockopt) aufrufen.
jo.. bei wenigen sockets isses so ja auch kein problem..
nur wenns über 5000 sockets werden, dann kann ich mich nicht um jeden ping für einen socket kümmern, ich möchte gern das letzte aus der kiste rausholen, also mächte ich pings so selten wie möglich senden müssen, da es genug andere commands geben kann... nud auf ne trennung vom peer oder client möchte ich ned warten...
ich hab mir da schon etwas wie oben beschrieben gebastelt was relativ gut funzt..
:cool:
vBulletin® v3.8.6, Copyright ©2000-2012, Jelsoft Enterprises Ltd.