Ein ganzer Kern, der einem einzelnen Prozess gewidmet ist

Lesezeit: 6 Minuten

Benutzeravatar von akp
Akp

Gibt es in Linux eine Möglichkeit, einem bestimmten Prozess einen CPU-Kern zuzuweisen, und es sollten keine anderen Prozesse oder Interrupt-Handler auf diesem Kern geplant werden?

Ich habe über Prozessaffinität in Linux gelesen Binden von Prozessen an CPUs mithilfe des Taskset-Dienstprogramms aber das löst mein Problem nicht, weil Es wird lediglich versucht, den angegebenen Prozess diesem Kern zuzuordnen, aber es ist möglich, dass andere Prozesse auf diesem Kern geplant werden und das möchte ich vermeiden.

Sollten wir den Kernel-Code für die Planung ändern?

  • Versuchen Sie auch, diesem Prozess die höchste Echtzeitpriorität zuzuweisen.

    – Dmytro Sirenko

    27. November 2012 um 11:28 Uhr

  • Was ist, wenn wir verwenden linux.die.net/man/1/htop und ordnen alle anderen Prozesse anderen CPUs zu, während unsere Aufgabe einer bestimmten CPU zugeordnet ist. Sollte funktionieren denke ich.

    – Sunny R Gupta

    27. November 2012 um 11:30 Uhr

  • @EarlGray, also wird dadurch sichergestellt, dass andere Prozesse oder Interrupt-Handler nicht für die Ausführung auf dem angegebenen CPU-Kern geplant sind?

    – akp

    27. November 2012 um 11:31 Uhr


  • Warum genau fragst du? Sie möchten, dass Ihr Prozess läuft …. Warum sollte er speziell auf einem bestimmten Kern laufen???? Was macht diesen Kern so einzigartig??? Unterscheidet es sich so sehr von einem anderen Kern auf demselben Chip???

    – Basile Starynkevitch

    27. November 2012 um 12:06 Uhr


  • @BasileStarynkevitch Erstens denke ich, dass der Autor nur wollte, dass sein Prozess auf seinem eigenen Kern läuft. Zweitens haben einige Intel-Kerne feine Unterschiede.

    – Benutzer997112

    21. Januar 2019 um 16:46 Uhr

Benutzeravatar von gby
gby

Ja da ist. Tatsächlich gibt es zwei verschiedene Möglichkeiten, dies zu tun 🙂

Im Moment ist der beste Weg, das zu erreichen, was Sie wollen, Folgendes zu tun:

  1. Fügen Sie den Parameter isolcpus= hinzu[cpu_number] an die Linux-Kernel-Befehlszeile vom Bootloader während des Bootens. Dadurch wird der Linux-Scheduler angewiesen, keine regulären Aufgaben auf dieser CPU auszuführen, es sei denn, dies wird ausdrücklich unter Verwendung der CPU-Affinität angefordert.

  2. Verwenden Sie die IRQ-Affinität, um andere CPUs so einzustellen, dass sie alle Interrupts verarbeiten, sodass Ihre isolierte CPU keine Interrupts empfängt.

  3. Verwenden Sie die CPU-Affinität, um Ihre spezifische Aufgabe der isolierten CPU zuzuweisen.

Dadurch erhalten Sie das Beste, was Linux in Bezug auf die CPU-Isolierung ohne Out-of-Tree- und In-Development-Patches bieten kann.

Ihre Aufgabe wird immer noch von Zeit zu Zeit durch Linux-Code unterbrochen, einschließlich anderer Aufgaben – wie dem Timer-Tick-Interrupt und dem Scheduler-Code, IPIs von anderen CPUs und Dingen wie Arbeitswarteschlangen-Kernel-Threads, obwohl die Unterbrechung ziemlich minimal sein sollte.

Eine (fast) vollständige Liste der Unterbrechungsquellen finden Sie auf meiner Seite unter https://github.com/gby/linux/wiki

Die alternative Methode ist die Verwendung von cpusets, die viel eleganter und dynamischer ist, aber zu diesem Zeitpunkt einige Schwächen aufweist (z. B. keine Migration von Timern), weshalb ich den alten, groben, aber effektiven isolcpus-Parameter empfehle.

Beachten Sie, dass die Linux-Community derzeit daran arbeitet, all diese Probleme und mehr anzugehen, um eine noch bessere Isolierung zu erreichen.

  • Stimmt es immer noch, dass isolcpus eine bessere Isolation bietet als cpusets, selbst wenn die Option –kthread=on angegeben ist?

    – Cedomir Segulja

    10. August 2013 um 8:06 Uhr

  • @CedomirSegulja Ich glaube, das tut es, obwohl sich der Unterschied mit der Zeit verringert. Wenn zum Beispiel ein Kernel-Modul einen Timer auf einer CPU registriert hat und dieser Timer selbstregistrierend ist (z. B. wenn er sich wieder registriert, wenn er abläuft), gibt es derzeit keine einfache Möglichkeit, ihn von der Möchtegern-dedizierten CPU zu entfernen. Bei isolcpus ist die Chance, dass ein solcher Timer überhaupt registriert wird, viel geringer.

    – gby

    18. August 2013 um 11:52 Uhr

  • @gby, akzeptiert der isolcpus-Parameter eine physische Kern-ID oder eine logische? Ich habe kernel.org/doc/Documentation/kernel-parameters.txt gelesen, aber es ist mir nicht 100% klar. Insbesondere interessiere ich mich für den Hyper-Threading-Modus, der auf meiner Xeon-CPU 2 logische Kerne pro 1 physischen gibt, und was ich in icolspus angeben soll. Vielen Dank.

    – Markieren

    19. Januar 2015 um 12:05 Uhr

  • @ Mark logisch. Dieselbe ID, die sched_setaffinity akzeptiert

    – gby

    19. Januar 2015 um 12:34 Uhr

  • @gby, danke für die Antwort. Gehe ich richtig davon aus, dass bei deaktiviertem Hyper-Threading-Modus LogicalID == PhysID der CPU ist?

    – Markieren

    19. Januar 2015 um 15:48 Uhr

