Programmgeschwindigkeit steuern
Programmgeschwindigkeit steuern
Schönen Tag allerseits,
da ich keine Hilfe bei der Durchsicht des Forums bzw. Netzes gefunden habe, evtl. auch die falschen Suchbegriffe verwendet habe, stelle ich mal so die Frage.
Ich habe ein Programm, was quasi Tag und Nacht läuft. Kann man am besten mit einem Webcrawler vergleichen. Läuft seit Monaten stabil.
Nun habe ich das Problem, dass das Programm soviel Rechenleistung in Anspruch nimmt, dass die CPU sehr heiss wird. Im schlimmsten Fall schaltet sich der Computer aus.
Wie kann ich die CPU-Temperatur auslesen, um das Programm zu drosseln?
Bzw. gibt es eine Komponente/Unit für Lazarus, die ich zur Temperaturauslesung nutzen kann (ich habe im Netz nur den Ansatz zur Nutzung eines externen Programms gefunden, was in Abständen ein Protokoll ausgibt, wo ich dann diese dann auslesen könnte)?
Wie könnte ich alternativ, ohne die CPU-Temperatur auszulesen, das Programm gestalten, ohne dass die CPU zu stark beansprucht wird (wie macht ihr das)?
Danke!
da ich keine Hilfe bei der Durchsicht des Forums bzw. Netzes gefunden habe, evtl. auch die falschen Suchbegriffe verwendet habe, stelle ich mal so die Frage.
Ich habe ein Programm, was quasi Tag und Nacht läuft. Kann man am besten mit einem Webcrawler vergleichen. Läuft seit Monaten stabil.
Nun habe ich das Problem, dass das Programm soviel Rechenleistung in Anspruch nimmt, dass die CPU sehr heiss wird. Im schlimmsten Fall schaltet sich der Computer aus.
Wie kann ich die CPU-Temperatur auslesen, um das Programm zu drosseln?
Bzw. gibt es eine Komponente/Unit für Lazarus, die ich zur Temperaturauslesung nutzen kann (ich habe im Netz nur den Ansatz zur Nutzung eines externen Programms gefunden, was in Abständen ein Protokoll ausgibt, wo ich dann diese dann auslesen könnte)?
Wie könnte ich alternativ, ohne die CPU-Temperatur auszulesen, das Programm gestalten, ohne dass die CPU zu stark beansprucht wird (wie macht ihr das)?
Danke!
Code: Alles auswählen
type
TLiveSelection = (lsMoney, lsChilds, lsTime);
TLive = Array[0..1] of TLiveSelection;
-
- Beiträge: 6079
- Registriert: Do 21. Sep 2006, 07:51
- OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
- CPU-Target: AVR,ARM,x86(-64)
- Wohnort: Dessau
- Kontaktdaten:
Re: Programmgeschwindigkeit steuern
1. Deine Hardware ist defekt oder falsch eingestellt (Übertaktung...). Anders kann es nicht sein das sich ein rechner unter Last abschaltet.
Normalerweise solltest du das beheben, das wäre der richtige Weg.
2. Du kannst über Sensor Informationen Temperaturen herausbekommen das ist aber abhängig vom PC und Betriebsystem, über beides machst du keine Angaben.
3. Die Temperaturen nützen dir nochts solange du nicht weisst was deine Hardware aushält. Wenn du also wirklich so vorgehn willst stimmen die schwellen nur für das eine System.
Normalerweise solltest du das beheben, das wäre der richtige Weg.
2. Du kannst über Sensor Informationen Temperaturen herausbekommen das ist aber abhängig vom PC und Betriebsystem, über beides machst du keine Angaben.
3. Die Temperaturen nützen dir nochts solange du nicht weisst was deine Hardware aushält. Wenn du also wirklich so vorgehn willst stimmen die schwellen nur für das eine System.
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/
- af0815
- Lazarusforum e. V.
- Beiträge: 6766
- Registriert: So 7. Jan 2007, 10:20
- OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
- CPU-Target: 32Bit (64Bit)
- Wohnort: Burgenland
- Kontaktdaten:
Re: Programmgeschwindigkeit steuern
Wenn der Rechner in Ordnung ist, gibt es keine Probleme mit der Wärme.
Aufgefallene Punkte bei uns in der Firma bei der HW:
1) Verschmutzung, auch der Kühlkörper braucht manchmal Pflege
2) Alte spröde Wärmeleitpaste oder nicht richtig aufgebracht, Kühler locker
3) Experimente mit den CPU bzw. BIOS Einstellung. Ev. BIOS Defaults nehmen
4) Kabelverlegung behindert Kühlung
Bei der Software ist sich die Frage zu stellen ob die Struktur stimmt. Ev. Die Last auf mehrere Threads aufteilen. Profiling machen und die Lastverursacher identifizieren.
Aufgefallene Punkte bei uns in der Firma bei der HW:
1) Verschmutzung, auch der Kühlkörper braucht manchmal Pflege
2) Alte spröde Wärmeleitpaste oder nicht richtig aufgebracht, Kühler locker
3) Experimente mit den CPU bzw. BIOS Einstellung. Ev. BIOS Defaults nehmen
4) Kabelverlegung behindert Kühlung
Bei der Software ist sich die Frage zu stellen ob die Struktur stimmt. Ev. Die Last auf mehrere Threads aufteilen. Profiling machen und die Lastverursacher identifizieren.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).
-
- Lazarusforum e. V.
- Beiträge: 2808
- Registriert: Fr 22. Sep 2006, 10:38
- OS, Lazarus, FPC: Lazarus v2.0.10, FPC 3.2.0
- Wohnort: Hessen
- Kontaktdaten:
Re: Programmgeschwindigkeit steuern
Als einfache Variante würde mir einfallen, den Code über TTimer häppchenweise auszuführen. Eleganter wäre der kompliziertere Weg über Threads, die sich pausieren lassen.
- Euklid
- Euklid
Re: Programmgeschwindigkeit steuern
Danke an alle für die Anregungen!
Das ziehe ich erstmal nicht in Betracht, da ich das Programm auf diversen Rechnern laufen/getestet habe, die starke Belastung der CPU tritt überall auf bzw. ist ja auch gewollt, da hohe Rechen-/Vergleichsleistungen gefordert werden. Zumeist läuft es ja auch ohne Probleme, jedoch werden die CPUs halt zu heiss, was ich ja eben verhindern will!Deine Hardware ist defekt oder falsch eingestellt (Übertaktung...). Anders kann es nicht sein das sich ein rechner unter Last abschaltet.
Normalerweise solltest du das beheben, das wäre der richtige Weg.
Ich nutze eigentlich alles Windows Rechner mit 64Bit Betriebssystem (Linux habe ich mal probiert, habe ich allerdings zur Zeit nicht am laufen). Wenn es eine Windows-Abfrage gibt, wäre das für mich schon die Lösung und würde mich sehr interessieren!!! Eine CPU-spezifische Abfrage ist aus Kompatibilitätsgründen IMHO zu aufwendig (hatte schon in div. Foren dazu gelesen, dass spezifische Ports abgefragt werden müssten, ist aber bei anderer Rechnerstruktur dann jeweils verschieden).2. Du kannst über Sensor Informationen Temperaturen herausbekommen das ist aber abhängig vom PC und Betriebsystem, über beides machst du keine Angaben.
Ja genau das ist das Problem! Das Takten auf einen Rechner würde ich auch hinbekommen, doch würde ich das nicht jedesmal per Hand je Rechner festlegen müssen wollen!3. Die Temperaturen nützen dir nochts solange du nicht weisst was deine Hardware aushält. Wenn du also wirklich so vorgehn willst stimmen die schwellen nur für das eine System.
Wie gesagt, das Überhitzen tritt nicht allzu oft auf. Säubern tue ich meine Rechner gelegentlich, evtl. ist ein Teil des Ausfalls ja wirklich auf die ungenügende Wärmeabfuhr zurückzuführen. Doch das könnte ich ja mit einer gezielten Temperaturabgfrage im Vorfeld testen.Wenn der Rechner in Ordnung ist, gibt es keine Probleme mit der Wärme.
Aufgefallene Punkte bei uns in der Firma bei der HW:
1) Verschmutzung, auch der Kühlkörper braucht manchmal Pflege
2) Alte spröde Wärmeleitpaste oder nicht richtig aufgebracht, Kühler locker
3) Experimente mit den CPU bzw. BIOS Einstellung. Ev. BIOS Defaults nehmen
4) Kabelverlegung behindert Kühlung
Das mit den Threads, habe ich bisher noch nicht genutzt, werde ich mir mal anschauen (beim ersten googeln sieht das auf jeden Fall ganz interessant aus!). Danke für die Anregung!Bei der Software ist sich die Frage zu stellen ob die Struktur stimmt. Ev. Die Last auf mehrere Threads aufteilen. Profiling machen und die Lastverursacher identifizieren.
Mit Timern versuche ich gerade eine Lösung zu finden, doch habe ich dabei das Problem, dass die Performance darunter leidet. Ich müsste die Timerintervalle auf den langsamsten Rechner entsprechend anpassen. Daher war mein Wunsch-Ansatz diese anhand der CPU-Tempertur hoch- bzw. runter zu stellen.Als einfache Variante würde mir einfallen, den Code über TTimer häppchenweise auszuführen. Eleganter wäre der kompliziertere Weg über Threads, die sich pausieren lassen.
Code: Alles auswählen
type
TLiveSelection = (lsMoney, lsChilds, lsTime);
TLive = Array[0..1] of TLiveSelection;
-
- Beiträge: 3444
- Registriert: Mo 11. Sep 2006, 10:24
- OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
- CPU-Target: X32 / X64 / ARMv5
- Wohnort: Krefeld
Re: Programmgeschwindigkeit steuern
Die Hardware eines Rechners ist vom Hersteller so ausgelegt, dass die CPU nicht überhitzt - sofern die Hardware in Ordnung und richtig eingestellt ist und die Umgebungstemperatur nicht über Zimmertemperatur liegt.
Alles andere wäre ein Reklamations-Grund.
-Michael
Alles andere wäre ein Reklamations-Grund.
-Michael
-
- Beiträge: 6079
- Registriert: Do 21. Sep 2006, 07:51
- OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
- CPU-Target: AVR,ARM,x86(-64)
- Wohnort: Dessau
- Kontaktdaten:
Re: Programmgeschwindigkeit steuern
Das einfachste wäre deine Abfragen mit nem Application.Processmessages oder sleep zu versehn.
Damit verlangsamst du dein Programm unabhängig von Temperaturen. Temperaturen kannst du unter Windows über WMI auslesen.
Damit verlangsamst du dein Programm unabhängig von Temperaturen. Temperaturen kannst du unter Windows über WMI auslesen.
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/
-
- Beiträge: 298
- Registriert: Di 23. Nov 2010, 23:41
- OS, Lazarus, FPC: Ubuntu/Win, Lazarus trunk, FPC trunk
- CPU-Target: 32Bit/64Bit
- Wohnort: Geldern
- Kontaktdaten:
Re: Programmgeschwindigkeit steuern
Mal abgesehen davon das es in der Überschrift um die Steuerung der Programmgeschwindigkeit geht, wir haben unterschiedlich alte Server im Einsatz, die fast durchgängig an der Leistungsgrenze betrieben werden, sicher gibt es bei denen hin und wieder Ausfälle (defekte Hardware), aber das wegen Dauerlast ein Rechner überhitzt kann normalerweise nur durch die Wahl falsche Komponenten, Bauteilefehler oder Verschmutzung passieren.
Übrigens wenn Du so eine Art Crawler am laufen hast und wenn der noch in Free Pascal programmiert ist, was musst Du für eine Leitung haben um Deinen Rechner so stark zu belasten, also wenn ich meinen Crawler loslasse ist die Leitung das Problem, mein drei Jahre alter Quad-Core auf der Arbeit kommt da gerade mal auf ~15-20% Auslastung?
Nun gehen wir mal davon aus, Du möchtest mit Übertaktung Spitzen abfangen
, wie sieht es denn mit CPU-Auslastung aus, die ist im Eigentlichen relevant, wenn die grenzwertig ist (also bei Übertaktung) hilft auch kein Verteilen auf Prozesse oder Threads. Im Netz finden sich einige Leute die sich Gedanken zur Ermittelung der "CPUUsage" gemacht haben, einfach mal stöbern z.B.:
http://www.swissdelphicenter.ch/torry/s ... php?id=969
http://www.delphipraxis.net/113853-cpu- ... lesen.html
...
Falls die CPU-Auslastung dann Grenzwertig ist könntest Du Dein Programm dann ja drosseln!
Natürlich gibt es auch die Möglichkeit Temperaturen auszulesen aber das halte ich persönlich nicht für zielführend:
http://www.entwickler-ecke.de/topic_CPU ... 136,0.html
Übrigens wenn Du so eine Art Crawler am laufen hast und wenn der noch in Free Pascal programmiert ist, was musst Du für eine Leitung haben um Deinen Rechner so stark zu belasten, also wenn ich meinen Crawler loslasse ist die Leitung das Problem, mein drei Jahre alter Quad-Core auf der Arbeit kommt da gerade mal auf ~15-20% Auslastung?
Nun gehen wir mal davon aus, Du möchtest mit Übertaktung Spitzen abfangen

