Temos um processo responsável por pesquisar o hardware em intervalos dependentes do tempo. Gostaríamos de dedicar um núcleo de CPU a este processo. Por exemplo, queremos que este processo permaneça executável em todos os momentos.
Nossa primeira tentativa de resolver esse problema foi a seguinte:
# Set process to highest priority
nice -n -20 cmd
# Set thread affinity in C for our hardware sampling thread
pthread_setaffinity_np(...)
Ambas as etapas acima funcionam conforme o esperado. Nosso tópico permanece core3
onde o colocamos e nice
está -20
no topo.
Quando reexecutar ftrace
comopor esta discussãoeesse assunto, geralmente vemos o seguinte:
> cat trace | grep " 3)" | grep " => "
3) rhd_loc-2735 => <idle>-0
3) <idle>-0 => rhd_loc-2735
3) rhd_loc-2735 => <idle>-0
3) <idle>-0 => rhd_loc-2735
3) rhd_loc-2735 => <idle>-0
3) <idle>-0 => rhd_loc-2735
rhd_loc-2735
é o nosso processo.
Além do que foi mostrado acima, vemos muitos casos em que kworker-2703
switches entram e, às vezes, outros processos de prioridade mais baixa são trocados para o núcleo.
Acreditamos que a razão para as mudanças de contexto é que nosso processo se comunica com SPI
(Serial Peripheral Interface) que espera IRQs
e também SPI
funciona a uma taxa de clock uma ordem de magnitude mais lenta que o núcleo da CPU. Portanto, nosso processo passa grande parte do tempo aguardando SPI/IRQs, por exemplo, não está em um Runnable
estado. Independentemente da prioridade ou afinidade, o kernel é livre para atribuir outros processos ao núcleo.
Isso faz com que nossa taxa de amostragem de hardware seja mais variável e menor do que poderia ser, porque nosso núcleo de CPU nem sempre está imediatamente pronto para processar o próximo valor SPI
e, em seguida, enviar uma nova solicitação de amostragem.
Pergunta:
Podemos 1) forçar todos os outros processos a ficarem fora do núcleo para que nosso processo possa responder imediatamente às solicitações de interrupção ou 2) manter nosso thread principal Executável para que esteja sempre disponível para processar a próxima solicitação?