
Estoy usando la placa de desarrollo Jetson TK1 de NVIDIA que tiene Ubuntu 14.04. Es un sistema ARM de 4 núcleos y, de forma predeterminada, 3 de ellos están "fuera de línea".
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
Si bien se supone que se activan automáticamente cuando el programador detecta suficiente carga, no lo hacen (al menos para nuestra carga de trabajo). La solución es escribir un "1" en una ubicación dentro de /sys -
/sys/devices/system/cpu/cpu1/online
La documentación dice que se deben seguir estos comandos en orden:
sudo su
echo 1 > /sys/devices/system/cpu/cpu1/online
y repita para los cpus 2 y 3. Esto funciona:
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#
No quiero usarlo sudo su
, personalmente, porque me duele la vista, pero principalmente porque necesitamos un script que pueda activar todas las CPU y luego ejecutar el comando para iniciar nuestra carga de trabajo. Lo ideal es que lo ponga /etc/rc.local
. Eso no funciona. ¿Puede ser que el kernel apague las CPU después de ejecutar rc.local en el arranque?
En cualquier caso, aquí está mi guión:
#!/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>
El problema es que <some command>
las líneas de eco de arriba se ejecutan y no dan nada en la salida estándar. Sin embargo, lscpu
muestra solo 1 CPU activa. Pegar estas líneas directamente en la terminal no funciona. Esa no fue la parte desconcertante para mí. Supuse que había estropeado algo. Esto es lo queesmisterioso. Hacerlo sudo su
seguido del echo
comando funciona, como dije antes. Ahora, saliendo de root y ejecutando
sudo bash -c "echo '1' > /sys/devices/system/cpu/cpu2/online"
sudo bash -c "echo '1' > /sys/devices/system/cpu/cpu3/online"
en mi shell de usuario (el usuario es sudoer) funciona. Entonces, si no lo hago sudo su
, 1 nunca se repite para ninguna de las CPU. Pero hacer eco después sudo su
para una CPU me permite hacer eco de las demás fuera del shell raíz.
Finalmente, tee
usado así tampoco funciona.
echo 1 | sudo tee /sys/devices/system/cpu/cpu1/online
sudo bash -c
Se agradecería cualquier ayuda sobre por qué sucede esto y cómo podría usarlo desde un script en la terminal de usuario.
Respuesta1
La razón por la sudo echo 1 > /sys/devices/system/cpu/cpu0/online
que no funciona es porque la sudo
parte se aplica sólo al comando principal ( echo 1
); no se aplica a la redirección ( > /sys/devices/system/cpu/cpu0/online
), por lo que la parte de escritura en el archivo se realiza en su cuenta de usuario.
Usar algo como echo 1 | sudo tee /sys/devices/system/cpu/cpu0/online
debería funcionar, ya que la parte de escritura se realizará en sudo
, mientras que la echo
parte estará en su cuenta. No estoy seguro de por qué no funcionó en su caso.
Respuesta2
Ponerlo su
en la parte superior del script y luego ejecutar los comandos normalmente funcionará bien. La razón por la que debe usar sudo su
en lugar de just sudo
es porque sudo solo funciona en el programa principal, la redirección ( >
) se ejecuta sin privilegios de root.
Respuesta3
Eh. Eso es raro.
Esto debería funcionar:
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
¿Quizás las otras cosas funcionaron para usted, pero como no desactivó el regulador de escala, apagó los núcleos antes de comenzar a usarlos?
De acuerdo ahttp://elinux.org/Jetson/Performancetambién deberíasecho 0 > /sys/devices/system/cpu/cpuquiet/tegra_cpuquiet/enable