Estou executando alguns benchmarks. Meu corredor de referência monitora o buffer dmesg entre experimentos, procurando qualquer coisa que possa impactar o desempenho. Hoje ele vomitou:
[2015-08-17 10:20:14 WARNING] dmesg parece ter mudado! Diff segue: --- 2015-08-17 09:55:00 +++ 2015-08-17 10:20:14 @@ -825,3 +825,4 @@ [3.802206] [drm] Ativando estados RC6: RC6 ativado, RC6p desativado, RC6pp desativado [7.900533] r8169 0000: 06: 00.0 eth0: vincular [7.900541] IPv6: ADDRCONF (NETDEV_CHANGE): eth0: o link fica pronto + [236832.221937] a interrupção perf levou muito tempo (2504> 2500), reduzindo o kernel.perf_event_max_sample_rate para 50000
Após algumas pesquisas, agora sei que isso se refere a um subsistema de criação de perfil no kernel do linux chamado "perf". Eu não acho que precisamos disso, então eu gostaria de desativá-lo completamente.
Pesquisando novamente, acho que o sysctl perf_cpu_time_max_percent
pode ajudar. Aqui, alguém sugere desativar, definindo-o como 0. Lendo mais sobre isso aqui :
perf_cpu_time_max_percent:
Dicas para o kernel quanto tempo de CPU deve ser permitido para lidar com eventos de amostragem perf. Se o subsistema perf for informado de que suas amostras estão excedendo esse limite, ele diminuirá sua frequência de amostragem para tentar reduzir o uso da CPU.
Algumas amostras de perf ocorrem em MNI. Se essas amostras demorarem muito para serem executadas inesperadamente, as NMIs poderão ficar empilhadas uma ao lado da outra, de maneira que nada mais possa ser executado.
0: desabilite o mecanismo. Não monitore ou corrija a taxa de amostragem do perf, independentemente do tempo de CPU necessário.
1-100: tente acelerar a taxa de amostragem do perf para essa porcentagem de CPU. Nota: o kernel calcula um comprimento "esperado" de cada evento de amostra. 100 aqui significa 100% do comprimento esperado. Mesmo se estiver definido como 100, você ainda poderá ver a otimização da amostra se esse comprimento for excedido. Defina como 0 se você realmente não se importa com a quantidade de CPU consumida.
Parece-me que 0 significa que a taxa de amostragem de criação de perfil não é mais verificada, mas o subsistema freq permanece em execução (?).
Alguém pode esclarecer como desativar completamente a criação de perfil do kernel com freq?
Edição: Alguém sugeriu que eu tente construir um kernel sem perf, mas acho que isso nem é possível. A opção não parece selecionável:
EDIT2: Depois de mais leitura, eu decidi que poderia ser definido kernel.perf_event_max_sample_rate
como zero. Ou seja, sem amostras por segundo. No entanto, você também não pode fazer isso ( fonte ):
confirmar 02f98e3e36da106338b7c732fed516420fb20e2a Autor: Knut Petersen Data: Wed Sep 25 14:29:37 2013 +0200 perf: aplique 1 como limite inferior para perf_event_max_sample_rate
EDIT 3: FWIW, perf_cpu_time_max_percent
está definido como 25, o que significa que o kernel estava gastando mais de 25% do tempo de amostragem de registros de hardware. Isso é inaceitável para uma máquina de benchmarking.
Agora estou certo de que definir perf_cpu_time_max_percent
como zero apenas pioraria a situação, pois o kernel continuaria a usar mais de 25% do seu tempo lendo registros de hardware. O erro é disparado para ajustar a taxa de amostragem, tentando garantir que o kernel atenda à sua cota de usar <25% do seu tempo no perf. 25% ainda é muito alto IMHO.
Se eu realmente não puder desativar o perf, provavelmente o melhor compromisso seria definir perf_event_max_sample_rate
como 1.
EDIT4: Um amigo sugeriu que eu possa ter interpretado mal o significado de perf_cpu_time_max_percent
, portanto, as declarações acima podem estar incorretas. Um valor de 25 indica que o kernel usou mais de 25% de algum comprimento arbitrário que havia reservado para atender a interrupções de perf.
EDIT5:
Conforme apontado nos comentários, a -*-
opção contra o perf sugere que o recurso é forçado por outro recurso ativado. Se eu olhar help
, ele diz quais recursos são:
Eu não acho que posso ganhar aqui. A fórmula booleana selected by
diz
Se você está segmentando X86 ou ...
Acabei de verificar que a segmentação X86_64 realmente permite CONFIG_X86
. Parece que assim que você segmenta o X86 ou o X86_64, você obtém o desempenho.
Então, gostaria de mudar minha pergunta para:
Quais configurações de perf posso usar para minimizar o tempo gasto pelo kernel nas rotinas de perf?
Lembre-se de que o objetivo geral é controlar fontes de variação aleatória para o benchmarking. Se não consigo desativar o perf, como posso minimizar o impacto nos benchmarks?
CONFIG_HAVE_PERF_EVENTS=y
e CONFIG_PERF_EVENTS=y
. Eu não acho que esse desempenho desabilitado.
-*-
significa que algum subsistema depende do módulo perf. Help
mostra a árvore de dependências que você precisa desativar para alterar a opção para [*]
ou [M]
.