
Ich verwende das Jetson TK1-Entwicklungsboard von NVIDIA, auf dem Ubuntu 14.04 läuft. Es ist ein 4-Core-ARM-System und standardmäßig sind 3 davon „offline“ -
ubuntu@tegra-ubuntu ~ $ lscpu
Architecture: armv7l
Byte Order: Little Endian
CPU(s): 4
On-line CPU(s) list: 0
Off-line CPU(s) list: 1-3
Thread(s) per core: 1
Core(s) per socket: 3
Socket(s): 1
Obwohl sie automatisch aktiviert werden sollten, wenn der Scheduler genügend Last erkennt, tun sie das nicht (zumindest bei unserer Arbeitslast). Die Problemumgehung besteht darin, eine "1" an eine Stelle innerhalb von /sys zu schreiben -
/sys/devices/system/cpu/cpu1/online
In der Dokumentation heißt es, dass Sie diese Befehle in der angegebenen Reihenfolge ausführen sollen:
sudo su
echo 1 > /sys/devices/system/cpu/cpu1/online
und wiederholen Sie dies für CPUs 2 und 3. Das funktioniert -
ubuntu@tegra-ubuntu ~ $ sudo su
[sudo] password for ubuntu:
root@tegra-ubuntu:/home/ubuntu# echo 1 > /sys/devices/system/cpu/cpu1/online
root@tegra-ubuntu:/home/ubuntu# lscpu
Architecture: armv7l
Byte Order: Little Endian
CPU(s): 4
On-line CPU(s) list: 0,1
Off-line CPU(s) list: 2,3
Thread(s) per core: 1
Core(s) per socket: 3
Socket(s): 1
root@tegra-ubuntu:/home/ubuntu#
Ich persönlich möchte nicht verwenden sudo su
, weil es meinen Augen wehtut, aber hauptsächlich, weil wir ein Skript brauchen, das alle CPUs aufwecken und dann den Befehl zum Starten unserer Arbeitslast ausführen kann. Idealerweise würde ich es in einfügen /etc/rc.local
. Das funktioniert nicht. Vielleicht schaltet der Kernel die CPUs aus, nachdem rc.local beim Booten ausgeführt wurde?
Hier ist jedenfalls mein Skript -
#!/bin/bash
sudo bash -c "echo '1' > /sys/devices/system/cpu/cpu1/online"
sudo bash -c "echo '1' > /sys/devices/system/cpu/cpu2/online"
sudo bash -c "echo '1' > /sys/devices/system/cpu/cpu3/online"
<some command>
Das Problem ist, dass <some command>
die obigen Echozeilen nichts auf stdout ausgeben. Es wird jedoch lscpu
nur 1 aktive CPU angezeigt. Das direkte Einfügen dieser Zeilen in das Terminal funktioniert nicht. Das war für mich nicht der rätselhafte Teil. Ich nahm an, dass ich etwas vermasselt hatte. Hier ist wasIsträtselhaft. Doing sudo su
gefolgt von dem echo
Befehl funktioniert, wie ich bereits sagte. Nun, beenden Sie root und führen Sie
sudo bash -c "echo '1' > /sys/devices/system/cpu/cpu2/online"
sudo bash -c "echo '1' > /sys/devices/system/cpu/cpu3/online"
in meiner Benutzer-Shell (Benutzer ist sudoer) funktioniert. Wenn ich also nicht mache sudo su
, wird 1 nie für eine der CPUs wiederholt. Aber das Echo nach sudo su
für eine CPU lässt mich die anderen außerhalb der Root-Shell wiederholen.
Schließlich tee
funktioniert es auch nicht, so verwendet zu werden -
echo 1 | sudo tee /sys/devices/system/cpu/cpu1/online
Ich bin für jede Hilfe dankbar, warum dies geschieht und wie ich es sudo bash -c
innerhalb eines Skripts im Benutzerterminal verwenden kann.
Antwort1
Der Grund, sudo echo 1 > /sys/devices/system/cpu/cpu0/online
warum es nicht funktioniert, liegt darin, dass der sudo
Teil nur für den Hauptbefehl ( echo 1
) gilt; er gilt nicht für die Umleitung ( > /sys/devices/system/cpu/cpu0/online
), und daher wird das Schreiben in die Datei unter Ihrem Benutzerkonto ausgeführt.
Die Verwendung von etwas wie echo 1 | sudo tee /sys/devices/system/cpu/cpu0/online
sollte funktionieren, da der Schreibteil unter erledigt wird sudo
, während der echo
Teil unter Ihrem Konto erfolgt. Ich bin nicht sicher, warum es in Ihrem Fall nicht funktioniert hat.
Antwort2
Wenn Sie am Anfang des Skripts einfügen su
und dann die Befehle normal ausführen, funktioniert das einwandfrei. Der Grund, warum Sie sudo su
anstelle von nur verwenden müssen sudo
, ist, dass sudo nur mit dem Hauptprogramm funktioniert, die Umleitung ( >
) wird ohne Root-Berechtigungen ausgeführt.
Antwort3
Huh. Das ist komisch.
Das sollte funktionieren:
cat | sudo bash << "EOF"
echo 1 > /sys/devices/system/cpu/cpu1/online
echo 1 > /sys/devices/system/cpu/cpu2/online
echo 1 > /sys/devices/system/cpu/cpu3/online
EOF
Vielleicht haben die anderen Dinge bei Ihnen funktioniert, aber weil Sie den Skalierungsregler nicht deaktiviert haben, wurden die Kerne wieder ausgeschaltet, bevor Sie sie zu verwenden begannen?
Entsprechendhttp://elinux.org/Jetson/Performancedu solltest auchecho 0 > /sys/devices/system/cpu/cpuquiet/tegra_cpuquiet/enable