Como alterar a frequência do comutador de contexto do Linux?

15

Como é possível alterar a frequência do comutador de contexto Linux (linaro, ubuntu, debian)?

Estou bem para trocar um sistema menos responsivo por um mais eficiente.

EDIT1: Eu tenho um processo principal que quero rodar o mais rápido possível (ciclos de clock máximo por segundo), então pensei em reduzir a frequência do switch de contexto (= aumentando o timeslice). A questão é como fazê-lo e haveria um efeito significativo. Posso calcular o custo da troca de contexto? Significado, posso estimar se eu aumentar o timeslice por dois, qual será o meu ganho de desempenho em% para o processo principal que me interessa?

    
por Nadav B 02.09.2018 / 12:35

1 resposta

14

Se a sua tarefa for o processo de apenas solicitação de tempo em uma CPU específica, não haverá alternância de contexto entre tarefas :-). Mas a CPU ainda pode ser interrompida, causando uma troca de contexto no kernel e de volta. E uma causa possível é o temporizador de preempção, verificando se existe outra tarefa para executar nesta CPU ...

O Linux pode evitar gerar interrupções temporárias de preempção na cpu quando não houver razão para fazê-lo. Veja CONFIG_NO_HZ_FULL . Para usar este recurso, ele deve ser ativado quando o kernel foi construído, e ele deve ser ativado usando uma opção de inicialização.

  • link
  • link "(quase) operação sem tickless completa em 3,10"

By default, no CPU will be an adaptive-ticks CPU. The "nohz_full=" boot parameter specifies the adaptive-ticks CPUs. For example, "nohz_full=1,6-8" says that CPUs 1, 6, 7, and 8 are to be adaptive-ticks CPUs. Note that you are prohibited from marking all of the CPUs as adaptive-tick CPUs [...]

A LWN.net diz que "de acordo com Ingo Molnar, até 1% do tempo da CPU será economizado" para CPUs com adaptações. O documento do kernel diz que isso tem seis custos diferentes, e há também uma lista de "PROBLEMAS CONHECIDOS".

Esse ganho é relativamente pequeno, particularmente em comparação com os possíveis ganhos de taxa de transferência de redução da frequência de alternâncias de contexto entre várias tarefas, conforme mencionado nesta resposta: Como alterar o comprimento de fatias de tempo usadas pela CPU do Linux agendador?

Impressão pequena: estas medições são anteriores ao suporte a Specter, Meltdown, KPTI e x86 ASID :-(. E eu acho que elas também se aplicam a hardwares mais antigos. Pergunte a um especialista em kernel ou faça suas próprias medições sobre como o custo do contexto Mudanças mudaram na sua versão específica do kernel e no hardware ... PTI era amplamente suposto ser mitigado pelo ASID, exceto pelo software que invoca o kernel com muita freqüência, o principal exemplo sendo bancos de dados, mas eu não tenho uma boa compreensão. nos números.

A esperança de Molnar no patch RFC original era que, com o tempo, "provavelmente seria ativado pela maioria das distribuições Linux". Eu percebo que o Fedora 28 fornece um kernel padrão construído com NO_HZ_FULL support. O Debian 9, no entanto, não o faz.

Mais recentemente, o do Linux v4.17 remove um temporizador residual de 1 Hz do nohz_full CPUs . Eu imagino que o efeito na taxa de transferência é bem pequeno :-), mas eu tenho tentado seguir o status de NO_HZ_FULL benefits quando há múltiplos processos executáveis em uma CPU -

once we reach 0 Hz we can [then] remove the periodic tick assumption from nr_running>=2 as well, by essentially interrupting busy tasks only as frequently as the sched_latency constraints require us to do - once every 4-40 msecs, depending on nr_running.

Isso é um pouco confuso, já que a preempção já começou a usar uma marca separada e mais precisa em v2.6.25-rc1, cometer 8f4d37ec073c, "sched: escala de preempção de alta resolução" . Encontrado através deste comentário no mesmo artigo do LWN.net: link ).

    
por 02.09.2018 / 13:12