Ich spreche speziell von einem C # .NET 4-Programm, das unter Windows XP oder höher ausgeführt wird, aber auch allgemeine Antworten sind akzeptabel.
Nehmen Sie ein bereits optimiertes und effizientes Programm an. Das Problem liegt hier ausschließlich an den Auswirkungen einer hohen CPU-Auslastung auf die Hardware und daran, ob ein stark ausgelastetes Programm gedrosselt werden sollte, um den Verschleiß zu verringern, und nicht daran, ob meine Implementierung effizient ist.
Ein Kollege schlug heute vor, dass ich bei meinen Datenladeprozessen keine 100% ige CPU-Auslastung anstreben sollte, da "moderne CPUs billig sind und sich bei 100% CPU schnell verschlechtern".
Ist das wahr? Und wenn ja, warum? Früher hatte ich den Eindruck, dass eine 100% ige CPU-Auslastung für einen intensiven oder langen Betrieb vorzuziehen war, und ich konnte auch keine seriösen Quellen zu diesem Thema finden.
quelle
Antworten:
Wenn die Kühlung nicht ausreicht, kann es zu einer Überhitzung der CPU kommen. Aber alle (zumindest alle modernen PC-CPUs) verfügen über verschiedene Wärmeschutzmechanismen, die die Taktfrequenz drosseln oder letztendlich abschalten.
Ja, auf einem staubigen Laptop kann eine 100% ige CPU-Auslastung vorübergehende Probleme verursachen, aber nichts wird kaputt gehen oder sich verschlechtern (was auch immer das bedeutet).
Bei CPU-gebundenen Problemen ist eine CPU-Auslastung von 100% der richtige Weg.
Die Reaktionsfähigkeit der Anwendung (UI) unterscheidet sich von der CPU-Auslastung. Es ist durchaus möglich, dass eine Anwendung nicht mehr reagiert und 1% der CPU verwendet, oder dass eine ansprechende Anwendung 100% der CPU verwendet. Die Reaktionsfähigkeit der Benutzeroberfläche hängt vom Arbeitsaufwand im Benutzeroberflächenthread und der Priorität des Benutzeroberflächenthreads im Vergleich zu anderen Threads ab.
quelle
Windows-Programme (Winforms / WPF) sollten jederzeit reagieren. Mit einer naiven Implementierung eines Prozesses, der zu 100% CPU-Ressourcen nutzt, ist es allzu einfach, Ihr Programm oder sogar Ihr System träge und ins Stocken geraten zu lassen.
Bei einer guten Implementierung (z. B. Verwendung eines separaten Threads mit niedrigerer Priorität) sollte dies kein Problem darstellen.
Sie sollten sich keine Sorgen machen, dass Ihre CPU früher kaputt geht.
quelle
Es ist im Allgemeinen nichts Falsches an einem Programm mit 100% CPU, während es tatsächlich nützliche Arbeit leistet und keine Zeit von etwas Wichtigerem wegnimmt . Wenn eine bestimmte Hardwareplattform z. B. nur eine Sekunde lang 100% CPU ununterbrochen nutzen kann, bevor sie auf 50% drosseln muss, um eine Überhitzung zu vermeiden, ist es im Allgemeinen besser, wenn eine Anwendung nützliche Arbeit leistetum so schnell wie möglich zu laufen und die CPU oder das Betriebssystem die nötige Drosselung ausführen zu lassen, damit eine Anwendung erraten kann, wie schnell sie laufen sollte. Wenn eine Anwendung oder ein Thread Arbeiten mit niedriger Priorität ausführen muss, die nützlich, aber zu keinem Zeitpunkt kritisch sind, kann es für das Betriebssystem hilfreich sein, die CPU-Auslastung für Aufgaben mit niedriger Priorität auf 50% zu beschränken, damit die CPU dies tun kann, wenn dies erforderlich ist Etwas schnell wird es bereit sein, für eine Sekunde zu "sprinten", aber die Anwendung sollte sich nicht um solche Dinge kümmern, außer eine niedrige Thread-Priorität anzufordern.
Die größten Situationen, in denen es schlecht ist, 100% CPU zu nutzen, sind entweder:
Die Anwendung wartet auf ein Ereignis, das nicht durch ständige Abfragen beschleunigt wird [und möglicherweise verzögert wird, wenn der Aufwand für die Überprüfung, ob die Aufgabe erledigt ist, CPU-Ressourcen belegt, die ansonsten für die Ausführung der Aufgabe aufgewendet werden könnten ].
Die Anwendung zeichnet die Anzeige übermäßig oft neu. Die Definition von "übermäßig häufig" hängt in gewissem Maße von der Art des Anzeigegeräts und dem angezeigten Inhalt ab. Wenn die Anzeigehardware 120 fps anzeigen kann, kann es vorkommen, dass Animationen mit 120 fps ohne Bewegungsunschärfe angezeigt werden, bei niedrigeren Bildraten jedoch nicht sauber angezeigt werden können, ohne sie hinzuzufügen. Wenn das Rendern eines Frames mit Bewegungsunschärfe viel länger dauern würde als das Rendern ohne, dann könnte das Rendern mit 120 fps auf Hardware, die dies unterstützt, nicht teurer sein als das Rendern mit einer langsameren Framerate mit Bewegungsunschärfe. [Einfache Situation: Ein Rad mit 29 Speichen, das sich mit einer Umdrehung pro Sekunde dreht. Bei 120 fps scheint sich das Rad mit der richtigen Geschwindigkeit und Richtung zu drehen. bei 60 fps
Ersteres ist deutlich als schlecht zu erkennen. Der zweite ist etwas subtiler. Wenn man auf eine mobile Plattform abzielt, kann es in einigen Fällen wünschenswert sein, Benutzern die Auswahl der gewünschten Animationsbildrate zu ermöglichen, da sich einige Benutzer möglicherweise keine Sorgen um die Akkulaufzeit machen, aber die beste Animationsqualität wünschen, während andere eine geringere Qualität akzeptieren würden Animation im Austausch für eine bessere Akkulaufzeit. Anstatt die Anwendung versuchen zu lassen, zu erraten, wo der Kompromiss sein sollte, kann es hilfreich sein, ihn vom Benutzer anpassen zu lassen.
quelle
"Moderne CPUs sind billig und werden sich bei 100% CPU schnell verschlechtern".
Ich glaube nicht, dass irgendjemand den "Degrade" -Teil dieser Frage angesprochen hat. ICs werden schlechter, wenn die Die-Temperatur die Herstellergrenzen überschreitet. ICs sind normalerweise für einen Betrieb bis 125 ° C ausgelegt, obwohl jede Erhöhung um 10 ° C die Lebensdauer um 50% verkürzt.
Prozessoren hatten nicht immer eine Wärmeregulierung. Dann hatten einige AMD Durons Probleme (angeblich war es möglich, eines zu zerstören, wenn es ohne Kühlkörper betrieben wurde). Jetzt verfügen alle PC-Prozessoren über eingebaute Temperatursensoren, die in die CPU-Uhr zurückspeisen und die Uhr verlangsamen, um Schäden zu vermeiden. Sie können also feststellen, dass Ihr Programm 100% der verfügbaren CPU verwendet, die CPU jedoch nur mit 75% ihrer Nenndrehzahl läuft, da die Kühlung unzureichend ist.
Innerhalb eines Anwenderprogramms ist nicht der richtige Ort, um zu versuchen, den CPU-Verbrauch zu verwalten. Im Allgemeinen sollte Ihr Programm abwechselnd so schnell wie möglich arbeiten und angehalten auf Eingaben oder Festplattenzugriff warten. Sie sollten es nach Möglichkeit vermeiden, zu lange zu warten und die Sperre zu aktivieren. Dies geschieht jedoch aus Höflichkeit für den Rest des Systems.
Sowohl Windows als auch Linux verfügen über CPU- "Govenor" -Systeme, die Leistung und Wärmemanagement gewährleisten. Da dies auf Betriebssystemebene erfolgt, kann der gesamte CPU-Verbrauch des Systems berücksichtigt werden. Es liegt in der Verantwortung des Betriebssystems, die Hardware zu verwalten und zu verhindern, dass Benutzerprogramme sie missbrauchen. Es liegt in der Verantwortung der Hardware Eigentümer die Fans sauber und funktionstüchtig, und dem Hersteller zu halten ausreichend Kühlkörper und Lüfter in erster Linie zu passen.
Es gibt einige Fälle, in denen Geräte nicht ausreichend gekühlt werden, aber eine Flut von Rückläufern lehrt die Hersteller, dies nicht zu tun.
quelle
Um den Verfechter des Teufels zu spielen: In gewisser Weise kann ein Programm, das nicht zu 100% ausgelastet ist, zu einem schlechteren Verschleiß führen: Wenn es nicht während eines Tastenanschlags angehalten wird, wird es wahrscheinlich die meiste Zeit angehalten, um auf Festplatten-E / A zu warten. Und bei Platten handelt es sich (noch immer) um große mechanische Geräte, die beim Bewegen mechanischem Verschleiß oder der Gefahr von Erschütterungen / Kreiseleffekten ausgesetzt sind, ganz zu schweigen vom Stromverbrauch.
quelle
Sie müssen sich überhaupt nicht um "CPU-Degradation" kümmern. Moderne CPUs sind nicht minderwertig als früher.
Es ist sehr teuer (und wird alle paar Jahre teurer), CPUs herzustellen, einige Milliarden für den Bau einer neuen Fabrik sind keine Seltenheit (siehe Link).
http://en.wikipedia.org/wiki/Semiconductor_fabrication_plant
Die Produktionskosten einer CPU hängen höchstens von der Nr. Ab. der produzierten Einheiten. Dies ist eine bekannte Tatsache in der Wirtschaft. Das ist der Grund, warum sie (relativ) "billig" verkauft werden können. (Ich denke, hier ist kein Link notwendig)
Ich kann eine Reihe von Gründen nennen, warum ich moderne CPUs als tendenziell hochwertiger als früher ansah.
Aber nur das Wichtigste: Vorteile beim Testen. Moderne Elektronik ist "für den Test ausgelegt". Ob Software oder Hardware, die umfassende Einsicht, Tests über fast alles andere zu bewerten, ist noch nicht so alt. Bei CPUs werden sogar Tests zur Bildung der verschiedenen Preis- und Frequenztypen durchgeführt, z. B. werden die besten CPUs mit den höchsten Frequenzen verkauft. Trotzdem sind die billigeren Prozessoren sehr oft in der Lage, mit höherer Frequenz als verkauft zu arbeiten - sie sind nur aus dem Grund verkrüppelt, dass der Hersteller einige "High-Level" -Prozessoren mit höheren Preisen verkaufen möchte.
(Andererseits sind natürlich für einen Prozessor mit mehr als 1,5 Milliarden Transistoren heutzutage mehr Fehler möglich als für einige tausend Transistoren eines Prozessors der siebziger Jahre. Dies widerspricht jedoch nicht meiner Antwort IMO. Prozessoren im Allgemeinen neigen dazu, viele bekannte Fehler zu haben , zumindest im Mikrocode, aber das ist hier nicht Thema.)
Es gibt noch weitere Gründe, sich keine Gedanken über die CPU-Degration Ihres Programms zu machen:
Der erste Grund ist, dass moderne CPUs ihre Frequenz oder Drossel verringern, wenn sie zu heiß werden.
Es sollte klar sein, dass wenn Sie die CPU 100% 24/7 das ganze Jahr über nutzen, sie normalerweise früher stirbt als eine CPU, die nur jede zweite Woche eine Stunde verwendet wird. Das gilt übrigens auch für Autos. Nur in solchen Fällen würde ich selbst über die CPU-Auslastung und das Schlafpotential nachdenken.
Der zweite Grund ist, dass es wirklich sehr schwierig ist, ein Programm zu schreiben, das 100% der CPU vom Betriebssystem aus nutzt (z. B. unter Windows). Außerdem haben moderne CPUs (normalerweise) mindestens 2-4 Kerne. Ein traditioneller Algorithmus, der normalerweise 100% einer Single-Core-CPU verwendet, hat jetzt nur 50% auf einer Dual-Core-CPU (vereinfacht, aber in realen Szenarien gesehen).
Darüber hinaus hat das Betriebssystem die Kontrolle über die CPU und nicht über Ihr Programm. Wenn es also andere Anwendungen mit gleicher oder höherer Priorität gibt (was die Standardeinstellung ist), erhält Ihr Programm nur so viel CPU wie möglich, die anderen Anwendungen jedoch nicht verhungern. (Natürlich ist dies nur die vereinfachte Theorie, und natürlich ist das Multitasking von Windows, Linux und anderen nicht perfekt, aber insgesamt würde ich das für wahr halten).
Ja, bleib dabei. Wenn Sie beispielsweise auf einen anderen Prozess warten und eine Schleife ausführen, also nichts tun, wäre es nicht allzu schlimm, wenn Sie Thread.Sleep () einige Millisekunden in dieser Schleife ausführen und anderen zusätzliche Zeit geben. Während es für ein gutes Multitasking-Betriebssystem nicht notwendig ist, habe ich einige Probleme damit gelöst, z. B. für Windows 2000. (Das bedeutet natürlich NICHT, Sleep () in Berechnungen zu verwenden.)
quelle
Ein solcher Abbau ist theoretisch möglich und wird als " Elektromigration " bezeichnet. Die Elektromigration ist temperaturabhängig und beschleunigt sich mit steigender Temperatur. Ob es sich bei modernen CPUs um ein praktisches Problem handelt, steht zur Debatte. Moderne VLSI-Entwurfspraktiken gleichen die Elektromigration aus, und es ist wahrscheinlicher, dass Chips aus anderen Gründen versagen.
Allerdings erfolgt die Elektromigration auch bei normalen Belastungen und Temperaturen , aber sie ist langsam genug, dass ein gut entwickelter Chip entweder lange vor dem Versagen veraltet ist oder erst über einen anderen Mechanismus versagt.
Die Elektromigrationsrate hängt von der Chiptemperatur ab, wobei sich die Lebensdauer für jeweils (sehr grobe) 10 ° C verdoppelt. Dies ist in der Tat die Grundlage eines Tests mit der Bezeichnung "HTOL" (Hochtemperatur-Betriebslebensdauer), der misst, wie lange es dauert, bis ein Chip bei beispielsweise 125 ° C stirbt. Ein Chip, der bei 125 ° C läuft, fällt etwa 100-mal schneller aus als ein Chip, der bei 55 ° C läuft. Wenn er also für eine Lebensdauer von mindestens 10 Jahren bei 55 ° C ausgelegt ist, fällt ein Chip möglicherweise innerhalb eines Monats bei 125 ° C aus. Wenn ein solcher Chip mit einer Temperatur von 85 ° C betrieben wird, fällt er immer noch mindestens fünf bis zehn Mal früher aus, als vorgesehen.
Natürlich sind CPUs in der Regel für höhere Temperaturen ausgelegt, sodass sie in der Regel jahrelang bei 85 ° C und einer Auslastung von 100% rund um die Uhr laufen können. Ich würde daher vorschlagen, dass Sie sich keine Gedanken über die "Abnutzung" der CPU machen und sich nur darum kümmern, ob eine 100% ige Auslastung aus Sicht des Software-Engineerings angemessen ist.
quelle
Wenn Sie Ihren Code auf Clients ausführen, bedeutet 100% ige CPU-Auslastung, dass die Clientcomputer in dieser Zeit nur für Aufgaben mit höherer Priorität verwendet werden können. Da die meisten Anwendungen normalerweise mit Standardpriorität ausgeführt werden, stellen Benutzer, die diese Computer verwenden, ein Einfrieren des Computers fest und können auf ihren Computern keine anderen Aktionen ausführen. Auch wenn es sich um kurze Bursts handelt, werden Benutzer, die an etwas arbeiten, es trotzdem bemerken.
Wie schon andere gesagt haben, waren Sie ziemlich verschwiegen über das Setup, deshalb kann ich nicht sicher sagen. Wenn Ihre Clients jedoch Desktop-Computer sind, vermeiden Sie eine 100% ige CPU-Auslastung. Nicht wegen der CPU-Verschlechterung, sondern weil es keine gute Form ist, Benutzer während ihrer Arbeit zu stören.
quelle
Die Situation sieht also so aus: Sie haben Code, der fünf Stunden lang mit 100% aller CPUs ausgeführt wird, der so weit wie möglich optimiert ist, der Besitzer der Maschine ist damit einverstanden, dass die Maschine fünf Stunden lang unbrauchbar ist, und Ihr Kollege Laut Aussage ist es besser, den Code mit 83,33% aller CPUs in 6 Stunden auszuführen, da der Computer dadurch weniger beansprucht wird.
Dies hängt vom verwendeten Computer ab. Ich weiß, dass ein Computerhersteller Garantiereparaturen innerhalb der Garantiezeit für billige Heimcomputer verweigert hat, die in einer wissenschaftlichen Umgebung verwendet wurden, die rund um die Uhr läuft. Sie wollten eindeutig, dass der Kunde ihre teureren Server oder "Business" -Computer kauft. Ob sie erfolgreich waren, weiß ich nicht.
Jeder Mac, den ich besitze, hat irgendwann im Leben einen Code, der tagelang 100% der CPU auslastet. In einem Fall musste ich das Display ausschalten, weil ich nicht das Original-Ladegerät für einen Laptop hatte und mit 4 Kernen und Hyper-Threading mehr Strom verbrauchte als das mitgelieferte Ladegerät - so ging der Akku aus und als es erreichte 5 Prozent der Computer verlangsamte die Taktrate, bis der Akku bis zu 10% war! (Bei ausgeschaltetem Display lief es mehrere Tage mit voller Geschwindigkeit). In keinem Fall irgendwelche negativen Auswirkungen.
Mit einem gut gestalteten Computer liegen Sie also richtig. Mit einem schlecht gestalteten, billigen Computer könnte Ihr Kollege recht haben. Auf der anderen Seite können Sie die Kosten für Ihre Wartezeit und die Kosten für den Kauf eines Ersatzcomputers in Betracht ziehen.
quelle
Wenn dies möglich ist, legen Sie für Ihren Code eine niedrigere Priorität fest und stellen Sie sicher, dass der CPU-schwere Thread von der GUI getrennt ist. Dann haben Sie möglicherweise eine 100% ige Auslastung, aber der Benutzer kann immer noch andere Aufgaben ausführen und bleibt reaktionsschnell. Eine CPU ist für sich genommen so konzipiert, dass sie noch eine Weile zu 100% ausgelastet bleibt oder nicht freigegeben wird. Sie können nichts beschädigen, es sei denn, der Endbenutzer hat ernsthafte und gefährliche Änderungen an seiner Hardware vorgenommen.
quelle