Wie funktioniert die Windows-Affinität mit Hyper-Threaded-CPUs?
Lassen Sie mich unsere Anforderung ausführlich beschreiben. Wir machen eine Art Zuordnung, bei der IP-Daten über die NIC-Karte erfasst und die erfassten Daten in Echtzeit verarbeitet werden müssen. Die Verarbeitung erfasster Daten kann je nach Verfügbarkeit der CPU teilweise oder vollständig erfolgen. Was jedoch getan werden kann, wird in Echtzeit durchgeführt.
Unsere Architektur sieht wie folgt aus. Wir verwenden einen Thread, um IP-Daten von der NIC-Karte zu erfassen. Eine Anzahl von Threads wird erstellt, um die erfassten Daten in Echtzeit zu verarbeiten, und diese Anzahl kann bis zu einem beliebigen Wert (beispielsweise 500) reichen, bei dem es sich um CPU-interne Threads handelt.
Hier sind unsere Anmerkungen: Bitte beachten Sie, dass wir einen Thread für die IP-Datenerfassung haben. Wenn wir weniger Verarbeitungsthreads erstellen (z. B. 10) und insgesamt etwa 95% der CPU verbrauchen, besteht bei der Erfassung von Threads mit IP-Daten kein Problem. Wenn wir jedoch eine große Anzahl von Verarbeitungsthreads (z. B. 250) erstellen und insgesamt etwa 80% der CPU verbrauchen, kann der Capturing-Thread IP-Daten nicht ordnungsgemäß erfassen. In einem späteren Fall ist die Verfügbarkeit der CPU höher, jedoch tritt ein Problem auf.
Das Problem könnte also auf die Anzahl der Threads und deren Terminierung (auch Kontextwechsel) zurückzuführen sein. Wir haben über die folgende Art der CPU-Verteilung unter den Threads nachgedacht. Mithilfe der Affinität werden 25% der Kerne auf Capture-Threads und 75% der Cores auf andere Verarbeitungs-Threads festgelegt.
Zu Beginn haben wir ein einfaches Programm auf einer Quad-Core-i7-Maschine mit HT ON geschrieben. Angenommen, die logischen Kerne sind A1 A2 B1 B2 C1 C2 D1 D2 (ABCD sind die realen Kerne). Unser Beispiel-Thread ist so, dass er alle Ressourcen eines einzigen HT-Kerns verbraucht. Wenn ich also 8 solcher Threads auf insgesamt 8 logischen Kernen laufen lasse, zeigt die CPU-Auslastung 100%. Jetzt haben wir versucht, Affinität zuzuweisen. Wenn wir zwei Kerne erstellen und die Affinität zu A1 und B1 festlegen (es ist nicht ein Thread zu A1 und der andere Thread zu B1, sondern die kombinierte Affinität für zwei Threads), dann funktioniert es gut und die CPU-Auslastung zeigt 25%. Wenn wir jedoch die kombinierte Affinität für zwei Threads auf A1 und A2 setzen, werden nur 12,5% verbraucht (Task-Manager zeigt, dass nur ein Kern verwendet wird). Wenn wir die Affinität von 4 Threads auf A1, A2, B1, B2 festlegen, zeigt die CPU-Auslastung 50%. Die Frage ist also, warum der zweite Fall (12,5%) nicht funktioniert.
0 Antworten auf die Frage
Verwandte Probleme
-
2
Wie kann ich die Anzahl der Threads eines bestimmten Prozesses unter AIX überwachen oder anzeigen?
-
1
Mail.app Bug - Zeigt weiterhin Nachrichten an
-
3
Wie kann ich die CPU-Affinität in Wine oder CrossOver einstellen?
-
1
VirtualBox erkennt alle Threads als Core oder nur physische Cores für Dual Core Core i7?
-
4
Wie kann ich die Prozessoraffinität unter OS X einstellen?
-
2
Gibt es in Windows XP einen "tiefen" Task-Manager, der Windows 7 und Vista ähnelt?
-
1
Kann eine generische Prozessaffinität (automatisch) eingestellt werden?
-
4
Was ist Windows-Priorität und Affinität und welche Vorteile bietet es?
-
1
Dual Core, Core 2 Duo, Core i Serie
-
1
Weist der Windows-Scheduler Threads gleich lange Quanten zu?