Mit modernen OS-Scheduler, ist es immer noch sinnvoll, manuell Prozesse zu bestimmten CPUs / Cores zu sperren?

StackOverflow https://stackoverflow.com/questions/1602980

Frage

Ich habe vor kurzem erfahren, dass manchmal Menschen bestimmte Prozesse oder Threads auf bestimmte Prozessoren oder Kerne sperren, und es wird vermutet, dass diese manuelle Abstimmung wird am besten um die Last verteilen. Das ist ein bisschen kontraintuitiv zu mir - ich die OS-Scheduler eine bessere Entscheidung als ein Mensch darüber zu treffen, wären in der Lage denken würde, wie die Last zu verteilen. Ich konnte sehen, es gilt für ältere Betriebssysteme zu sein, die vielleicht nicht bewusst Themen waren wie ihre mehr Latenz zwischen bestimmten Paaren von Kernen oder gemeinsam genutzten Cache zwischen einem Paar von Kernen, aber nicht ein anderes Paar zu sein. Aber ich nehme an ‚modernen‘ OSs wie Linux, Solaris 10, OS X und Vista sollte Disponenten haben, die diese Informationen kennen. Täusche ich mich über ihre Fähigkeiten? Täusche ich mich, dass es ein Problem gibt das Betriebssystem tatsächlich lösen kann? Ich bin besonders daran interessiert, die Antwort für Solaris und Linux.

Die Folge davon ist, ob ich Anwender meiner (multithreaded) Software informieren müssen, wie sie auf ihrem Feld betrachten könnte ausgleicht.

War es hilfreich?

Lösung

Zu allererst ‚Lock‘ ist keine richtige Begriff, es zu beschreiben. 'Affinity' ist geeigneter Begriff.

In den meisten Fällen brauchen Sie nicht über sie zu kümmern. Doch in einigen Fällen manuelle Einstellung CPU / Prozess / Thread Affinität könnte von Vorteil sein, .

Betriebssysteme sind in der Regel nicht bewusst auf die Details der modernen Multi-Core-Architektur. Zum Beispiel, sagen wir 2-Socket Quad-Core-Prozessoren und der Prozessor unterstützt SMT (= HyperThreading ). In diesem Fall haben wir 2 Prozessoren, 8 Kerne und 16 Hardware-Threads. So wird OS 16 logische Prozessoren. Wenn ein Betriebssystem nicht so Hierarchie nicht erkennt, ist es sehr wahrscheinlich, einige Performance-Gewinne zu verlieren. Die Gründe dafür sind:

  1. Caches : in unserem Beispiel zwei verschiedene Prozessoren (installiert auf zwei verschiedene Steckdosen) teilen sich keine On-Chip-Caches. Angenommen, ein Antrag 4 busy-Lauf von Threads gemeinsam genutzt Gewinde und eine Menge von Daten sind. Wenn ein Betriebssystem plant die Fäden für die Prozessoren, dann können wir auch einige Cache-Lokalität, was zu einer Leistung verlieren verlieren. Jedoch sind die Fäden nicht viel gemeinsame Nutzung von Daten (mit unterschiedlicher Arbeitsseite), dann auf unterschiedliche physikalische Prozessor Trennung wäre besser, durch wirksame Cache-Kapazität erhöht wird. Auch kompliziertes Szenario passieren könnte, was sehr schwer ist für OS bewusst zu sein.

  2. Ressourcenkonflikt : Lassen Sie uns SMT (= HyperThreading) Fall in Betracht ziehen. SMT teilt viele wichtige Ressourcen der CPU wie Caches, TLB und Ausführungseinheiten. Sagen, es gibt nur zwei besetzt Threads. Jedoch kann ein O dummerweise diese beiden Threads auf zwei logischen Prozessoren aus dem gleichen physischen Kern plant. In einem solchen Fall werden eine erhebliche Ressourcen, die von zwei logischen Threads behauptet.

Ein gutes Beispiel ist Windows 7. Windows 7 jetzt eine intelligente Planungsrichtlinie unterstützt, die SMT ( in Verbindung stehende Artikel ). Windows 7 tatsächlich verhindert, dass der oben 2. Fall. Hier ist eine Momentaufnahme der Aufgabe Krippe in Windows 7 mit 20% Last auf Core i7 (Quad-Core mit Hyper-Threading-= 8 logischen Prozessoren):


(Quelle: egloos.com )

Die CPU-Auslastung Geschichte ist sehr interessant, nicht wahr? :) Sie können sehen, dass nur eine einzige CPU paarweise verwendet wird, , was bedeutet, Windows 7 vermeidet zwei Threads auf demselben Kern Planung gleichzeitig wie möglich. Diese Politik wird die negativen Auswirkungen der SMT wie Ressourcenkonflikt auf jeden Fall verringern.

Ich mag O sagen, ist nicht sehr klug moderne Multicore-Architektur, wo viele Caches, gemeinsamer Last-Level-Cache, SMT und sogar NUMA zu verstehen. So könnte es gute Gründe geben, die Sie benötigen, um manuell eingestellt CPU / Prozess / Thread-Affinität.

Allerdings werde ich nicht sagen, dass dies wirklich erforderlich ist. Nur wenn Sie voll Ihre Arbeit Muster und Ihre Systemarchitektur verstehen, dann versuchen Sie es auf. Und die Ergebnisse, ob Ihr Versuch wirksam ist.

