Estou usando a placa de desenvolvimento Jetson TK1 da NVIDIA que tem o Ubuntu 14.04. É um sistema ARM de 4 núcleos e, por padrão, 3 deles sã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
Enquanto eles devem acordar automaticamente quando o agendador detecta carga suficiente, eles não o fazem (pelo menos para nossa carga de trabalho). A solução é 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 os processadores 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#
Eu não quero usar sudo su
, pessoalmente, porque dói meus olhos, mas principalmente porque precisamos de um script que possa acordar todas as CPUs e depois executar o comando para iniciar nossa carga de trabalho. Idealmente, eu colocaria em /etc/rc.local
. Isso não funciona. Pode ser que o kernel desligue os processadores 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>
é executado e as linhas de eco acima não fornecem nada no stdout. No entanto, lscpu
mostra apenas 1 CPU ativa. Colando estas linhas no terminal diretamente não funciona. Essa não foi a parte intrigante para mim. Eu assumi que estraguei alguma coisa. Aqui está o que é confuso. Fazer sudo su
seguido do comando echo
funciona, como eu disse anteriormente. Agora, saindo do root e rodando
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. Portanto, se eu não fizer sudo su
, 1 nunca será ecoado para nenhuma das CPUs. Mas ecoar depois de sudo su
para uma CPU me permite ecoar as outras pessoas fora do shell da 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
de dentro de um script no terminal do usuário seria bem-vinda.