Wie funktioniert die Windows-Affinität mit Hyper-Threaded-CPUs?

542
Priyankar Ghosh

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.

1
Es gibt keinen Unterschied. Windows behandelt einen HT-Core genauso wie einen physischen Speicher. Ihre Frage, die ich ehrlich sein werde, ist sehr verwirrend. Viele Informationen, die wirklich nicht erforderlich sind, um die Frage zu stellen, die Sie stellen möchten. Ramhound vor 10 Jahren 0
Wenn Sie weniger Optionen für Windows angeben, werden schlechtere Entscheidungen getroffen. Sie sollten sich auf keinen Fall mit der CPU-Affinität beschäftigen. Der Scheduler kann eine viel bessere Arbeit erledigen als Sie, weil er Dinge wie Taktanhebung, Kerntemperaturen, Anforderungen von Interrupts oder Hardwarewartung usw. versteht. David Schwartz vor 10 Jahren 2
@Priyankar Ghosh: Warum erstellen Sie 250 Verarbeitungsthreads? Ihr Quad-Core-PC kann nicht mehr als 4 gleichzeitig ausführen. Wenn Ihre Verarbeitungsthreads E / A-Vorgänge verwenden, die sie in einen Wartezustand versetzen, ist es sicherlich besser, einen Weg zu finden, um diesen Engpass zu reduzieren. James P vor 10 Jahren 0

0 Antworten auf die Frage