CPU-Auslastung beim Server reduzieren

Für allgemeine Fragen zur Programmierung mit PureBasic.
pcnerd
Beiträge: 7
Registriert: 30.09.2004 17:42

CPU-Auslastung beim Server reduzieren

Beitrag 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.
Benutzeravatar
Franky
Beiträge: 1132
Registriert: 29.08.2004 16:31
Wohnort: Münsterland
Kontaktdaten:

Beitrag von Franky »

Bau doch mal ein Delay(1) ein
Falsch zugeordnetes Zitat des Tages: "O'zapft is" - Edward Snowden :)
Icke
Beiträge: 143
Registriert: 08.09.2004 13:19

Beitrag von Icke »

Am besten so damit deine Schleife bei Aktivität nich ausgebremst wird :

Code: Alles auswählen

If NetworkServerEvent()=0
  Delay(50)
EndIf 
Taz
Beiträge: 27
Registriert: 20.01.2018 18:24
Wohnort: NRW

Re: CPU-Auslastung beim Server reduzieren

Beitrag 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?
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8807
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: CPU-Auslastung beim Server reduzieren

Beitrag 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.
Taz
Beiträge: 27
Registriert: 20.01.2018 18:24
Wohnort: NRW

Re: CPU-Auslastung beim Server reduzieren

Beitrag von Taz »

Sorry, ich glaube meine Behauptung war falsch.
Der Fehler liegt wahrscheinlich in meinem Programm, ich muss das mal gründlich untersuchen :coderselixir:
Benutzeravatar
Qnode
Beiträge: 85
Registriert: 19.07.2018 20:41
Computerausstattung: i5, 16GB RAM, Win10, PureBasic 6.00 (Windows - x64)

Re: CPU-Auslastung beim Server reduzieren

Beitrag von Qnode »

Meine Güte, nun mach dich nicht künstlich klein! Aus Sicht eines Hobbyprogrammierers ist die Frage mehr als berechtigt!
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8807
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: CPU-Auslastung beim Server reduzieren

Beitrag 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.
Taz
Beiträge: 27
Registriert: 20.01.2018 18:24
Wohnort: NRW

Re: CPU-Auslastung beim Server reduzieren

Beitrag 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:
Benutzeravatar
HeX0R
Beiträge: 3040
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win11 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2 + 3
Kontaktdaten:

Re: CPU-Auslastung beim Server reduzieren

Beitrag 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
Antworten