Benutzeravatar von louxius
louxiu

Es gibt Redhat-Artikel darüber sprechen. Es ändert den Boot-Parameter isoliert.

Und ein alter Artikel geschrieben von Robert Liebe. Und es gibt eine Lösung in diesem Artikel.

Alle Kinder eines Prozesses erhalten dieselbe CPU-Affinitätsmaske wie ihre Eltern.

Dann müssen wir uns nur noch an einen Prozessor binden. Alle anderen Prozesse, die naturgemäß die Wurzel des Prozessbaums und damit der Superparent aller Prozesse sind, sind dann ebenfalls an den einen Prozessor gebunden.

  • Der zweite Link kann nicht hinzugefügt werden, da die Domain eine Nummer ist.:-(

    – louxiu

    27. November 2012 um 12:05 Uhr

  • Link korrigiert, Artikel ursprünglich aus dem Linux Journal

    – Hasturkun

    27. November 2012 um 12:36 Uhr

  • Für diesen Link ist ein Redhat-Abonnement erforderlich. Könntest du bitte den Inhalt posten?

    – Monothreaded

    25. Februar 2014 um 10:26 Uhr

Benutzeravatar von Vasu
Vasu

Weisen Sie einem bestimmten Programm einen ganzen CPU-Kern zu

Während Taskset die Zuweisung eines bestimmten Programms zu bestimmten CPUs ermöglicht, bedeutet dies nicht, dass keine anderen Programme oder Prozesse auf diesen CPUs geplant werden. Wenn Sie dies verhindern und einem bestimmten Programm einen ganzen CPU-Kern zuweisen möchten, können Sie den Kernel-Parameter “isolcpus” verwenden, mit dem Sie den CPU-Kern während des Bootens reservieren können.

Fügen Sie dem Bootloader während des Bootens oder der GRUB-Konfigurationsdatei den Kernelparameter “isolcpus=” hinzu. Dann plant der Linux-Scheduler keine regulären Prozesse auf den reservierten CPU-Kernen, es sei denn, dies wird ausdrücklich mit Taskset angefordert. Um beispielsweise die CPU-Kerne 0 und 1 zu reservieren, fügen Sie den Kernel-Parameter „isolcpus=0,1“ hinzu. Verwenden Sie beim Booten taskset, um Ihrem Programm die reservierten CPU-Kerne sicher zuzuweisen.

Quelle(n)

  1. http://xmodulo.com/2013/10/run-program-process-specific-cpu-cores-linux.html
  2. http://www.linuxtopia.org/online_books/linux_kernel/kernel_configuration/re46.html

Selbst wenn Sie den Schritten in gbys Antwort folgen, werden Kernel-Tasks auf dem isolierten CPU-Kern ausgeführt. Im Linux-Echtzeitprojekt RT_PREEMPT wird daran gearbeitet, dies zu verbessern. Wenn Sie also keinen hochmodernen Echtzeit-Kernel von RP_PREEMPT verwenden, ist dies möglicherweise nicht möglich vollständig einen CPU-Kern isolieren.

Gem Dokumentation

Der Linux-Scheduler berücksichtigt die angegebene CPU-Affinität und der Prozess wird nicht auf anderen CPUs ausgeführt.

Es wird nicht erwähnt, dass ein bestimmter Auftragsverarbeiter ausschließlich mit der Verarbeitung beauftragt wird.

  • Ich habe gelesen, dass die vollständige CPU-Isolation noch nicht implementiert ist: lwn.net/Articles/520704 (scrollen Sie nach unten zu “CPU-Isolation”).

    – Maxim Egorushkin

    27. November 2012 um 11:51 Uhr

  • Genau das meine ich. Sie geben dem Scheduler lediglich einen Hinweis, den Prozess auf einem bestimmten Kern/Prozessor auszuführen. Aber es ist keine Möglichkeit, Kern/Prozessor exklusiv für bestimmte Prozesse zuzuweisen.

    – Sergei Nikulov

    27. November 2012 um 12:44 Uhr


  • Ich habe gelesen, dass die vollständige CPU-Isolation noch nicht implementiert ist: lwn.net/Articles/520704 (scrollen Sie nach unten zu “CPU-Isolation”).

    – Maxim Egorushkin

    27. November 2012 um 11:51 Uhr

  • Genau das meine ich. Sie geben dem Scheduler lediglich einen Hinweis, den Prozess auf einem bestimmten Kern/Prozessor auszuführen. Aber es ist keine Möglichkeit, Kern/Prozessor exklusiv für bestimmte Prozesse zuzuweisen.

    – Sergei Nikulov

    27. November 2012 um 12:44 Uhr


1416590cookie-checkEin ganzer Kern, der einem einzelnen Prozess gewidmet ist

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy