Deaktivieren von CPU-Kernen auf Quad-Core-Prozessor unter Linux


14

Ich möchte 3 CPU-Kerne deaktivieren und meinen Prozessor auf einem einzelnen Kern ausführen. Ich habe gebrauchten Befehl: maxcpus=1. Aber danach habe ich diesen Befehl ausgeführt ls /sys/devices/system/cpu. Es zeigt immer noch cpu0,cpu1,cpu2,cpu3.

Ich habe auch versucht: echo 0 > /sys/devices/system/cpu3/onlineaber ich erhalte den folgenden Fehler: no such file or directory.


Es ist unklar, wo Sie den maxcpus=1 Befehl setzen ? Haben Sie diese Zeichenfolge grub.cfgals Startoption eingegeben? (Bitte aktualisieren Sie Ihre Frage, anstatt sie in Kommentaren zu beantworten.)
Anthon

Ich verwende Freescale IMx6 Sabreauto Board unter Linux OS. Ich habe den Befehl auf einem Terminal-Emulator "gtkterm"
user3818847

Mit diesem Befehl echo 0> / sys / devices / system / cpu3 / online kann ich das Herunterfahren von cpu3 sehen. Jetzt möchte ich wissen,
ob

AFAIK Sie sollten maxcpus = 1 als Parameter für den Kernel angeben (dh wenn Sie sich in grub befinden). Bearbeiten Sie '/ etc / defaults / grub', um es den Kernel-Parametern hinzuzufügen, führen Sie 'update-grub' aus und starten Sie neu. Das wird die Dinge hartnäckig machen, dh mit nur einer CPU beim Start von Linux.
Anthon

2
@ user3818847 welche Distribution verwendest du? Das Ändern der Boot-Parameter (zum Übergeben maxcpus=1) variiert je nach Distribution. Auch der /sysPfad, den Sie haben, ist einfach der falsche, der richtige Pfad /sys/devices/system/cpu/cpu3/online.
Patrick

Antworten:


28

Wie Patrick in einem Kommentar angedeutet hat , hast du den Pfad /sysfalsch verstanden.

echo 0 > /sys/devices/system/cpu/cpu3/online

Wenn Sie alle CPUs ausschalten möchten, außer cpu0:

for x in /sys/devices/system/cpu/cpu[1-9]*/online; do
  echo 0 >"$x"
done

Das Eingeben maxcpus=1an einer Shell-Eingabeaufforderung hat keine Auswirkung. Genauer gesagt wird die Variable maxcpusauf den Wert 1in dieser Shell gesetzt, was keine weiteren Auswirkungen hat. Sie können die Anzahl der CPUs beim Booten festlegen, indem Sie maxcpuseinen Kernel-Parameter übergeben . Dazu müssen Sie Ihre Bootloader-Konfiguration ändern (zB um die Kernel-Kommandozeile in U-Boot zu ändern).


Vielen Dank für die Anregungen. Es hat mit dem von Ihnen vorgeschlagenen Befehl
funktioniert

Dies ist zumindest etwas kernelspezifisch. Ich verwende Kernel 3.6.6 und es gibt keine solchen Dateien. Stattdessen steuern Sie mit single /sys/devices/system/cpu/onlineund ./offlinefiles alle Kerne.
Daniel Griscom

@ Gilles - Gibt es eine Möglichkeit zu wissen, wie lange es dauert, ein ein- coreund auszuschalten?
Chetan Arvind Patil

@ChetanArvindPatil Zeit es. Ich denke, die Zeit würde vom RAM-Zugriff dominiert, wenn der betreffende Code nicht bereits im L2-Cache enthalten ist, und von der Zeit, um den Core ansonsten auszuschalten, aber es hängt sehr stark von der CPU und dem Betriebssystem ab.
Gilles 'SO- hör auf böse zu sein'

1
@Xofo Wenn der Kernel einen Kern ausschaltet, wird auf diesem Kern Kernel-Code ausgeführt, sodass zu diesem Zeitpunkt kein Thread für diesen bestimmten Kern geplant ist. Nachdem der Kern ausgeschaltet ist, werden auf diesem Kern keine Threads mehr geplant. Ich weiß nicht, was passiert, wenn die Affinität eines Threads ihn auf eine Reihe von Kernen beschränkt, die alle ausgeschaltet sind.
Gilles 'SO- hör auf böse zu sein'

