desativando núcleos de CPU no processador quad core no linux

14

Quero desabilitar 3 núcleos da CPU e executar meu processador em um único núcleo. Tenho comando usado: maxcpus=1. Mas depois disso eu executei este comando ls /sys/devices/system/cpu. Ainda mostra cpu0,cpu1,cpu2,cpu3.

Eu também tentei: echo 0 > /sys/devices/system/cpu3/onlinemas eu recebo o seguinte erro: no such file or directory.

user3818847
fonte
Não está claro onde você coloca o maxcpus=1 comando ? Você colocou essa string grub.cfgcomo uma opção de inicialização? (Atualize sua pergunta em vez de responder nos comentários).
Anthon
Eu estou usando a placa freescale IMx6 sabreauto no linux OS.I executado o comando em um emulador de terminal "gtkterm"
user3818847
Com este comando echo 0> / sys / devices / system / cpu3 / online, posso ver o desligamento da cpu3. Agora o que eu quero saber é, eu deveria reiniciar o sistema para que as alterações ao efeito ou eu posso continuar sem reiniciar
user3818847
AFAIK, você deve especificar maxcpus = 1 como um parâmetro para o kernel (ou seja, quando você estiver no grub). Edite '/ etc / defaults / grub' para adicioná-lo aos parâmetros do kernel, execute 'update-grub' e reinicie. Isso tornará as coisas persistentes, ou seja, com apenas uma CPU na inicialização do Linux.
Anthon
2
@ user3818847 que distro você está usando? A modificação dos parâmetros de inicialização (para aprovação maxcpus=1) varia de acordo com a distribuição. Além disso, o /syscaminho que você possui é simplesmente o errado, o caminho correto é /sys/devices/system/cpu/cpu3/online.
Patrick

Respostas:

28

Como Patrick indicou em um comentário , você /syserrou o caminho .

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

Se você deseja desligar todas as CPUs, exceto cpu0:

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

Digitar maxcpus=1em um prompt de shell não tem efeito. Mais precisamente, ele define a variável maxcpuspara o valor 1nesse shell, que não tem nenhum outro efeito. Você pode definir o número de CPUs no momento da inicialização, passando maxcpuscomo um parâmetro do kernel . Para isso, você precisa alterar a configuração do gerenciador de inicialização (por exemplo, para alterar a linha de comando do kernel no U-Boot).

Gilles 'SO- parar de ser mau'
fonte
Obrigado pelas sugestões. Funcionou com o comando sugerido por você
user3818847
Isso é pelo menos um pouco específico do kernel. Estou executando o kernel 3.6.6 e não há esses arquivos; você usa os arquivos single /sys/devices/system/cpu/onlinee ./offlinepara controlar todos os núcleos.
Daniel Griscom
@ Gilles - Existe uma maneira de saber quanto tempo leva para ligar coree desligar?
Chetan Arvind Patil
@ChetanArvindPatil Time it. Eu acho que o tempo seria dominado pelo acesso à RAM se o código envolvido ainda não estiver no cache L2 e no momento de desligar o núcleo, mas depende muito da CPU e do SO.
Gilles 'SO- stop be evil'
1
@Xofo Quando o kernel desativa um núcleo, esse núcleo está executando o código do kernel, portanto, nenhum thread está agendado nesse núcleo específico naquele momento. Depois que o núcleo está desativado, os threads não são mais agendados nesse núcleo. Não sei o que acontece se a afinidade de um thread o restringir a um conjunto de núcleos totalmente desativados.
Gilles 'SO- stop be evil'
1

você não necessariamente desativa ou desativa núcleos.

você usaria cpusets e taskset

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

Um cpuset define uma lista de CPUs e nós de memória ...

O sistema de arquivos cpuset é uma interface de pseudo-sistema de arquivos para o mecanismo cpuset do kernel, usado para controlar o posicionamento do processador e o posicionamento da memória dos processos. Geralmente é montado em / dev / cpuset.

Em sistemas com kernels compilados com suporte embutido para cpusets, todos os processos são anexados a um cpuset, e os cpusets estão sempre presentes. Se um sistema suportar cpusets, ele terá a entrada nodev cpuset nos arquivos / proc / filesystems. Ao montar o sistema de arquivos cpuset (consulte a seção EXEMPLO abaixo), o administrador pode configurar os cpusets em um sistema para controlar o processador e a localização da memória dos processos nesse sistema. Por padrão, se a configuração do cpuset em um sistema não for modificada ou se o sistema de arquivos cpuset nem estiver montado, o mecanismo do cpuset, apesar de presente, não terá efeito no comportamento do sistema.

As CPUs de um sistema incluem todas as unidades lógicas de processamento nas quais um processo pode ser executado, incluindo, se houver, vários núcleos de processador em um pacote e Hyper-Threads em um núcleo de processador. Os nós de memória incluem todos os bancos distintos da memória principal; sistemas pequenos e SMP geralmente têm apenas um nó de memória que contém toda a memória principal do sistema, enquanto os sistemas NUMA (acesso não uniforme à memória) têm vários nós de memória.

Em resumo, se você tiver 1 CPU com 6 núcleos, configuraria os cpusets e iniciaria seu processo em um cpuset configurado em apenas um núcleo, como o núcleo nº 3, por exemplo. Se fosse um processo paralelo, tudo estaria confinado a esse núcleo, de modo que, se você lançasse 4 processos em uma determinada cpuset com apenas um núcleo definido, cada um dos 4 processos obteria 25% de utilização da CPU no núcleo nº 3.

Com base nisso, o que normalmente acontece é que um cpuset é configurado de forma que

  • em um sistema com mais de 200 núcleos, por exemplo, cpusetA tem núcleos 0..60 onde quer que eles estejam localizados, cpusetB é núcleos 61..70; cpusetC tem núcleos 71..80; e assim por diante, no entanto, um administrador / arquiteto escolhe configurar.
  • cpusetA é alocado para determinados usuários e / ou programas de software específicos; cpusetB é alocado para diferentes usuários / programas; e assim por diante.
  • um usuário lança um trabalho (processo) que solicitaria N núcleos ... dentro de um determinado cpuset e agora esses vários processos (paralelos) estão confinados ao cpuset especificado. E para os N paralelos confinados a um determinado cpuset, cada um desses processos deveria / deveria usar afinidade de processador ou cpu, de modo que esses processos paralelos não se debatem em núcleos diferentes no cpuset.

também: https://linux.die.net/man/1/taskset

Ron
fonte