Ich habe einen lang andauernden Prozess, der große Dateien liest und zusammenfassende Dateien schreibt. Um die Dinge zu beschleunigen, verarbeite ich mehrere Dateien gleichzeitig mit normalen alten Threads:
%Vor%Was ich herausgefunden habe, ist, dass selbst mit separaten Threads, die separate Dateien lesen und keine Sperre zwischen ihnen besteht und 4 Threads in einer 24-Core-Box verwendet werden, ich nicht einmal 10% auf der CPU oder 10% mehr erreichen kann Datenträger-E / A. Wenn ich in meiner App mehr Threads verwende, scheint es noch langsamer zu laufen.
Ich schätze, ich mache etwas falsches, aber wo es merkwürdig wird, ist, dass wenn ich die ganze exe ein zweites und drittes Mal starte, sie Dateien zwei- bis dreimal schneller verarbeitet. Meine Frage ist, warum kann ich nicht 12 Threads in meiner einen App bekommen, um Daten zu verarbeiten und die Maschine sowie 4 Threads in 3 Instanzen meiner App zu besteuern?
Ich habe die App profiliert und die zeitintensivsten und am häufigsten aufgerufenen Funktionen sind alle String-Verarbeitungsaufrufe.
Es ist möglich, dass Ihr Computerproblem nicht CPU-gebunden, sondern I / O-gebunden ist. Es hilft nicht zu sagen, dass Ihre Festplatten-I / O "nur bei 10%" ist. Ich bin mir nicht sicher, ob ein solcher Leistungsindikator überhaupt existiert.
Der Grund, warum es bei der Verwendung von mehr Threads langsamer wird, ist, dass diese Threads alle gleichzeitig versuchen, zu ihren jeweiligen Dateien zu gelangen, während das Disk-Subsystem Schwierigkeiten hat, all die verschiedenen Threads aufzunehmen. Sie sehen, selbst mit einer modernen Technologie wie SSDs, bei denen die Suchzeit mehrere Größenordnungen kleiner ist als bei herkömmlichen Festplatten, ist immer noch eine Strafe verbunden.
Sie sollten eher feststellen, dass Ihr Problem plattengebunden ist und ein einzelner Thread wahrscheinlich der schnellste Weg ist, um Ihr Problem zu lösen.
Man könnte argumentieren, dass man asynchrone Techniken verwenden könnte, um ein gelesenes Bit zu verarbeiten, während im Hintergrund das nächste Bit eingelesen wird, aber ich denke, dass man dort nur wenig Leistungsverbesserung sehen wird.
Ich hatte ein ähnliches Problem vor nicht allzu langer Zeit in einem kleinen Tool, wo ich MD5-Signaturen aller Dateien auf meiner Festplatte berechnen wollte und ich fand, dass die CPU viel zu schnell im Vergleich zum Speichersystem ist und ich bekam ähnliche Ergebnisse versuchen, mehr Leistung durch Verwendung von mehr Threads zu erhalten.
Die Verwendung der parallelen Taskbibliothek hat dieses Problem nicht behoben.
Zunächst einmal auf einer 24-Core-Box, wenn Sie nur 4 Threads verwenden, ist die CPU, die es jemals verwenden könnte, 16,7%, so dass Sie wirklich 60% Auslastung erhalten, was ziemlich gut ist.
Es ist schwer zu sagen, ob Ihr Programm zu diesem Zeitpunkt I / O-gebunden ist, meine Vermutung ist, dass es das ist. Sie müssen einen Profiler auf Ihrem Projekt ausführen und sehen, welche Codeabschnitte Ihr Projekt am meisten Zeit in Anspruch nimmt. Wenn es auf einer Lese- / Schreiboperation sitzt, ist es E / A-gebunden.
Es ist möglich, dass Sie eine Art von Inter-Thread-Verriegelung verwenden. Das würde dazu führen, dass das Programm langsamer wird, wenn Sie weitere Threads hinzufügen, und wenn Sie einen zweiten Prozess ausführen, wird das zwar behoben, aber das Fixieren würde auch funktionieren.
Worauf es ankommt, ist ohne Profilinformationen, die wir nicht sagen können, wenn die Verwendung eines zweiten Prozesses die Dinge beschleunigt oder die Dinge verlangsamt, müssen wir wissen, ob das Programm an einer E / A-Operation, einer Sperroperation, hängt oder einfach eine lange Zeit in einer Funktion, die besser parallelisiert werden kann.
Ich denke, Sie finden heraus, welcher Dateicache nicht ideal ist, wenn ein Prozess Daten in vielen Dateien gleichzeitig schreibt. Der Dateicache sollte mit dem Datenträger synchronisiert werden, wenn die Anzahl der fehlerhaften Seitencaches einen Schwellenwert überschreitet. Es scheint, dass konkurrierende Writer in einer Verarbeitungshitsschwelle schneller sind als die Single-Thread-Writer. Sie können über den Dateisystemcache lesen Dateicache-Leistung und Optimierung
Versuchen Sie, die Aufgabenbibliothek von .net 4 (System.Threading.Task) zu verwenden. Diese Bibliothek verfügt über integrierte Optimierungen für unterschiedliche Prozessoren.
Haben Sie keine Ahnung, was Ihr Problem ist, vielleicht, weil Ihr Code-Snippet nicht wirklich informativ ist
Tags und Links c# multithreading