http://www.swissdelphicenter.ch/torry/s ... php?id=969
http://www.delphipraxis.net/113853-cpu- ... lesen.html
...
Falls die CPU-Auslastung dann Grenzwertig ist könntest Du Dein Programm dann ja drosseln!
Natürlich gibt es auch die Möglichkeit Temperaturen auszulesen aber das halte ich persönlich nicht für zielführend:
http://www.entwickler-ecke.de/topic_CPU ... 136,0.html
MfG Gocher
akt. Projekt: Webserver(HTTPS HTTP/2) mit integrierten CMS in Free Pascal - www.gocher.me
akt. Projekt: Webserver(HTTPS HTTP/2) mit integrierten CMS in Free Pascal - www.gocher.me
-
- Beiträge: 657
- Registriert: Sa 9. Jan 2010, 17:32
- OS, Lazarus, FPC: Linux 2.6.x, SVN-Lazarus, FPC 2.4.0-2
- CPU-Target: 64Bit
Re: Programmgeschwindigkeit steuern
Du kannst den Rechner auch künstlich untertakten. Das hab' ich bei meinem Laptop gemacht, der ständig zu heiß geworden ist und ich dadurch abgeschalten hat.
Im Dateisystem unter /sys/bus/cpu/devices/cpu0/cpufreq (bei Mehrkernern auch noch cpu1, cpu2 und cpu3) findest du folgende Dateien:
Dort kannst du cpuinfo_max_freq von in meinem Fall 3200000 auf 800000 runtersetzen. Dann taktet der Rechner auch unter Volllast nicht mehr hoch.
Im Dateisystem unter /sys/bus/cpu/devices/cpu0/cpufreq (bei Mehrkernern auch noch cpu1, cpu2 und cpu3) findest du folgende Dateien:
Code: Alles auswählen
affected_cpus
bios_limit
cpb
cpuinfo_cur_freq
cpuinfo_max_freq
cpuinfo_min_freq
cpuinfo_transition_latency
related_cpus
scaling_available_frequencies
scaling_available_governors
scaling_cur_freq
scaling_driver
scaling_governor
scaling_max_freq
scaling_min_freq
scaling_setspeed
-
- Beiträge: 725
- Registriert: Do 27. Sep 2012, 00:07
- OS, Lazarus, FPC: Win10Pro-64Bit, Immer letzte Lazarus Release mit SVN-Fixes
- CPU-Target: x86_64-win64
- Wohnort: Hamburg
Re: Programmgeschwindigkeit steuern
Ich habe auch so ein Computer (liegt in Keller), schlecht gekühlt und nach erreichen des maximalen zulässigen CPU-Temperaturs schaltet es sich ab, meistens bei Spielen.
Du kannst wie ich damals entweder mit einem Programm, das Temperaturen anzeigt maximale zulässige Temperatur messen oder gleich bei CPU-Spezifikationen nachlesen. Für Belastungstests eignen sich mehrere Flashfilme gleichzeitig laufen lassen sehr gut (Youtube).
Da dein Programm Crawler ist, kann es auch sein, dass Festplatten sich überhitzen.
Wenn es nicht kritsch ist, würde ich als einfache Lösung nach bestimmte Zeit oder Schleifendurchlauf das Programm mit Sleep einige Zeit schlafen lassen und Application.Processmessages aufrufen.
Manchmal ist einfache Lösung die Beste
Du kannst wie ich damals entweder mit einem Programm, das Temperaturen anzeigt maximale zulässige Temperatur messen oder gleich bei CPU-Spezifikationen nachlesen. Für Belastungstests eignen sich mehrere Flashfilme gleichzeitig laufen lassen sehr gut (Youtube).
Da dein Programm Crawler ist, kann es auch sein, dass Festplatten sich überhitzen.
Wenn es nicht kritsch ist, würde ich als einfache Lösung nach bestimmte Zeit oder Schleifendurchlauf das Programm mit Sleep einige Zeit schlafen lassen und Application.Processmessages aufrufen.
Manchmal ist einfache Lösung die Beste

