hohe Prozessorlast am Networkserver - etwas mehr Verbindunge
Verfasst: 08.06.2012 08:47
Warum bremst die Networklib besonders am Server den Rechner so aus?
Bei vielen Verbindungen ist selbst "in Ruhe" die Prozessorlast enorm.
Ich erstelle ja gerade meinen eigenen Networkmanager für mich. Da wollte ich doch mal mit einfachem Code schauen was mein Rechner so an Verbindungen verträgt (gaaaanz damals unter Win98 wurden nicht so viele Verbindungen zu gelassen). Nun ja, der Aufbau der ersten tausend Verbindungen (localhost) geht binnen ein paar Sekunden. aber dann dauert es länger und länger.
und was schlimmer ist, selbst wenn ich keine verbindungen mehr aufbaue und der server nichts mache (nur eine schleife mit delay(1) und auf events wartet, dann ist bei 3000-5000 verbindungen mein PC zu 50% beschäftigt (100% eines cores). Egal mit oder ohne Debugger
hat pb da intern eine ganz schlechte ID-Verwaltung oder so?
Ich wollte an sich so programmieren, daß die Last theoretisch bei vielen Verbindungen noch sehr niedrig ist. Aber wenn alleine schon die bloße Existens der Verbindungen alles lahm legt ist das nicht so toll. Woher kommt das?
Ist das einfach nicht optimiert oder ist intern einfach so viel Code/Rechenarbeit abzuarbeiten? Ich vermute daß es durch die überwachung der Events kommt. Aber wie das am Server intern läuft.... keine Ahnung.
Ich frage daher, weil es ja auch Server gibt (keine Serverfarmen) die extrem viel mehr Clienten verwalten können. und wenn sich sich das so potenziert wie bei pb, dann weiß ich nicht wie man 50 000 Cliente oder mehr verbunden haben kann (es geht nur um die Verbindung, nicht das gleichzeitig daten gesendet werden.
Vergleichen von Prozessorlast ist immer schlecht,
aber wenn ich beispielsweise diesen Testcode
in einer Schleife durchlaufen lasse, dann schaffe ich 200 000 Durchläufe die Sekunde auf einem Kern.
es wird etwas gerechnet und wenn ich mich nicht irre ca. 9 gb ram ein wenig verschoben. in der sekunde.
Etwas komisch finde ich es schon, wenn dann 3000 - 5000 "ruhende" Verbindungen selbe lst auslösen.
(selbst eine Auslese routine am clienten noch nicht getestet, wird aber sicher ähnliches ergeben)
Bei vielen Verbindungen ist selbst "in Ruhe" die Prozessorlast enorm.
Ich erstelle ja gerade meinen eigenen Networkmanager für mich. Da wollte ich doch mal mit einfachem Code schauen was mein Rechner so an Verbindungen verträgt (gaaaanz damals unter Win98 wurden nicht so viele Verbindungen zu gelassen). Nun ja, der Aufbau der ersten tausend Verbindungen (localhost) geht binnen ein paar Sekunden. aber dann dauert es länger und länger.
und was schlimmer ist, selbst wenn ich keine verbindungen mehr aufbaue und der server nichts mache (nur eine schleife mit delay(1) und auf events wartet, dann ist bei 3000-5000 verbindungen mein PC zu 50% beschäftigt (100% eines cores). Egal mit oder ohne Debugger
hat pb da intern eine ganz schlechte ID-Verwaltung oder so?
Ich wollte an sich so programmieren, daß die Last theoretisch bei vielen Verbindungen noch sehr niedrig ist. Aber wenn alleine schon die bloße Existens der Verbindungen alles lahm legt ist das nicht so toll. Woher kommt das?
Ist das einfach nicht optimiert oder ist intern einfach so viel Code/Rechenarbeit abzuarbeiten? Ich vermute daß es durch die überwachung der Events kommt. Aber wie das am Server intern läuft.... keine Ahnung.
Ich frage daher, weil es ja auch Server gibt (keine Serverfarmen) die extrem viel mehr Clienten verwalten können. und wenn sich sich das so potenziert wie bei pb, dann weiß ich nicht wie man 50 000 Cliente oder mehr verbunden haben kann (es geht nur um die Verbindung, nicht das gleichzeitig daten gesendet werden.
Vergleichen von Prozessorlast ist immer schlecht,
aber wenn ich beispielsweise diesen Testcode
Code: Alles auswählen
wert = wert + ((10*1024)-240)/100
MoveMemory(*buffer,*buffer+1024,1024*50)
z + 1
es wird etwas gerechnet und wenn ich mich nicht irre ca. 9 gb ram ein wenig verschoben. in der sekunde.
Etwas komisch finde ich es schon, wenn dann 3000 - 5000 "ruhende" Verbindungen selbe lst auslösen.
(selbst eine Auslese routine am clienten noch nicht getestet, wird aber sicher ähnliches ergeben)
Code: Alles auswählen
;
; server
If InitNetwork() = 0
MessageRequester("Error", "Can't initialize the network !", 0)
End
EndIf
Global lastpos
Global merke
Procedure thread1(dummy.i)
Debug "Thread gestartet"
Repeat
string.s = "pos = " + Str( lastpos)
If merke <> lastpos
merke = lastpos
Debug string
EndIf
Delay(5000)
ForEver
EndProcedure
Thread = CreateThread(@thread1(), 0)
EMS3.i= ElapsedMilliseconds()
Port = 6846
*Buffer = AllocateMemory(100000)
If CreateNetworkServer(0, Port)
Debug "server gestartet"
Repeat
lastpos = 1
SEvent = NetworkServerEvent()
If SEvent
ClientID = EventClient()
Select SEvent
Case #PB_NetworkEvent_Connect
; Debug "neuer client"
Case #PB_NetworkEvent_Data
ergebnis = ReceiveNetworkData(ClientID, *Buffer, 100000)
Case #PB_NetworkEvent_Disconnect
; Debug "close" EndSelect
EndSelect
EndIf
Delay(1)
If (ElapsedMilliseconds()-EMS3)/1000 > 60*2
quit = 1
EndIf
Until Quit = 1
MessageRequester("PureBasic - Server", "Click to quit the server.", 0)
CloseNetworkServer(0)
Else
MessageRequester("Error", "Can't create the server (port in use ?).", 0)
EndIf
End
Code: Alles auswählen
If InitNetwork() = 0
MessageRequester("Error", "Can't initialize the network !", 0)
End
EndIf
Global z,z2
Procedure thread1(dummy.i)
Debug "thread gestartet"
Repeat
string.s = "z = " + Str(z) + " - " + "z2 = " + Str(z2)
Debug string
Delay(1000)
ForEver
EndProcedure
Thread = CreateThread(@thread1(), 0)
Port = 6845
For I = 1 To 3000
ConnectionID = OpenNetworkConnection("127.0.0.1", Port)
If ConnectionID
z + 1
;Debug("Verbindung aufgebaut: " + Str(z))
Else
z2 + 1
Debug("Verbindungsversuch fehlgeschlagen: " + Str(i-z))
EndIf
Next i
Debug("z = " + Str(z) + " --- f = " + Str(z2))
Repeat
Delay(1)
ForEver
;Delay(60000)