Verwenden Sie nur einen CPU-Kern

9

Ich muss Leistungstests für mein gleichzeitiges Programm ausführen und meine Anforderung ist, dass es nur auf einem CPU-Kern ausgeführt werden soll. (Ich möchte keine kooperativen Threads - ich möchte immer einen Kontextwechsel haben).

Ich habe also zwei Fragen:

  1. Die beste Lösung - So signieren und reservieren Sie nur einen CPU-Kern nur für mein Programm (um das Betriebssystem zu zwingen, diesen CPU-Kern nicht zu verwenden). Ich denke es ist nicht möglich, aber vielleicht irre ich mich ...

  2. Wie stelle ich Linux (Fedora 24) so ​​ein, dass nur ein CPU-Kern verwendet wird?

peter55555
quelle
Sehen Sie das .
Kamil Maciorowski
1
Beachten Sie, dass moderne CPUs ihre Geschwindigkeit abhängig von der Anzahl der insgesamt verwendeten Kerne ändern können. Selbst wenn Sie sicherstellen, dass Ihr Prozess nur einen einzelnen Kern verwendet und kein anderer Prozess ihn verwendet, hängt die Geschwindigkeit dieses Kerns davon ab, wie das Betriebssystem die anderen Kerne verwendet. Berücksichtigen Sie dies bei der Ausführung Ihrer Tests.
Liori
Sie sollten in der Lage sein, CPU-Kerne aus dem BIOS zu deaktivieren. Dies ist möglicherweise zuverlässiger für Ihre Tests, da @liori oben angegeben hat, dass das Betriebssystem möglicherweise die Kerngeschwindigkeit ändert.
Marcs
Wie wäre es, eine VM zu erstellen und ihr nur einen Kern zuzuweisen? Oh, ich habe gerade das "diesen CPU-Kern nicht benutzen" gelesen, also macht es nichts ...
Sakisk

Antworten:

26

Unter Linux lautet der Systemaufruf zum Festlegen der CPU-Affinität für einen Prozess sched_setaffinity. Dann gibt es das tasksetTool , um es in der Kommandozeile zu tun.

Um dieses einzelne Programm nur auf einer CPU ausführen zu können, möchten Sie wahrscheinlich so etwas

taskset -c 1 ./myprogram

(Legen Sie eine beliebige CPU-Nummer als Argument für den -cSwitch fest.)

Das sollte nahe genug an einem Einzelprozessorsystem liegen, solange Ihre anderen Prozesse im Vergleich zu dem, den Sie messen möchten, nicht zu viel laufen oder für andere CPUs geplant werden. Wenn Sie nur diesem einzelnen Prozess eine CPU zuweisen und verhindern möchten , dass andere Prozesse auf dieser CPU ausgeführt werden, müssen Sie auch deren Affinität festlegen.

Das weiß ich nicht richtig. Sie müssen die Prozessoraffinität initsehr früh im Startvorgang festlegen , um sicherzustellen, dass sie an alle Prozesse auf dem System vererbt wird. Um dieses Problem zu umgehen, können Sie taskset -c -p 0 $PIDalle anderen Prozesse verwenden, um zu erzwingen, dass sie nur auf CPU # 0 ausgeführt werden.

systemd hat auchCPUAffinity= die Affinität in Unit - Dateien zu steuern , und es gibt ein paar von Fragen über die Einstellung der Standard - Affinität hier auf unix.SE, aber ich habe nicht eine gute Lösung finden.

Obwohl @Kamil Maciorowski eine andere Frage auf superuser.com kommentierte und beantwortete , sollte die Einstellung isolcpus=1 in der Kernel-Befehlszeile "diese CPU von den allgemeinen Planungsalgorithmen isolieren", was Sie vielleicht möchten.

ilkkachu
quelle
Dies beantwortet die Frage nicht ganz. Während das Task-Set (oder andere Methoden zum Festlegen der Task-Affinität) sicherstellt, dass ein Prozess nur auf dem angegebenen Satz von Kernen ausgeführt wird, kann nicht garantiert werden, dass nur dieser Prozess auf diesen Kernen ausgeführt wird. Das heißt, das Betriebssystem kann andere Prozesse auf den Kern planen, auf den Sie Ihre Prozessaffinität festgelegt haben. In der Praxis ist dies die nützlichste Antwort, aber beachten Sie die Einschränkungen, und beachten Sie insbesondere, dass es nicht das gibt, wonach Sie in 1) "" reservieren Sie nur einen CPU-Kern nur für mein Programm (um das Betriebssystem dazu zu zwingen) Verwenden Sie diesen CPU-Kern nicht) "
James Greenhalgh
@JamesGreenhalgh, aber einen Weg zu finden, um die CPU-Affinität für jeden Prozess festzulegen, würde die Frage beantworten. Ist es möglich, eine Standard-CPU-Affinität für neue Prozesse als Kernel-Option (cmd-Zeile) festzulegen? Dies würde früh im Startvorgang wirksam und alle Prozesse betreffen.
Jpaugh
Ich habe tatsächlich die Klausel in Klammern verpasst, die verhindert, dass andere Prozesse auf dieser CPU ausgeführt werden. Oder vielleicht dachte ich, das größte Problem wäre, sicherzustellen, dass das fragliche Programm nur auf einem Kern statt auf vier ausgeführt wird und dass die anderen Prozesse als eine Art Belästigung angesehen werden können, was nicht viel ausmacht im Vergleich dazu. Aber ich gebe zu, ich hatte keine richtige Antwort auf diesen Teil der Frage, abgesehen von dem, was Kamil jetzt kommentierte.
Ilkkachu
@jpaugh, ich denke, selbst dann könnten Sie sich nicht vollständig von der Möglichkeit isolieren, dass ein anderer Prozess auf "Ihrem" Kern ausgeführt wird. Zum Beispiel eine, die ihre eigene Affinität zurücksetzt, oder sogar der Kernel-Code selbst, der Zeit in Anspruch nimmt, die nichts mit der Verwaltung Ihres Prozesses zu tun hat. Auch hier stimme ich voll und ganz zu, dass diese Antwort in der Praxis das ist, was die meisten tun würden, um den Großteil des Problems zu lösen, aber ich wäre wirklich daran interessiert, eine Antwort auf diesen letzten Teil in Klammern zu lesen!
James Greenhalgh