Seite 1 von 1

CPU-Auslastung beim Server reduzieren

Verfasst: 02.10.2004 16:01
von pcnerd
Bisher progge ich alle Server mit einer Mainloop,
z.B.

Code: Alles auswählen

repeat
if networkserverevent()=1
blabla
endif
if networkserverevent()=2
.
.
.
.
until quit=1
end
oder

Code: Alles auswählen

repeat
select networkserverevent()
 case 1
  .
   .
 case 2
   .
    .
 default
endselect
until quit=1
end
die die CPU voll auslastet. Ich meine, bei den Beispielen, läuft es ja
von aussen gesehen auf das selbe hinaus.
Ich wollte fragen, ob es nicht andere Möglichkeiten gibt ein Serverprogramm zu proggen, bei dem die CPU-Auslastung möglichst gering ist.

Verfasst: 02.10.2004 16:24
von Franky
Bau doch mal ein Delay(1) ein

Verfasst: 02.10.2004 20:08
von Icke
Am besten so damit deine Schleife bei Aktivität nich ausgebremst wird :

Code: Alles auswählen

If NetworkServerEvent()=0
  Delay(50)
EndIf 

Re: CPU-Auslastung beim Server reduzieren

Verfasst: 27.04.2023 17:33
von Taz
Sorry, das ich den alten Beitrag ausgrabe...
So einfach scheint es leider doch nicht zu sein, bzw. ja die CPU last singt!

ABER, beim verschicken vieler Nachrichten in folge, dauert das verschicken gut doppelt so lange.

In meiner Anwendung, geht die dauer von ca. 850ms auf 1700 ms hoch :roll:

Code: Alles auswählen

Event = NetworkServerEvent(#SVRID)
If Event
	...
Else
	Delay(1)
EndIf
Jemand ne Idee?

Re: CPU-Auslastung beim Server reduzieren

Verfasst: 27.04.2023 18:00
von NicTheQuick
Es ist keine gute Idee NetworkServerEvent() mehrmals in einer Schleife aufzurufen. Man macht das einmalig wie bei WaitWindowEvent() und arbeitet dann mit dem Rückgabewert.

Code: Alles auswählen

Select NetworkServerEvent(ServerID)
	Case #PB_NetworkEvent_None
		Delay(0)
	Case #PB_NetworkEvent_Data
		;Lies Daten
	Case #PB_NetworkEvent_Connect
		;Neue TCP-Verbindung
	Case #PB_NetworkEvent_Disconnect
		;TCP-Verbindung wurde geschlossen
EndSelect
Das Delay(0) sollte eigentlich ausreichen den Kontext-Switch der CPU zu triggern, damit andere Threads rankommen. Und wenn das nicht reicht, dann eben ein Delay(1), aber besser nicht höher. Wir müssen so nah an einem busy-wait dran bleiben wie möglich.

Wenn deine CPU dann immer noch zu sehr ausgelastet ist, versendest du entweder zu viele Daten, oder irgendwas anderes bringt deine CPU zum Glühen, aber der Teil sollte es nicht sein.

Re: CPU-Auslastung beim Server reduzieren

Verfasst: 28.04.2023 04:36
von Taz
Sorry, ich glaube meine Behauptung war falsch.
Der Fehler liegt wahrscheinlich in meinem Programm, ich muss das mal gründlich untersuchen :coderselixir:

Re: CPU-Auslastung beim Server reduzieren

Verfasst: 28.04.2023 23:14
von Qnode
Meine Güte, nun mach dich nicht künstlich klein! Aus Sicht eines Hobbyprogrammierers ist die Frage mehr als berechtigt!

Re: CPU-Auslastung beim Server reduzieren

Verfasst: 29.04.2023 12:26
von NicTheQuick
Wir sind auf jeden Fall neugierig darauf wo das Problem am Ende steckte. Das kannst du gerne nochmal ausführen. Dann kann jeder davon lernen.

Re: CPU-Auslastung beim Server reduzieren

Verfasst: 30.04.2023 00:30
von Taz
Werde ich machen, wobei das ganze Netzwerk Gedöns leider nicht wirklich einfach ist :coderselixir:

Meine Probleme die ich atm habe sind:
Entweder ist das ganz sau schnell, aber dann werden Pakete(Texte) vergessen/verschluckt...

Situation 1:
Der Client verschickt einfach mehrere Texte, ohne auf eine Antwort vom Server zu warten.
Der Server bekommt dann relativ schnell die Disconnect Message vom Client, und beendet die Verbindung, ohne alle Texte empfangen zu haben.

Situation 2:
Wartet der Client erst auf die Antwort vom Server, bevor der nächste Text verschickt wird dauert es um ein vielfaches länger, obwohl nur ein Byte als Bestätigung gesendet wird. :freak:

Re: CPU-Auslastung beim Server reduzieren

Verfasst: 30.04.2023 11:01
von HeX0R
Ich gehe mal davon aus, dass Du in Situation 1 den Rückgabewert von SendNetworkData() ignorierst.
Er kann nunmal nicht mehr Daten in den Ausgangspuffer schieben, als da reinpassen, bist Du am Anschlag, gibt SendNetworkData() eine -1 zurück.
Dann muss man üblichweise etwas warten und neu senden.

Allerdings muss man eigentlich auch schauen, warum da eine -1 zurück kam, das geht aber leider nur per OS API, siehe auch:
https://www.purebasic.fr/english/viewto ... 5&start=30