AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

CPU Auslastung 100%

Ein Thema von -187- · begonnen am 23. Mai 2011 · letzter Beitrag vom 27. Mai 2011
Antwort Antwort
Seite 1 von 2  1 2      
-187-

Registriert seit: 24. Sep 2005
483 Beiträge
 
Delphi 2010 Architect
 
#1

CPU Auslastung 100%

  Alt 23. Mai 2011, 12:38
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-
  Mit Zitat antworten Zitat
blackfin
(Gast)

n/a Beiträge
 
#2

AW: CPU Auslastung 100%

  Alt 23. Mai 2011, 12:40
100% CPU-Last riecht fast immer nach einer bösen Schleife
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

Geändert von blackfin (23. Mai 2011 um 12:45 Uhr)
  Mit Zitat antworten Zitat
Namenloser

Registriert seit: 7. Jun 2006
Ort: Karlsruhe
3.724 Beiträge
 
FreePascal / Lazarus
 
#3

AW: CPU Auslastung 100%

  Alt 23. Mai 2011, 13:26
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.
  Mit Zitat antworten Zitat
-187-

Registriert seit: 24. Sep 2005
483 Beiträge
 
Delphi 2010 Architect
 
#4

AW: CPU Auslastung 100%

  Alt 23. Mai 2011, 19:28
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
  Mit Zitat antworten Zitat
Namenloser

Registriert seit: 7. Jun 2006
Ort: Karlsruhe
3.724 Beiträge
 
FreePascal / Lazarus
 
#5

AW: CPU Auslastung 100%

  Alt 23. Mai 2011, 19:35
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).
  Mit Zitat antworten Zitat
omata

Registriert seit: 26. Aug 2004
Ort: Nebel auf Amrum
3.154 Beiträge
 
Delphi 7 Enterprise
 
#6

AW: CPU Auslastung 100%

  Alt 23. Mai 2011, 19:36
... den Ursprung des Fehlers kann ich nicht wirklich ermitteln
Nacheinander alles auskommentieren, bis die hohe CPU-Auslastung verschwunden ist. Dann langsam wieder einkommentieren...
  Mit Zitat antworten Zitat
-187-

Registriert seit: 24. Sep 2005
483 Beiträge
 
Delphi 2010 Architect
 
#7

AW: CPU Auslastung 100%

  Alt 23. Mai 2011, 20:37
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?
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#8

AW: CPU Auslastung 100%

  Alt 24. Mai 2011, 12:18
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.
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
-187-

Registriert seit: 24. Sep 2005
483 Beiträge
 
Delphi 2010 Architect
 
#9

AW: CPU Auslastung 100%

  Alt 24. Mai 2011, 18:32
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.
Miniaturansicht angehängter Grafiken
samplingprofiler.png  
  Mit Zitat antworten Zitat
-187-

Registriert seit: 24. Sep 2005
483 Beiträge
 
Delphi 2010 Architect
 
#10

AW: CPU Auslastung 100%

  Alt 27. Mai 2011, 17:46
Wooohooo 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.

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
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:57 Uhr.
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