hohe Prozessorlast am Networkserver - etwas mehr Verbindunge

Für allgemeine Fragen zur Programmierung mit PureBasic.
Toshy
Beiträge: 713
Registriert: 22.03.2005 00:29
Computerausstattung: Computer und Strom vorhanden
Wohnort: LK Wolfenbüttel

hohe Prozessorlast am Networkserver - etwas mehr Verbindunge

Beitrag von Toshy »

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

Code: Alles auswählen

 
wert = wert + ((10*1024)-240)/100
MoveMemory(*buffer,*buffer+1024,1024*50)
z + 1
 
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)

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)
1. Win10
PB6.1
Benutzeravatar
mk-soft
Beiträge: 3902
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: hohe Prozessorlast am Networkserver - etwas mehr Verbind

Beitrag von mk-soft »

50000 Clientverbindungen gehen gar nicht. Da gibt es schon grenzen in Windows . Für so vielen Verbindungen gibt es verteilte Hostsysteme...

Der Server sollte schon in einen Thread laufen und wenn keine Events ankommen einen Delay(10) ms ausführen...
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Toshy
Beiträge: 713
Registriert: 22.03.2005 00:29
Computerausstattung: Computer und Strom vorhanden
Wohnort: LK Wolfenbüttel

Re: hohe Prozessorlast am Networkserver - etwas mehr Verbind

Beitrag von Toshy »

Die prozessorlast liegt nicht am eigenen Code. Delay(10) zu manchmal zu lange. Aber ist hier egal.
Selbst mit einem Delay(1000) oder delay(10000) gibt es die volllast. Also wenn mein Programm gar nichts macht. Der PB-Thread der durch die NEtworklib erstellt wird löst das aus. Soweit ich das erkennen kann.

ob 50000 gehen oder nicht, das versuche ich noch raus zu finden. ein System sollte das aber mit ruhenden verbindunge schaffen können. laut einigen webisten sind 5000 kein problem, auf einigen seiten steht auch 512, aber da gehen auf jenden Fall mehr. (ich finde da nur nie eine Windowsversionsangabe). ist wohl nur eine technische begrenzung die Windows vorgibt. mehr als 64 k sind denke ich so oder so nicht möglich, da es ja nicht mehr Ports gibt.
Aber zurück zum Thema, es geht um ca. 2000-3000 "ruhende Verbindungen". Die Networklib löst das wohl aus.
1. Win10
PB6.1
Antworten