Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   CPU Auslastung 100% (https://www.delphipraxis.net/160625-cpu-auslastung-100-a.html)

-187- 23. Mai 2011 12:38

CPU Auslastung 100%
 
Moin,

ich habe zur Zeit Probleme mit einer sehr hohen CPU Auslastung (90%-100%)! Die Software ist eine Weiterentwicklung aus Tagen in denen ich vielleicht noch nicht so ganz sauberen Code geschrieben habe :] Auch einige Lösungen sind zugegebenerweise Mist. However,

...für eine Neustrukturierung fehlt mir momentan die Zeit! Ich sollte es aber unbedingt in Betracht ziehen.

Um mein Problem jetzt zeitnah zu lösen möchte ich einfach mal eure Ideen zur Vorgehensweise bei solchen Problemen hören.

Ganz kurze Software Erklärung:
Die Software benutzt einige Threads (10-20) um aus dem Internet Daten abzurufen und diesen dann gleich weiterzuverarbeiten. Anschließend werden die Daten in eine Firebird Datenbank schreiben. Die Threads benutzen ein Synchronize um die Datenbank zu beschreiben.

Ich poste hier keinen Code da ich nicht nach der Lösung direkt frage, sondern nach möglichen Ansätzen, bzw. Tools die euch bei der Fehlersuche helfen.

-187-

blackfin 23. Mai 2011 12:40

AW: CPU Auslastung 100%
 
100% CPU-Last riecht fast immer nach einer bösen Schleife :-D
Oder zuviele Worker-Threads gleichzeitig, die das System lahmlegen.
Wenn dies der Fall ist, dann die Berechnungs-Funktionen als "quick 'n dirty fix" in den Threads vielleicht mit ein paar sleep-befehlen verlangsamen.

Ohne aber näher zu wissen, was das Programm genau macht und wo die Engpässe sind, ist das schwer zu sagen :-D

Namenloser 23. Mai 2011 13:26

AW: CPU Auslastung 100%
 
Hast du mal den SamplingProfiler darauf angesetzt? Ist sehr nützlich, wenn man rausfinden will, wo am meisten Zeit verbraten wird. Nicht vergessen, vorher vom Compiler MAP-Daten erzeugen zu lassen.

Nochwas: Warum nutzen die Threads Synchronize, um in die Datenbank zu schreiben? Eigentlich sollte ein DBMS ohne Probleme mit parallelen Zugriffen von mehreren Prozessen (also auch Threads) zurechtkommen. Mit Synchronize handelst du dir das Problem ein, dass du Code in den Hauptthread verlagerst, der dann oft zum Flaschenhals wird.

-187- 23. Mai 2011 19:28

AW: CPU Auslastung 100%
 
Hmm so richtig hilft mir der Sampling Profiler nicht bzw. versteh ich wahrscheinlich nicht wie man ihn richtig benutzt.

Ich kann jetzt zum Beispiel nach einem kurzen Lauf erkennen:

user32.dll Samples 35362 Local Ratio 75,94 %
mytool.exe Samples 1419 Local Ratio 3,05%
mytool.exe - System Samples 1143 Local Ratio 80,55%
mytool.exe - System - Move Samples 589 Local Ratio 51,53%
mytool.exe - System - Move - Line 9 Samples 589 Local Ratio 100%

Aber den Ursprung des Fehlers kann ich nicht wirklich ermitteln :D

Namenloser 23. Mai 2011 19:35

AW: CPU Auslastung 100%
 
Naja, zumindest siehst du so schon mal, dass die meiste CPU-Zeit nicht in deinem eigenen Code verbraten wird, sondern in User32.dll. Jetzt musst du dir überlegen, welche API-Funktionen aus dieser DLL daran Schuld sein könnten. Welche rufst du besonders oft auf? Wie könntest du die Anzahl dieser Aufrufe reduzieren?

Mehr kann ich aus den Daten, die du geliefert hast auch nicht ableiten (das sind aber sicher auch nicht alle).

omata 23. Mai 2011 19:36

AW: CPU Auslastung 100%
 
Zitat:

Zitat von -187- (Beitrag 1102408)
... den Ursprung des Fehlers kann ich nicht wirklich ermitteln :D

Nacheinander alles auskommentieren, bis die hohe CPU-Auslastung verschwunden ist. Dann langsam wieder einkommentieren...

-187- 23. Mai 2011 20:37

AW: CPU Auslastung 100%
 
Hmm mir ist noch was aufgefallen: Das Problem scheint erst nach einer gewissen Zeit aufzutreten (30min)... Jedesmal solange zu warten wäre Wahnsinn :)

Gibt es noch einen anderen "Monitor" der etwas aussagekräftiger ist?

SirThornberry 24. Mai 2011 12:18

AW: CPU Auslastung 100%
 
So ganz verstehe ich das Problem nicht.
100% Auslastung ist doch gut wenn dein Programm etwas macht. Was bringen dir zum Beispiel 50% Auslastung wenn das Programm dafür doppelt so lange benötigt.
100% Auslastung wären erst dann ein Problem wenn das Programm eigentlich nichts macht und trotzdem diese Auslastung verursacht.

-187- 24. Mai 2011 18:32

AW: CPU Auslastung 100%
 
Liste der Anhänge anzeigen (Anzahl: 1)
Das hätte ich vielleicht dazu sagen sollen - Die 100% Auslastung sind nicht gerechtfertigt! Selbst wenn das Programm mit allem durch ist bleibt die Auslastung auf 100%.

Ich hab mal ein ScreenShot vom Sampling Profiler angehängt.

-187- 27. Mai 2011 17:46

AW: CPU Auslastung 100%
 
Wooohooo :thumb: Fehler gefunden!

Ich glaube ich hab den kompletten Source umgewühlt und an allen möglichen Stellen gesucht und einfach nichts gefunden. Bis ich dann nochmal über die Schleifen geschaut habe. Sinn des folgenden loops war es das letzte Vorkommnis zu finden:

Delphi-Quellcode:
while Pos('abcde',TempStr)>0 do
begin
  Pos1:=Pos('abcde',TempStr);
  Pos2:=PosEx('xyz',TempStr,Pos1+5);
  myResultStr:=Copy(TempStr,Pos1+5,Pos2-(Pos1+5));
  TempStr:=Copy(TempStr,Pos2,Length(TempStr));
end;
Was ich dabei nicht bedacht hatte ist das ich eine Endlosschleife habe sobald Pos2 nicht gefunden wurde (Pos2=0)! Deswegen habe ich den Code um folgende Zeile erweitert.

Delphi-Quellcode:
if Pos2=0 then break;


Okay soviel dazu... Noch eine kleine Anmerkung: Auf meiner Suche nach möglichen externen Fehler Analyse Tools bin ich auf den ASMProfiler gestoßen. Finde das Tool klasse und erwähnenswert -> Ich werde es in Zukunft weiterhin einsetzen ;)

Ciao


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:10 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