diferença entre taskset e cpuset

5

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

  1. Qual eu 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. Eu estou no caminho certo?
por John Linberg 30.08.2014 / 11:13

1 resposta

10

O Taskset é para vincular um processo a uma ou mais CPUs; essencialmente especificando onde ele pode ser executado na execução inicial ou durante a execução. Se estiver usando o RHEL / CentOS em equipamentos de servidor modernos, numactl é recomendado acima de taskset .

O

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

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

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

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

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

Aqui está um exemplo ( convoluted ) de um wrapper de aplicativo que seleciona um core, pára o irqbalance, inicia-o e coloca blacklists no core selecionado, em seguida, 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
    
por 30.08.2014 / 12:51