Re: Programmgeschwindigkeit steuern
Vielen Dank an alle für die Impressionen!
Wird also nicht ganz so leicht, wie ich ursprünglich dachte. CPUs generell runtertakten werde ich nicht, da ich das dann auf allen Rechnern tun müsste, wäre mir eine "Sleep"-Variante lieber, also mein Programm künstlich langsamer machen!
Ich werd aber erst mal testen, ob ich über WMI das Problem lösen kann. Habe aber, wenn ich das richtig gelesen habe, das Problem, dass WMI nur von bestimmten Boards unterstützt wird, na mal sehen.
Weiter habt ihr mich auf die Idee gebracht, den Ablauf des Progs anders zu gestalten. Zur Zeit habe ich verschiedene Teile des Progs in dem zum einen auf Webserver zugegriffen wird und zum anderen in dem er Daten auswertet. Diese Teile laufen immer nacheinander ab und das könnte ich anders organisieren. Somit könnte der Rechner die Zeit von der Anfrage an den Webserver bis zu dessen Antwort als "Ruhezeit" nutzen (evtl. genügt das ja). Werde auch das versuchen umzusetzen
Nochmals danke!
Wird also nicht ganz so leicht, wie ich ursprünglich dachte. CPUs generell runtertakten werde ich nicht, da ich das dann auf allen Rechnern tun müsste, wäre mir eine "Sleep"-Variante lieber, also mein Programm künstlich langsamer machen!