Andere Tipps

Für allgemeine Anwendungen, gibt es keinen Grund, die CPU-Affinität zu setzen; Sie sollten nur die OS-Scheduler ermöglicht die CPU zu wählen, sollte der Prozess oder Thread ausgeführt werden. Es gibt jedoch Fälle, in denen es notwendig ist, die CPU-Affinität zu setzen. Zum Beispiel kann in Echtzeit-Systemen, bei denen die Kosten einen Thread von einem Kern zu einem anderen zu migrieren (die zu jeder Zeit passieren können, wenn die CPU Affinität nicht gesetzt worden ist) können zu unvorhersehbaren Verzögerungen einführen, die Aufgaben verursachen kann ihre Termine verpassen, und die schließt in Echtzeit garantiert.

Sie können einen Blick auf diesem Artikel über eine Multi-Core bewusst Implementierung von Echtzeit-CORBA , dass unter anderem der CPU-Affinität zu setzen hatte, so dass die CPU-Migration nicht in verpassten Terminen führen kann.

Das Papier ist: Echtzeit-Performance und Middleware für Multi-Prozessor und Multicore-Linux-Plattformen

Für Anwendungen entwickelt mit Parallelität und mehrere Kernen im Auge, OS-Standard-Thread-Affinität ist manchmal nicht genug. Es gibt viele Ansätze zur Parallelität, aber bisher alle erfordern Beteiligung des Programmierers und Wissen - auf einer gewissen Ebene zumindest - der Architektur, auf dem die Lösung abgebildet werden. Dazu gehören auch die Maschinen, CPUs und Threads, die beteiligt sind.

Dies ist ein aktiv erforscht Thema, und es gibt einen ausgezeichneten Kurs auf dem MIT Opencourseware, die in diese Fragen befaßt: http://ocw.mit.edu/OcwWeb/Electrical-Engineering-and-Computer-Science/6-189January--IAP --2007 / CourseHome /

Nun etwas haben viele Menschen nicht daran gedacht, hier ist die Idee, zwei Prozesse verbieten auf dem gleichen Prozessor (Sockel) laufen. Es könnte sich lohnen, das System zu gebundenen verschieden stark frequentierten Prozessen zu verschiedenen Prozessoren zu helfen. Dies kann Streit zu vermeiden, wenn der Scheduler nicht klug genug ist, um es herauszufinden selbst.

Das ist aber mehr eine Systemadministrator Aufgabe dann ein für die Programmierer. Ich habe Optimierungen wie dies für ein paar Hochleistungs-Datenbankservern zu sehen.

Die meisten modernen Betriebssysteme werden eine effektive Arbeit der Zuteilung von Arbeit zwischen den Kernen tun. Sie versuchen auch, Fäden zu halten auf dem gleichen Kern ausgeführt wird, um die Cache-Leistungen zu erhalten Sie genannt haben.

In der Regel sollten Sie nie Ihre Threadaffinität werden Einstellung, wenn Sie einen sehr guten Grund zu haben. Sie haben nicht so gut einen Einblick, wie das Betriebssystem in die andere Arbeit, die Fäden auf dem System zu tun. Kerneln sind ständig auf der Grundlage neuer Prozessortechnologie aktualisiert werden (Single-CPU pro Socket zu Hyper-Threading auf mehrere Kerne pro Sockel). Jeder Versuch von Ihnen harte Affinität setzen kann auf zukünftige Plattformen nach hinten losgehen.

In diesem Artikel von MSDN Magazine, für Skalierbarkeit Mit Gleichzeitigkeit , gibt einen guten Überblick über Win32 von Multithreading. In Bezug auf die CPU-Affinität,

  

Fenster beschäftigt automatisch   sogenannte ideale Prozessoraffinität in   ein Versuch Cache zu maximieren   Effizienz. Zum Beispiel kann ein Thread   laufen auf CPU 1, die den Kontext bekommt   herausgeschaltet werden es vorziehen, wieder zu laufen   auf CPU 1 in der Hoffnung, dass einige seiner   Daten werden immer noch im Cache befinden. Aber   wenn die CPU-1 besetzt ist und die CPU 2 nicht, die   Gewinde könnte auf CPU 2 vorgesehen werden,   stattdessen mit all den negativen Cache   Effekte, die impliziert.

Der Artikel warnt auch, dass die CPU-Affinität nicht ohne ein tiefes Verständnis des Problems manipuliert werden soll. Auf der Grundlage dieser Informationen, meine Antwort auf Ihre Frage Nein wäre, außer für ganz bestimmte, wohlverstandenen Szenarien.

.

Ich bin nicht einmal sicher, dass Sie Prozesse auf eine bestimmte CPU auf Linux Stift kann Also, meine Antwort ist „Nein“ - lassen Sie das Betriebssystem damit umgehen, es ist klüger als Sie die meiste Zeit.

Edit: Es scheint, dass auf win32 Sie eine gewisse Kontrolle darüber haben, welche CPU-Familie werden Sie diesen Vorgang ausführen. Jetzt warte ich nur für mich jemand falsch zu beweisen, auch auf Linux / posix ...

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top