Warum sind 16 Threads auf einem i7 mit 4 Threads mit Hyperthreading effizienter als 8? (Robocopy)

867
Herb

In Windows 8.1 verwende ich Robocopy, um die Daten von zwei Servern auf dem Speicherplatz eines dedizierten PCs zu speichern. Das Datenvolumen beträgt 147.314 Dateien in 4.110 Ordnern (66.841.845.760 Bytes).

Alle 3 beteiligten PCs verfügen über eine i7-CPU mit 4 Kernen und befinden sich in einem 1-Gbit-Netzwerk. Der Speicherplatz des Ziels (gespiegelt und auf D :) wird mit einem 4 x 4-TB-JBOD-Case realisiert.

Aufgrund der 4-Kerne der CPUs und Hyperthreading habe ich erwartet, dass der Robocopy-Switch / MT: 8 am besten funktioniert und dass mehr als 8 Threads aufgrund einer nicht-förderlichen Thread-Verwaltung übertrieben wären.

Ich habe das getestet. Ich liste hier die Daten der vierten Testreihe auf (Dauer in mm: ss):

 1 thread: 59:19 2 threads: 39:12 4 threads: 29:13 8 threads: 24:36 16 threads: 24:19 32 threads: 24:27 

Zugegeben, die wenigen Sekunden mit 16 Threads sind vernachlässigbar, aber sie sind in allen Testreihen konsistent, dh nicht aufgrund von mehr Lastarbeit beim Test mit weniger als 16 Threads (es sei denn, dies war in allen 4 Testreihen der Fall). Beachten Sie auch, dass 32 Threads fast immer etwas schneller sind als 8 Threads.

Frage: Welcher technische Grund ist dafür verantwortlich, dass 16 Threads auf einem i7 mit 4 Hyperthread-Cores effizienter sind als 8 Threads?

4

1 Antwort auf die Frage

3
Mokubai

TL; dr-Version: Wenn Sie etwas sehr CPU-intensives tun, z. B. das Transcodieren von Video mit der Handbrake, möchten Sie nicht mehr Kerne als CPUs verwenden, da die Arbeit nirgends zu erledigen wäre. In diesem Fall, in dem die meisten Threads 90% ihrer Zeit im Schlaf verbringen, wartet das Lesen oder Schreiben, wobei mehr Threads für Sie als für Sie arbeiten.


Das Kopieren von Dateien ist keine besonders CPU-gebundene Aufgabe. Wenn Sie mehr Kerne haben, kann dies zwar verhindern, dass andere Aufgaben Ihr Kopierwerkzeug blockieren, es ist jedoch unwahrscheinlich, dass jeder Thread auf jedem Kernen zu 100% ausgeführt wird.

Jeder Kopierthread sendet eine Leseanforderung an die Festplatte und geht dann in den Ruhezustand, während er auf die Erfüllung der Leseanforderung wartet. Ihre sich drehende Rostplatte hat im Allgemeinen eine Suchzeit von 9 Millisekunden, praktisch eine Ewigkeit in Bezug auf die CPU, und die Kopieraufgabe würde sich nicht einfach drehen und sagen: "Ist sie schon fertig?" und verschwenden CPU-Zyklen. Dadurch würde der Thread bei 100% CPU gesperrt und Ressourcen verschwendet. Nein, der Thread gibt einen Lesevorgang aus und der Thread wird in den Ruhezustand versetzt, bis der Lesevorgang abgeschlossen ist und die Daten für den nächsten Schritt bereit sind.

In der Zwischenzeit macht ein anderer Thread dasselbe, wird beim Lesen blockiert und in den Ruhezustand versetzt. Dies gilt für alle 16 Ihrer Threads. (In Wirklichkeit werden Ihre Lese- und Schreibvorgänge zu zufälligen Zeitpunkten ausgeführt, wenn sie nicht mehr synchron sind, aber Sie haben die Idee)

Sobald einer der Threads Daten für ihn bereitstellt, plant Windows diese erneut und beginnt mit der Verarbeitung, um geschrieben zu werden. In Bezug auf den Thread ist der Prozess derselbe. Es heißt "Schreiben Sie diese Daten in die Datei x an Position y" und Windows übernimmt die Daten und entschlüsselt den Thread. Windows erledigt den Hintergrund, um herauszufinden, wo sich die Datei befindet, verschiebt die Daten (möglicherweise über das Netzwerk addiert die Verzögerung um mehr Millisekunden) und gibt die Kontrolle an den Thread zurück, sobald das Schreiben erfolgreich war.

Kein Thread brennt ständig auf einem CPU-Kern, und daher sind mehr Threads als Sie über CPUs kein Problem. Kein Thread wird lange genug wach sein, damit er ein Problem darstellt.

Wenn Sie nur eine einzige CPU mit vielen anderen Threads hätten, könnten Sie Engpässe in der CPU haben. In einem Multicore-System mit dieser Art von Workload wäre ich jedoch überrascht, wenn die CPU das Problem ist.

Sie werden mit größerer Wahrscheinlichkeit in Bezug auf die Festplattenleistung Engpässe erhalten und erreichen die Warteschlangentiefe für die Lese- oder Schreibpuffer auf den Laufwerken. Wenn Sie mehr Threads verwenden, stoßen Sie etwas an seine Grenzen, sei es eine Festplatte oder ein Netzwerk, und Sie können nur herausfinden, was die beste Anzahl an Threads ist, indem Sie das tun, was Sie getan haben, und damit experimentieren.

Bei einem System mit SSD-zu-SSD-Kopieren würde ich vermuten, dass eine geringere Anzahl von Threads besser sein könnte, da es weniger Latenzzeiten gibt als das Kopieren von Dateien von sich drehenden Rost-HDDs, das Überspannen des Netzwerks und das Schreiben auf sich drehenden Rost stützen Sie diese Vermutung.

Ihre Antwort wird sehr geschätzt, auch Ihre Notiz zu SSDs. Sind diese SSD-Hinweise auch für HDD zu SSD bzw. SSD zu HDD gültig? (Nicht dass es auf die Frage zutrifft, nur aus Interesse.) Herb vor 6 Jahren 0
Der einzige Weg zu wissen ist, es auszuprobieren. Wenn sich jedoch eine Festplatte im Pfad befindet, wird die Gesamtübertragungszeit durch Verzögerungen absolut überlastet. Für SSD zu SSD ... Ein typisches SSD-Lesen oder Schreiben liegt in der Größenordnung von Millisekunden, aber dies ist immer noch ein kleiner Bruchteil der CPU-Zeit, die zum Anfordern des nächsten Lese- oder Schreibvorgangs erforderlich ist. Das heißt, Sie könnten sich immer noch in einer Situation befinden, in der Sie die SSDs nicht so beschäftigt halten, wie sie sein könnten. Jamie Hanrahan vor 6 Jahren 1