Ich werd aber erst mal testen, ob ich über WMI das Problem lösen kann. Habe aber, wenn ich das richtig gelesen habe, das Problem, dass WMI nur von bestimmten Boards unterstützt wird, na mal sehen.
Weiter habt ihr mich auf die Idee gebracht, den Ablauf des Progs anders zu gestalten. Zur Zeit habe ich verschiedene Teile des Progs in dem zum einen auf Webserver zugegriffen wird und zum anderen in dem er Daten auswertet. Diese Teile laufen immer nacheinander ab und das könnte ich anders organisieren. Somit könnte der Rechner die Zeit von der Anfrage an den Webserver bis zu dessen Antwort als "Ruhezeit" nutzen (evtl. genügt das ja). Werde auch das versuchen umzusetzen



Nochmals danke!
Code: Alles auswählen
type
TLiveSelection = (lsMoney, lsChilds, lsTime);
TLive = Array[0..1] of TLiveSelection;
-
- Beiträge: 7
- Registriert: Do 6. Jun 2013, 00:30
Re: Programmgeschwindigkeit steuern
Ist der Code eigentlich zugänglich?
-
- Beiträge: 3444
- Registriert: Mo 11. Sep 2006, 10:24
- OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
- CPU-Target: X32 / X64 / ARMv5
- Wohnort: Krefeld
Re: Programmgeschwindigkeit steuern
Wenn Du da aktive Polling Warte-Schleifen eingebaut hast, ist das sowieso ganz schlechter Programmier-Stil (für "embedded" Software) !Michl hat geschrieben:... wäre mir eine "Sleep"-Variante lieber ... Somit könnte der Rechner die Zeit von der Anfrage an den Webserver bis zu dessen Antwort als "Ruhezeit" ...
Darunter leidet die Performance des Programms (da die für das Polling in Deinem Programm verbratenen CPU-Zyklen der Funktionalität, auf die Du wartest, verloren gehen können) und außerdem werden alle anderen Programme auf dem Rechner (auch System-Programme) behindert. Abgesehen davon wird dadurch natürlich auch unnötig Energie verbraten (wenn das Betriebssystem, die CPU und das Board "Energie-Sparen bei Idle" unterstützen, was bei modernen Systemen aber gegeben sein sollte).
Also bitte Ereignis-orientiert programmieren: Niemals aktive Warteschleifen bauen. Wenn Du auf Ereignis warten willst und gleichzeitig andere Sachen laufen sollen, müssen eben Threads verwendet werden, die dann immer in "blocking" System-Funktionen warten (z.B. Warten auf Daten eines TCP/IP Sockets). Dadurch wird natürlich automatisch "die Zeit von der Anfrage an den Webserver bis zu dessen Antwort" nicht durch das Programm Energie-intensiv "vernichtet".
"Sleep" ist nur eine Notlösung, die im Prinzip funktioniert, (wenn die Zeit nicht zu kurz gewählt wird) aber die Latenz (Reaktionszeit des Programms) entsprechend erhöht.
-Michael