Fixando processo/programa por CPU(s)

Fixando um programa para um ou mais núcleos de CPU específicos, pode trazer varios benefícios. Por exemplo, Quando um programa/processo Cpu-bound(carga de trabalho intesivo da cpu), atribuindo um programa para um ou mais núcleos, reduziria erros de cache da CPU.

Outro exemplo é reduzir o consumo de processamento de um programa/processo que tem implementado parelelismo, que dependendo do caso, poderá consumir todos os núcleos.
Neste tutorial, vou descrever como executar um programa ou processo em núcleo(s) de CPU específico(s) no linux.
Para fixar um programa/processo, vou utilizar o taskset, um programa que faz parte do pacote util-linux. No processo de demonstração, vamos assumir que o pid do processo é 17507.
Instalação
  
  
   # apt-get install util-linux
  
  
Recuperar as informações de afinidade de CPU de um processo
Sintaxe: taskset -p <pid>  # retorno é em hexadecimal.
  
  
   $ taskset -p 17507
   pid 17507's current affinity mask: f
  
  
Neste exemplo, o retorno da afinidade corresponde a 1111 em formato binário, o que significa que o processo pode ser executado em qualquer um dos quatro diferentes núcleos [0-3] (meu pc é um quad-core)
Outra forma de receber o retorno da afinidade de forma mais amigável:
  
  
   $ taskset -cp 17507
   pid 17507's current affinity list: 0-3
  
  
Fixando um processo em um CPU(s) específico(s)
Usando o taskset, você pode fixar um processo em um ou mais CPUS.
  
  
   $ taskset -p 0x1 17507   # fixando no nucleo 0
   pid 17507's current affinity mask: f
   pid 17507's new affinity mask: 1
  
   $ taskset -cp 0,1 17507  # fixando no nucleo 0
   pid 17507's current affinity list: 0,3
   pid 17507's new affinity list: 0
  
  
Lançando e fixando um processo em um CPU(s) específico(s)
Neste exemplo, irei demonstrar a utilização do taskset fixando o konsole no núcleo 0:
  
  
   $ taskset 0x1 konsole
  
  
Vamos verificar a afinidade, vamos assumir que o pid do processo lançado seja 17507:
  
  
   $ taskset -p 17507
   pid 17507's current affinity mask: 1
  
  
Forma mais amigável:
  
  
   $ taskset -cp 17507
   pid 17507's current affinity list: 0
  
  
O taskset permite que um programa específico seja fixado a um ou mais CPUS, isso nao significa que nao exista outros processos que estejam ou serão agendadas nessas CPUS. Se deseja reservar CPUs para um programa em particular,
você pode usar um parâmetro do kernel “isolcpus = <cpu_id>” que lhe permite reservar o núcleo da CPU durante a inicialização. O sistema irá iniciar sem agendar tarefas nos CPUS que estão isolados. Agora sim você pode usar o taskset para atribuir de forma segura os núcleos que foram definidos no “isolcpus“.Que tal reservar alguma(s) CPU(s) na sua plaquinha?
Nos exemplos abaixo, vou reservar o núcleo 0 e 1. Lembre-se isto é um exemplo, tenha cuidado quando for alterar as opções de boot na placa.

– Raspberry PI 2:
Complemente no /boot/cmdline.txt com isolcpus=numero_da_cpu[,numero_da_cpu…] segue um exemplo:

  
  
   smsc95xx.turbo_mode=N kernel.nohalt kernel.panic=5 logo.nologo selinux=0 dwc_otg.dma_enable=1 dwc_otg.dma_burst_size=256 dwc_otg.lpm_enable=0 dwc_otg.fiq_fix_enable=1 plymouth.enable=0 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline rootwait ro fsck.mode=force fsck.repair=yes isolcpus=0,1
  
  

– Odroid-C1:
Complemente no /media/boot/boot.ini com isolcpus=numero_da_cpu[,numero_da_cpu…] na linha que começa com setenv bootargs, segue um exemplo:

  
  
   setenv bootargs "root=UUID=e139ce78-9841-40fe-8823-96a304a09859 rootwait ro ${condev} no_console_suspend vdaccfg=0xa000 logo=osd1,loaded,0x7900000,720p,full dmfc=3 cvbsmode=576cvbs hdmimode=${m} m_bpp=${m_bpp} vout=${vout_mode} ${disableuhs} ${hdmi_hpd} ${hdmi_cec}  isolcpus=0,1"
  
  

Leonardo Lontra
Programador Python/Cython/ShellScript/C/C++/QT/JS e Administrador de Redes.
Apaixonado por visão computacional, em específico Machine Learning/BackgroundSubtractor/Face Recognition e Object Tracking.
Atualmente desenvolvendo trabalhos voltados à contagem de pessoas. Se diverte utilizando suas raspberry’s e odroid’s para detectar rostos e sinalizar quando alguém está prestes a bater à porta para encher o saco.

Que tal nos encontrar no SeuTubo para ver dicas, tutoriais e Reviews de placas? Canal Sistemas Embarcados

Que tal na página do Facebook?

 

Ou Instagram?

 

Quem sabe Google Plus?

 

Que tal no Pinterest?

 

Ou talvez nos encontrar no Twitter para receber as ultimas noticias quentinhas: @SEmbarcados

 

E não esqueça que também tem o email, contato@sistemasembarcados.org

 

Conheça também nossos grupos do Facebook:

Beijunda e até o próximo embarcado!