1

Sie müssen Kerne nicht unbedingt ausschalten oder deaktivieren .

Sie würden cpusets und taskset verwenden

http://man7.org/linux/man-pages/man7/cpuset.7.html

Ein cpuset definiert eine Liste von CPUs und Speicherknoten ...

Das cpuset-Dateisystem ist eine Pseudo-Dateisystem-Schnittstelle zum cpuset-Mechanismus des Kernels, mit dem die Prozessor- und Speicherplatzierung von Prozessen gesteuert wird. Es wird üblicherweise unter / dev / cpuset gemountet.

Auf Systemen mit Kerneln, die mit integrierter Unterstützung für cpusets kompiliert wurden, sind alle Prozesse an ein cpuset gebunden, und cpusets sind immer vorhanden. Wenn ein System cpusets unterstützt, hat es den Eintrag nodev cpuset in der Datei / proc / filesystems. Durch das Mounten des cpuset-Dateisystems (siehe Abschnitt BEISPIEL unten) kann der Administrator die cpusets auf einem System so konfigurieren, dass die Prozessor- und Speicherplatzierung von Prozessen auf diesem System gesteuert wird. Wenn die cpuset-Konfiguration auf einem System nicht geändert wird oder wenn das cpuset-Dateisystem nicht einmal angehängt ist, hat der vorhandene cpuset-Mechanismus standardmäßig keine Auswirkungen auf das Systemverhalten.

Die CPUs eines Systems umfassen alle logischen Verarbeitungseinheiten, auf denen ein Prozess ausgeführt werden kann, einschließlich, falls vorhanden, mehrerer Prozessorkerne innerhalb eines Pakets und Hyper-Threads innerhalb eines Prozessorkerns. Speicherknoten umfassen alle unterschiedlichen Bänke des Hauptspeichers; kleine und SMP-Systeme haben normalerweise nur einen Speicherknoten, der den gesamten Hauptspeicher des Systems enthält, während NUMA-Systeme (ungleichmäßiger Speicherzugriff) mehrere Speicherknoten haben.

Kurz gesagt, wenn Sie 1 CPU mit 6 Kernen haben, würden Sie cpusets konfigurieren und Ihren Prozess in einem cpuset starten , das nur auf einem Kern konfiguriert ist, z. B. Kern 3. Wenn es sich um einen parallelen Prozess handelt, ist alles auf diesen einen Kern beschränkt. Wenn Sie also 4 Prozesse in einem bestimmten CPU-Satz mit nur einem definierten Kern starten, erhält jeder der 4 Prozesse eine CPU-Auslastung von 25% auf Kern 3.

Darauf aufbauend wird in der Regel ein cpuset so konfiguriert, dass

  • in einem System mit mehr als 200 Kernen ist cpusetA beispielsweise die Kerne 0 bis 60, wo immer sich diese befinden mögen, cpusetB die Kerne 61 bis 70; cpusetC sind die Kerne 71 ... 80; usw. Ein Administrator / Architekt entscheidet sich jedoch für die Konfiguration.
  • cpusetA ist bestimmten Benutzern und / oder bestimmten Softwareprogrammen zugeordnet. cpusetB ist verschiedenen Benutzern / Programmen zugeordnet; und so weiter.
  • Ein Benutzer startet einen Job (Prozess), der N Kerne ... innerhalb eines gegebenen CPU-Satzes anfordert, und nun sind diese mehreren (parallelen) Prozesse auf diesen gegebenen CPU-Satz beschränkt. Und für diejenigen N parallelen Prozesse, die auf einen bestimmten CPU-Satz beschränkt sind, würde / sollte jeder dieser Prozesse Prozessoraffinität oder CPU-Affinität verwenden, damit diese parallelen Prozesse nicht auf verschiedenen Kernen innerhalb des CPU-Satzes herumwirbeln.

auch: https://linux.die.net/man/1/taskset

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.