Weisen Sie einem Prozess einen einzelnen Kern zu

1676
Leonid

Was ich versuche zu implementieren ist, ein Python-Skript auf seinem eigenen Kern auf Raspberry Pi 2 mit Debian auszuführen. Man kann taskseteinen Prozess verwenden, um einen bestimmten Kern zu binden. Ich brauche jedoch, dass dieser Kern gleichzeitig frei von Betriebssystemen und anderen Prozessen ist. Wie kann ich es tun?

4
Vielleicht auch auf Echtzeitpriorität setzen? grawity vor 7 Jahren 0
@Leonidas Ich habe meine Antwort um einige Testantworten erweitert. Hör zu. Kamil Maciorowski vor 7 Jahren 0

2 Antworten auf die Frage

5
Kamil Maciorowski

Dieser ganze Thread sollte nützlich sein.

Ich würde nach einer Möglichkeit suchen, den 'init'-Prozess auf die Ausführung auf CPU 1 zu beschränken.

Im Allgemeinen sollten die letzten Wörter "auf allen CPUs außer 1 laufen". Ich denke, man kann einige Kernel-Parameter verwenden ; irqaffinity, Sind isolcpusvielversprechend.


BEARBEITEN:

Über isolcpusin Kernel - Parameter - Dokumentation :

Diese Option ist die bevorzugte Methode zum Isolieren von CPUs. Die Alternative - die manuelle Einstellung der CPU-Maske für alle Tasks im System - kann zu Problemen und einer suboptimalen Leistung des Lastausgleichs führen.

Ich habe ein paar Tests gemacht. Ergebnisse:

  • Der Kernel-Parameter isolcpusist der Parameter, mit dem Sie den initProzess einschränken und die CPU (s) isolieren können.

  • Es schien mir, dass der Kernel-Parameter irqaffinitydie isolierten CPU (s) nicht beeinflusste. Sie benötigen diesen Parameter wahrscheinlich nicht.

  • Als ich CPU0 isolierte, ging es nicht völlig leer . Ist diese System- oder Hardwareanforderung erforderlich, trotz Isolation einige Berechnungen damit durchzuführen? - Ich weiß es nicht.

  • Als ich isolierte CPU1 oder CPU 7 war es solide wie ein Fels im Leerlauf.

Um die CPU1 zu isolieren, fügen isolcpus=1Sie Folgendes hinzu grub.cfg:
linux /vmlinuz-(… alle aktuellen Parameter hier…)isolcpus=1


ORIGINAL ANTWORT FORTGESETZT:

Alternativ können Sie nach dem Starten des Systems die Affinität aller derzeit ausgeführten Prozesse neu zuweisen, was jedoch weniger elegant erscheint.

Ich stimme zu, dass es weniger elegant wirkt, aber es funktioniert vielleicht gut genug (EDIT: Es kann zu Problemen und suboptimaler Lastausgleichsleistung führen, wie oben angegeben). Es gibt schnelle und schmutzige Einzeiler, die in meinem Debian funktionieren:

sudo bash -c 'cd /proc ; for i in [1-9]* ; do taskset -a -p fffffffe $i ; done' 

Ich habe Fehler für einige PIDs, htopzeigt jedoch, dass ein Kern danach praktisch inaktiv ist. Natürlich müssen Sie Ihr Skript später ausführen, es irgendwie ausschließen oder einfach neu zuweisen:

taskset -a -p 1 PID 

Ich gehe davon aus, dass Sie den Einzeiler nicht wiederholen müssen, um neue Prozesse abzudecken, da die CPU-Affinität vererbt wird.

3
L. Levrel

Mit Paket Cpuset:

# cset shield -c 42 -k on 

CPU # 42 für Ihre Aufgabe reservieren (Sie können eine Gruppe von CPUs reservieren), dann

# cset shield -e your_script 

um mit your_scriptIhren reservierten CPUs zu beginnen. (Siehe auch Optionen --userund --group.)

Wenn Sie fertig sind, geben Sie die CPUs frei ("reset the shield") mit:

# cset shield -r 

Es gibt viel, viel mehr zu diesem Werkzeug. Anhängen eines zuvor laufenden Prozesses an die reservierte CPU:

# cset shield -s -p <PID> --threads 

Befehlszeilenhilfe:

# cset help 

Online-Hilfe / Tutorial

Sieht vielversprechend aus. Können Sie Ihre Antwort erweitern und einen Befehl posten, um die Reservierung freizugeben und zum Standardzustand zurückzukehren? Kamil Maciorowski vor 7 Jahren 0
@ KamilMaciorowski: Haben Sie ein Feedback zu den Befehlen, die ich Ihrer Anfrage hinzugefügt habe? L. Levrel vor 7 Jahren 0