desvio excessivo do relógio do sistema? (Mais de 2 minutos por hora)

2

Estou executando uma instalação razoavelmente nova de 17.10 em um novo sistema (totalmente corrigido e não virtualizado) e observei que o tempo de inicialização listado na entrada /proc/stat 'co_de%' continuava mudando. Isso quebrou alguns scripts que usaram essas informações para calcular a hora do relógio na parede em que certos processos foram iniciados.

Com alguma depuração, descobri que btime é calculado como btime e a now() - uptime derivada deveu-se ao fato de que o relógio do sistema estava incrementando em uma taxa diferente da que o relógio de tempo de atividade estava!

Eu assumi que isso se devia a algum tipo de relógio aplicado ao relógio do sistema por btime (ou seja, a systemd-timesyncd.service de substituição), então desabilitei ntpd e reiniciei, como um teste. Com certeza, agora o contador de tempo de atividade e o clock do sistema pisam na mesma taxa. (Eu também instalei timesyncd para verificar os parâmetros do kernel para verificar se nenhum relógio girou permanece: não há% de adjtimex aplicado e o valor frequency é 10000, como deveria ser.)

Sem tick , no entanto, está claro que o relógio do sistema está muito fora de sintonia. O relógio perdeu cerca de 5 minutos ao longo de 135 minutos (~ -37000 ppm), o que é similar ao que eu usei com timesyncd ao longo de cerca de 20 minutos para estimar manualmente o desvio do clock do sistema ppm). (E, na verdade, apenas para verificar, usando um cronômetro, descobri que adjtimex -l -w também está incrementando na taxa errada; ~ -41000 ppm. Então, isso é consistente.)

O relógio CMOS também está um pouco desligado (ele ganhou 30 segundos nos 135 minutos), mas, no meu entender, isso não deve afetar o relógio do sistema, exceto no momento da inicialização. Não há arquivo /proc/uptime que eu possa encontrar pelo qual a taxa de clock do sistema seria alterada na inicialização - e de qualquer forma, como acima, /etc/adjtime informa que não houve falsificação de clock-tick. Então não consigo imaginar como o relógio CMOS pode estar causando o problema que vejo no relógio do sistema.

No entanto, vou mudar a bateria do CMOS, pois alguns relatórios sugeriram que isso pode corrigir milagrosamente os problemas do relógio do sistema. (Apesar de não haver nenhum mecanismo óbvio pelo qual isso possa acontecer.)

Mas existe alguma outra explicação para o fato de o relógio do sistema estar tão errado? E há alguma solução para o fato de que os temporizadores do sistema estão desativados por uma quantidade tão grande? Claramente, apenas executar adjtimex não resolve o problema, porque o excesso de relógio que ele produz é problemático (como acima).

Eu poderia usar timesyncd para alterar os parâmetros do kernel diretamente (o que deve manter os contadores de tempo de atividade e de sistema sincronizados pelo menos), mas isso realmente significa endereçar erros de relógio no intervalo de + - 500 ppm. O que estou vendo é 3 ordens de grandeza maior, e me pergunto se isso indica algum problema mais significativo.

Para o registro, uma instalação 17.10 que eu tenho em uma máquina muito semelhante não tem esse problema.

Atualização: mudar a bateria do CMOS não fez nada (como suspeito). Veja abaixo a resolução final do problema.

    
por zachrahan 12.03.2018 / 20:25

1 resposta

2

Acontece que o problema era com a fonte do relógio TSC. No curto prazo, alterar a origem do relógio para 'hpet' (temporariamente via echo hpet > /sys/devices/system/clocksource/clocksource0/current_clocksource , ou mais permanentemente adicionando clocksource=hpet aos parâmetros de inicialização do kernel em /etc/default/grub ) funciona em torno do problema.

Mais amplamente, este problema é devido a um erro no manuseio do TSC do kernel do Linux em relação às CPUs de desktop do Skylake X. Isso deve ser corrigido em um próximo lançamento do kernel .

Atualização: a reconstrução do kernel atual com a correção de uma linha do patch acima de fato restaura o comportamento correto do TSC.

    
por zachrahan 14.03.2018 / 15:34