
Estou usando a placa de desenvolvimento Jetson TK1 da NVIDIA que possui Ubuntu 14.04. É um sistema ARM de 4 núcleos e por padrão, 3 deles estão "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
Embora devam ser ativados automaticamente quando o agendador detecta carga suficiente, eles não o fazem (pelo menos para nossa carga de trabalho). A solução alternativa é escrever um "1" em um local dentro de/sys -
/sys/devices/system/cpu/cpu1/online
A documentação diz para seguir estes comandos, em ordem -
sudo su
echo 1 > /sys/devices/system/cpu/cpu1/online
e repita para cpus 2 e 3. Isso 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#
Não quero usar sudo su
, pessoalmente, porque machuca meus olhos, mas principalmente porque precisamos de um script que possa ativar todas as CPUs e então executar o comando para iniciar nossa carga de trabalho. Idealmente, eu colocaria isso em /etc/rc.local
. Isso não funciona. Pode ser que o kernel desligue as CPUs após o rc.local ser executado na inicialização?
De qualquer forma, aqui está o meu script -
#!/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>
O problema é que <some command>
as execuções e as linhas de eco acima não fornecem nada no stdout. No entanto, lscpu
mostra apenas 1 CPU ativa. Colar essas linhas diretamente no terminal não funciona. Essa não foi a parte intrigante para mim. Presumi que estraguei alguma coisa. Aqui está o queéintrigante. Fazer sudo su
seguido do echo
comando funciona, como disse anteriormente. Agora, saindo do root e executando
sudo bash -c "echo '1' > /sys/devices/system/cpu/cpu2/online"
sudo bash -c "echo '1' > /sys/devices/system/cpu/cpu3/online"
no meu shell de usuário (o usuário é sudoer) funciona. Então, se eu não fizer isso sudo su
, 1 nunca será repetido para nenhuma das CPUs. Mas ecoar depois sudo su
de uma CPU me permite repetir as outras fora do shell raiz.
Finalmente, tee
usado assim também não funciona -
echo 1 | sudo tee /sys/devices/system/cpu/cpu1/online
Qualquer ajuda sobre por que isso está acontecendo e como eu poderia usar sudo bash -c
um script no terminal do usuário seria apreciada.
Responder1
O motivo sudo echo 1 > /sys/devices/system/cpu/cpu0/online
de não funcionar é porque a sudo
parte se aplica apenas ao comando principal ( echo 1
); isso não se aplica ao redirecionamento ( > /sys/devices/system/cpu/cpu0/online
) e, portanto, a parte de gravação no arquivo é feita na sua conta de usuário.
Usar algo como echo 1 | sudo tee /sys/devices/system/cpu/cpu0/online
deve funcionar, pois a parte escrita será feita em sudo
, enquanto a echo
parte estará em sua conta. Não sei por que não funcionou no seu caso.
Responder2
Colocar su
no topo do script e depois executar os comandos normalmente funcionará perfeitamente. A razão pela qual você deve usar sudo su
em vez de apenas sudo
é porque o sudo só funciona no programa principal, o redirecionamento ( >
) é executado sem privilégios de root.
Responder3
Huh. Isso é estranho.
Isso deve 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
Talvez as outras coisas estivessem funcionando para você, mas como você não desativou o regulador de escala, ele desligou os núcleos antes de começar a usá-los?
De acordo comhttp://elinux.org/Jetson/Performancevocê também deveriaecho 0 > /sys/devices/system/cpu/cpuquiet/tegra_cpuquiet/enable