Red Hat Training

A Red Hat training course is available for RHEL 8

20.3. Política de programação de sintonia

No Red Hat Enterprise Linux, a menor unidade de execução de processo é chamada de thread. O programador do sistema determina qual processador executa uma thread, e por quanto tempo a thread funciona. Entretanto, como a principal preocupação do agendador é manter o sistema ocupado, ele pode não agendar threads de maneira ideal para o desempenho da aplicação.

Por exemplo, digamos que uma aplicação em um sistema NUMA está rodando no Nó A quando um processador no Nó B se torna disponível. Para manter o processador no Nó B ocupado, o programador move uma das threads da aplicação para o Nó B. Entretanto, a thread da aplicação ainda requer acesso à memória no Nó A. Mas, esta memória levará mais tempo para ser acessada porque a thread agora está rodando no Nó B e a memória do Nó A não é mais local para a thread. Assim, pode levar mais tempo para que a thread termine de rodar no nó B do que levaria para esperar que um processador no nó A ficasse disponível, e então executar a thread no nó original com acesso à memória local.

As aplicações sensíveis ao desempenho muitas vezes se beneficiam do designer ou administrador que determina onde os fios são executados. O programador Linux implementa uma série de políticas de programação que determinam onde e por quanto tempo um thread é executado. A seguir estão as duas principais categorias de políticas de agendamento:

  • Políticas normais: Os fios normais são usados para tarefas de prioridade normal.
  • Políticas em tempo real: As políticas em tempo real são utilizadas para tarefas sensíveis ao tempo que devem ser concluídas sem interrupções. Os fios em tempo real não estão sujeitos a cortes de tempo. Isto significa que a rosca corre até que bloqueie, saia, ceda voluntariamente, ou seja, é preterida por uma rosca de maior prioridade. A rosca de prioridade mais baixa em tempo real é programada antes de qualquer rosca com uma política normal. Para mais informações, consulte Seção 20.3.1, “Programação estática de prioridades com SCHED_FIFO” e Seção 20.3.2, “Agendamento prioritário redondo com SCHED_RR”.

20.3.1. Programação estática de prioridades com SCHED_FIFO

O SCHED_FIFO, também chamado de programação estática de prioridades, é uma política em tempo real que define uma prioridade fixa para cada linha. Esta política permite que os administradores melhorem o tempo de resposta de eventos e reduzam a latência. É recomendável não executar esta política por um período de tempo prolongado para tarefas sensíveis ao tempo.

Quando SCHED_FIFO estiver em uso, o agendador escaneia a lista de todos os tópicos SCHED_FIFO em ordem de prioridade e agenda o tópico de prioridade mais alta que está pronto para rodar. O nível de prioridade de um tópico SCHED_FIFO pode ser qualquer número inteiro de 1 a 99, onde 99 é tratado como a prioridade mais alta. A Red Hat recomenda começar com um número mais baixo e aumentar a prioridade somente quando você identificar problemas de latência.

Atenção

Como as roscas em tempo real não estão sujeitas ao corte do tempo, a Red Hat não recomenda estabelecer uma prioridade como 99. Isto mantém seu processo no mesmo nível de prioridade que as roscas de migração e de vigilância; se sua rosca entrar em um loop computacional e estas roscas estiverem bloqueadas, elas não poderão funcionar. Os sistemas com um único processador acabarão ficando pendurados nesta situação.

Os administradores podem limitar a largura de banda SCHED_FIFO para impedir que programadores de aplicações em tempo real iniciem tarefas em tempo real que monopolizam o processador.

A seguir estão alguns dos parâmetros utilizados nesta política:

/proc/sys/kernel/sched_rt_period_us
Este parâmetro define o período de tempo, em microssegundos, que é considerado como cem por cento da largura de banda do processador. O valor padrão é 1000000 μs, ou 1 second.
/proc/sys/kernel/sched_rt_runtime_us
Este parâmetro define o período de tempo, em microssegundos, que é dedicado à execução de roscas em tempo real. O valor padrão é 950000 μs, ou 0.95 seconds.