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.
- Qual devo preferir? Eles são equivalentes em um nível inferior?
- (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?
central-processing-unit
performance-tuning
latency
multi-core
John Linberg
fonte
fonte
Respostas:
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 longotaskset
.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.
Há outras coisas para verificar e ajustar antes de seguir o caminho dos processos de ligação às CPUs; interrupções (
irqbalance
desativaçã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.
fonte
taskset
. Se você usa o cpuset, não é possível alterar suas afinidades do que o cpuset lhe concede.numactl
??sched_setaffinity
.