diferença entre o conjunto de tarefas e o cpuset

8

Estou tentando reduzir a latência do meu aplicativo de rede linux. Aprendi que existem duas ferramentas para "vincular" um programa a um núcleo específico da CPU: conjunto de tarefas e cpuset.

  1. Qual devo preferir? Eles são equivalentes em um nível inferior?
  2. (a disposição) Meu aplicativo tem thread único e deve processar uma conexão tcp única (sem reconectar) em uma rede LAN rápida com a menor latência possível. Estou no caminho certo?
John Linberg
fonte
Você leu as respectivas páginas de manual?
Michael Hampton
Você executou perfis detalhados para ter certeza de que é a parte da rede Linux que causa a latência, e não o aplicativo?
Tero Kilkanen
Qual SO / distribuição / versão / kernel você está executando?
precisa saber é o seguinte
Além disso, que tipo de hardware está envolvido? Servidor de marca / modelo, especificações da CPU, infra-estrutura de rede ...
ewwhite

Respostas:

12

O conjunto de tarefas é para vincular um processo a uma ou mais CPUs; essencialmente especificando onde ele pode ser executado na execução inicial ou enquanto estiver sendo executado. Se estiver usando RHEL / CentOS no equipamento servidor moderna, numactlé recomendado ao longo taskset.

Cpuset / cset é para proteção de CPU e é uma estrutura construída em torno de cgroups do Linux. O Cset nunca foi popular em determinadas distribuições (como RHEL) porque existem outras ferramentas disponíveis para o gerenciamento de processos.

O primeiro comando abaixo cria um escudo que limitaria as tarefas do sistema operacional aos núcleos 0 e 8. da CPU. O segundo moveria a sessão atual do shell para o escudo da CPU especificado, resultando em um isolamento dos processos do sistema e do usuário.

# cset shield --cpu 1-7,9-15 --kthread=on
# cset proc --move --pid=$$ --threads --toset=user

Há outras coisas para verificar e ajustar antes de seguir o caminho dos processos de ligação às CPUs; interrupções ( irqbalancedesativação parcial), configurações de economia de energia, agendador do sistema, elevadores de E / S, política em tempo real ( chrt).

Consulte: Configurações de TCP de baixa latência no Ubuntu

Aqui está um exemplo ( complicado ) de um wrapper de aplicativo que seleciona um núcleo, interrompe o equilíbrio, inicia e lista negra do núcleo selecionado, depois executa ./your_program com SCHED_FIFO e prioridade 99 no núcleo selecionado.

Core=5
CoreMask=`echo "16 o 2 $Core ^ p" | dc`
service irqbalance stop
  until [ "`service irqbalance status`" = "irqbalance is stopped" ] ; do sleep 1 ; done
IRQBALANCE_ONESHOT=1 IRQBALANCE_BANNED_CPUS=${CoreMask} irqbalance
sleep 1
  until [ "`service irqbalance status`" = "irqbalance is stopped" ] ; do sleep 1 ; done
numactl --physcpubind=${Core} --localalloc chrt -f 99 ./your_program
ewwhite
fonte
1
Observe que é possível que um aplicativo redefina suas afinidades ao usá-lo taskset. Se você usa o cpuset, não é possível alterar suas afinidades do que o cpuset lhe concede.
Matthew Ife
E numactl??
precisa saber é
1
Mesmo, ambos os programas chamam a mesma chamada de sistema subjacente sched_setaffinity.
Matthew Ife