Como atribuir um programa a um núcleo da CPU usando o conjunto de tarefas

À medida que os processadores multi-core se tornam cada vez mais comuns em servidores, laptops ou desktops e até mesmo em dispositivos móveis, cada vez mais aplicativos são otimizados para esse tipo de sistema. No entanto, às vezes pode ser útil vincular um programa ou processo a um ou mais kernels específicos. Vamos ver como fazer ...

Instalar conjunto de tarefas

A ferramenta de conjunto de tarefas faz parte do pacote "util-linux". A maioria das distribuições do Linux vem com o pacote pré-instalado por padrão. Caso o conjunto de tarefas não esteja disponível, é possível instalá-lo da seguinte forma:

En Debian / Ubuntu e derivados:

sudo apt-get install util-linux

En Fedora e derivados:

sudo yum instalar util-linux

Ver a afinidade de CPU de um processo em execução

Para recuperar informações de afinidade de CPU para um processo, use o seguinte formato:

conjunto de tarefas -p PID

Por exemplo, para verificar a afinidade da CPU de um processo com PID 2915:

conjunto de tarefas -p 2915

Retorna o resultado:

máscara de afinidade atual do pid 2915: ff

O conjunto de tarefas retorna a afinidade da CPU atual em um formato de bitmask hexadecimal. No exemplo, a afinidade (representada em uma máscara de bits hexadecimal) corresponde a "11111111" em formato binário, o que significa que o processo pode ser executado em qualquer um dos oito núcleos de CPU diferentes (0 a 7).

O bit mais baixo em uma máscara de bit hexadecimal corresponde ao ID do núcleo 0, o segundo bit mais baixo da direita para o ID do núcleo 1, o terceiro bit mais baixo para o ID do núcleo 2 e assim por diante. Portanto, por exemplo, uma afinidade de CPU "0x11" representa os núcleos ID 0 e 4.

O conjunto de tarefas pode exibir a afinidade da CPU como uma lista de processadores em vez de uma máscara de bits, o que é muito mais fácil de ler. Para usar este formato, você deve executar o conjunto de tarefas com a opção "-c". Por exemplo:

conjunto de tarefas -cp 2915

Retorna o resultado:

lista de afinidade atual do pid 2915: 0-7

Força um processo a rodar em um kernel específico

Usando o conjunto de tarefas, um processo em execução pode ser atribuído a um núcleo de CPU específico. Para fazer isso, você deve usar o seguinte formato:

taskset -p COREMASK PID taskset -cp CORE-LIST PID

Por exemplo, para atribuir um processo aos núcleos 0 e 4, você executaria:

conjunto de tarefas -p 0x11 9030

O que o resultado retorna:

Máscara de afinidade atual do pid 9030: ff pid 9030's nova máscara de afinidade: 11

De forma equivalente, você pode executar:

conjunto de tarefas -cp 0,4 9030

Com a opção "-c", você pode especificar uma lista de IDs de kernel numéricos, separados por vírgulas, ou pode até incluir intervalos (por exemplo, 0,2,5,6-10).

Inicie um programa usando um kernel específico

O conjunto de tarefas também permite lançar um novo programa usando vários kernels específicos. Para fazer isso, ele deve ser usado no seguinte formato:

Conjunto de tarefas COREMASK EXECUTÁVEL

Por exemplo, para iniciar o programa VLC na CPU core ID 0, use o seguinte comando:

conjunto de tarefas -c 0 vlc

Dedique um kernel apenas a um programa particular

Embora o conjunto de tarefas permita atribuir um programa a um kernel específico, isso não significa que não haja outros programas ou processos que façam uso dele. Para evitar isso e dedicar um kernel inteiro a um programa particular, você deve usar o parâmetro de kernel "isolcpus", que permite reservar um kernel durante a inicialização.

Para fazer isso, você deve adicionar o parâmetro "isolcpus =" na linha do kernel no GRUB. Por exemplo, para reservar os núcleos de ID 0 e 1, adicione "isolcpus = 0,1".

Feito isso, o agendador do Linux não atribuirá nenhum processo regular ao kernel reservado, a menos que seja especificamente atribuído com o conjunto de tarefas.

fonte: xmodule & páginas do manual do conjunto de tarefas.


Deixe um comentário

Seu endereço de email não será publicado. Campos obrigatórios são marcados com *

*

*

  1. Responsável pelos dados: Miguel Ángel Gatón
  2. Finalidade dos dados: Controle de SPAM, gerenciamento de comentários.
  3. Legitimação: Seu consentimento
  4. Comunicação de dados: Os dados não serão comunicados a terceiros, exceto por obrigação legal.
  5. Armazenamento de dados: banco de dados hospedado pela Occentus Networks (UE)
  6. Direitos: A qualquer momento você pode limitar, recuperar e excluir suas informações.

  1.   Petercheco dito

    Bom post :).

  2.   Luis dito

    Boa postagem, mas sem o espírito de trolling ...

    Qual é a utilidade de atribuir um programa a um kernel específico ??

    Quero dizer; Se você tem um computador com 12 núcleos, o lógico seria um determinado programa ser executado usando esses 12 núcleos e não limitá-lo, pois assim obteremos o melhor desempenho possível.

    O que vejo é útil é a opção que nos permite não atribuir nenhum processo a um determinado kernel, deixando seu uso exclusivo para um determinado programa.

    1.    jvk85321 dito

      Faz sentido o que você mencionou, ao deixar o planejador usar todos os núcleos, os recursos ficam mais equilibrados, mas às vezes é necessário um núcleo de dedicação exclusiva, como rodar uma máquina virtual com uma tarefa específica, o desempenho dessa máquina melhora substancialmente quando não há mais processos em execução no kernel atribuído.

      atte
      jvk85321

      1.    vamos usar linux dito

        Exato! Obrigado, jvk! 🙂

      2.    lf dito

        Mas quando você está criando a máquina virtual, ele pede para você escolher a quantidade de CPU atribuída ... de que adianta escolher esse valor se no final o sistema operacional omite isso e execute em todas as CPUs ... Pois aí o exemplo não é dos melhores ...

        Para fazer o Flash funcionar no Windows 8.1 x64, AMD e Firefox, foi recomendado escolher que o Flash rodasse apenas em uma CPU, porém não funcionou para mim. Também seria conveniente se eles o adicionassem (se já não estiver lá) aos gerenciadores de tarefas do DE diferente, ou pelo menos do KDE.

      3.    lf dito

        ah, não tinha entendido o fim do comentário ... Mas para isso, todos os processos da CPU rodando a máquina virtual teriam que ser banidos. Ou atribua-os a outras CPUs. Comentário interessante e muito bom.

    2.    Fernando dito

      Usado para criar supercomputadores geniais

  3.   Luis dito

    Está entendido.

    Obrigado pelo esclarecimento.

  4.   Teck dito

    Ao reservar um kernel para um programa específico, o que acontece com os threads de execução? No caso de você fazer isso com um kernel com HT, ele reserva 2 threads de execução para o programa.

  5.   Trocador dito

    Este comando pode não parecer muito útil em computadores com vários núcleos, mas para aqueles de nós que possuem um Dual Core, é bastante prático. Por exemplo, eu tenho um jogo que quando eu o abro usa todos os núcleos do processador e se eu também tenho outros programas que precisam da CPU (como alguns buscam com grep em arquivos grandes) então o sistema fica lento. A solução é tão simples quanto limitar o jogo para usar apenas um dos núcleos.
    Eu também concordo se, eles realmente deveriam integrar isso aos gerenciadores de tarefas (aqueles que eu tentei até agora no Gentoo, eu acho que nenhum tem), especialmente quando no Windows é algo que existe desde o XP (clique com o botão direito em um processo> "Definir afinidade ...") mas há algum tempo encontrei o seguinte script que transforma o conjunto de tarefas em algo um pouco mais intuitivo (publicado originalmente clique aqui e até mesmo alguns casos em que é necessário gerenciar o uso dos núcleos são mostrados):
    #!/bin/bash
    read -p 'Ingrese el ID del proceso en cuestión: ' ID
    read -p 'Ingrese la lista de procesadores separados por comas: ' P
    echo 'Su ID es '$ID' y los procesadores son '$P
    sudo taskset -p -c $P $ID
    read -p 'Listo, presione enter para finalizar' P

    Com algumas modificações, pode-se indicar o nome do processo no lugar do PID (ou que aceita ambos e que decide quando aquele parâmetro é uma coisa ou outra).

  6.   Jorss dito

    não há interface gráfica para o conjunto de tarefas para novos usuários gostariam