Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi Indy HTTP CPU Auslastung (https://www.delphipraxis.net/180238-indy-http-cpu-auslastung.html)

haentschman 4. Mai 2014 10:17


Indy HTTP CPU Auslastung
 
Moin alle...8-)

Ich habe einen Thread zum Datenabholen via HTTP je Gerät (entspricht einer Klasse). Heute habe ich ein 2. Gerät hinzugefügt (2. Instanz der Klasse) und bin über die CPU Auslastung gestolpert. Selbst mit einem Gerät ist die Auslastung während des Post rund 50%. (Taskmanager) Die Requests sind bei jedem Gerät u.U. ein wenig größer. Warum nehmen die Indys so viel Last?

Gibt es Möglichkeiten?

PS: Der Firefox nimmt auch so viel beim Refresh auf Google. :shock:

Quelltextauszug:
Delphi-Quellcode:
FHTTP:= TIdHTTP.Create;
  try
    FHTTP.OnWork:= DoOnWork;
    FHTTP.HandleRedirects:= True;
    FHTTP.Request.ContentType:= 'application/x-www-form-urlencoded';
    FHTTP.Request.CustomHeaders.Add(Cookie);
    try
      if Parameter = '' then
        FHTTP.Get(Link, ResponseStream)
      else
        FHTTP.Post(Link, ParameterStream, ResponseStream);
.
.
.
Bei der Geschwindigkeit mit der die Daten über die Leitung marschieren müßten sich die Kerne eigentlich langweilen... :roll:

Danke für Ideen, da ich bis zu 500 Geräte unterstützen will. ...ein Alptraum :(

mjustin 4. Mai 2014 10:50

AW: Indy HTTP CPU Auslastung
 
Hallo,

anhand des Codes läßt sich noch nicht viel sagen. Wenn jedes Gerät einen eigenen Thread und darin jeweils eine eigene Instanz von TIdHTTP verwendet, kann es dennoch zu Behinderungen der Threads untereinander kommen, zum Beispiel bei gemeinsamer Nutzung von VCL Objekten in der Methode DoOnWork. Ist bei nur einem aktiven HTTP POST die Belastung deutlich unter 50%? Falls ja, spricht das für Konkurrenzprobleme.

Ich würde das DoOnWork daher einfach einmal ausschalten und sehen ob die Last deutlich niedriger wird.

haentschman 4. Mai 2014 11:34

AW: Indy HTTP CPU Auslastung
 
Danke für deine Antwort.
Zitat:

Wenn jedes Gerät einen eigenen Thread und darin jeweils eine eigene Instanz von TIdHTTP verwendet
Das ist korrekt.
Zitat:

zum Beispiel bei gemeinsamer Nutzung von VCL Objekten in der Methode DoOnWork
DoOnWork hat keine Verwendung.
Zitat:

Ist bei nur einem aktiven HTTP POST die Belastung deutlich unter 50%
Nein. Das ist die Auslasung bei 1 Gerät. Bei 2 Geräten ist die Auslastung um die 90% :( Da kann man sogar nicht wirklich ein Fenster verschieben.

Ich hatte Breakpoints vor dem Post und danach. Bis der "danach" Breakpoint erreicht war stieg die Auslastung extrem an. Deswegen vermute ich das im Post bei großem Request.

Gibt es da Tricks oder Einstellungen? Die Google Suche hat mich nicht wirklich weitergebracht.

Sir Rufo 4. Mai 2014 11:39

AW: Indy HTTP CPU Auslastung
 
Das ein Browser Last erzeugt ist ja auch klar, denn der muss ja nicht nur die Daten von einem Server laden, sondern die Seite rendern und das kostet Leistung.

Hat mit diesem Problem also nichts zu tun ... es sei denn deine Netzwerkkarte blockiert das System

haentschman 4. Mai 2014 11:56

AW: Indy HTTP CPU Auslastung
 
Ist schon richtig...

Ich setzte mal nur zum Vergleich(nicht exakt):
1 HTTP Request mit 10KB Requestgröße -> 50% Auslastung 2 Sekunden
1 SQL - Masseninsert mit Firebird extern Table(549MB) -> 5 % Auslastung 15 Sekunden
...da stören mich einfach die Verhältnisse.

Beispiel:
Im Moment gibt es keine Datensätze. Die Anfrage braucht 2 Sekunden in der die Auslastung nach oben springt. Quasi für nix...
Delphi-Quellcode:
0
LOADOK
Ende: 2215 ms
Langsam drängt sich mir der Verdacht auf, daß das nicht die Indys sein können. Man stelle sich einen Download von 2 großen Dateien vor... :roll:

mjustin 4. Mai 2014 13:36

AW: Indy HTTP CPU Auslastung
 
Zitat:

Zitat von haentschman (Beitrag 1257841)
Bei der Geschwindigkeit mit der die Daten über die Leitung marschieren müßten sich die Kerne eigentlich langweilen... :roll:

Zum Vergleich würde ich ein POST auf andere Zielserver versuchen, die Formulare mit application/x-www-form-urlencoded entgegennehmen. So liesse sich feststellen ob es am Server liegt.

Mit relativ wenig Zeitaufwand liesse sich das auch mit Indy's HTTP Server machen, ein OnCommandGet Handler ist schnell geschrieben.

haentschman 4. Mai 2014 14:39

AW: Indy HTTP CPU Auslastung
 
Sooo...
ich habe dann mal den HTTP Post in eine leere Anwendung 1:1 (außer Events) übernommen. Eine Schleife darüber und laufen lassen.
Ergebnis: CPU Last = 0-1%
:shock:
Tschuldigung bei den Indys... :stupid:

Dann gibt es jetzt eine Auskommentierorgie.

:cheer: gefunden... Die Lösung ist so einfach, daß ich mich :duck:
Ich habe noch einen 2. Thread parallel. Bei diesem habe ich das Execute "vorbereitet" ohne wirklich die Proceduren zu füllen. Quasi nur den Rumpf. Dabei war aber eine while Schleife im Execute quasi ohne Inhalt. Das kann ja nicht funktionieren. Ein beherztes Sleep bis die Inhalte fertig sind... und gut.

Auslastung bei 2 Geräten: 0-1%

Tschuldigung für die Belästigung... :stupid:

DeddyH 4. Mai 2014 19:57

AW: Indy HTTP CPU Auslastung
 
Schön, dass wir mal drüber gesprochen haben :mrgreen:
Das kostet aber ein Bier auf den nächsten DT ;)

himitsu 4. Mai 2014 20:12

AW: Indy HTTP CPU Auslastung
 
Wenn man seinen Threads einen Namen gibt (Delphi-Referenz durchsuchenTThread.NameThreadForDebugging), dann sieht man im Debugger auch schöner was wozu gehört.

Mit dem immer besser werdenden Thread-Debugging findet man vermutlich auch solche Threads dann schneller.



Schön wäre es, wenn Emba den KlassenNamen+Komponentennamen der TThread-Klasse standardmäßig automatisch daran übergeben würde.

haentschman 5. Mai 2014 05:09

AW: Indy HTTP CPU Auslastung
 
Moin...8-)
Zitat:

Wenn man seinen Threads einen Namen gibt (Delphi-Referenz durchsuchenTThread.NameThreadForDebugging), dann sieht man im Debugger auch schöner was wozu gehört.
...die habe alle schöne Namen. Wenn man an der verkehrten Ecke sucht nützt das nicht viel :P


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:22 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz