O poderoso strace
me decepcionou. Como isso é possível?
time foo
mostra que foo
leva alguns segundos para ser executado ("real"), mas usa tempo de CPU insignificante, tanto no espaço do usuário ("usuário") quanto no kernel ("sys"). Para os curiosos, foo
é definido abaixo.
Portanto, ele passa a maior parte do tempo aguardando algo mais, sem executar as instruções da CPU. Normalmente, posso ver como ela está aguardando strace
- ou seja, em qual chamada do sistema está bloqueando por um longo período de tempo. Infelizmente, essa abordagem não funcionou.
strace -ttt -T -C -w foo
mostra as chamadas do sistema, com registro de data e hora e um resumo do tempo (real) gasto nas chamadas do sistema. Mas esse processo em particular mostrou como passar um tempo geral (real) insignificante nas chamadas do sistema.
foo
é realmente journalctl -b -u dev-hugepages.mount
. Só que eu tive que mudar o último argumento para uma unidade systemd diferente a cada vez para reproduzir isso. Em outras palavras, o atraso que estou investigando aconteceu na primeira vez que tento obter os logs para qualquer unidade systemd. EDIT : depois de responder à pergunta principal, também percebi o motivo pelo qual estava tendo esse problema ao reproduzir o atraso .
O tempo gasto por esse processo é um problema específico, aparentemente não ocorre em todos os sistemas. https://github.com/systemd/systemd/issues/7963
fonte
journalctl
executa apenas um processo. Eu tenho a sensação de quejournalctl
usa um thread extra por qualquer motivo - iirc, houve uma chamada de clone (). Eu acho que isso significa que você está tecnicamente correto, mas também é tecnicamente irrelevante para a questão.time
analisa o processo como um todo e mostrou que o processo como um todo é bastante sonolento (bloqueando alguma coisa).strace
não mostrou dorme suficiente. Não importa se um segundo thread está inativo, o thread principal também deve estar com muito sono para explicar otime
resultado.Respostas:
O motivo usual para encontrar esse problema é que o processo está bloqueando falhas de página. Estas são leituras ou, possivelmente, gravações em arquivos executados através de um mapeamento de memória, também conhecido como
mmap()
. Você pode ter notado algunsmmap()
no rastreamento de chamadas do sistema.Se você tivesse usado o
/usr/bin/time
programa em vez dotime
shell embutido, também deve ter notado:major
As falhas de página são as que requerem E / S do sistema de arquivos.minor
as falhas de página são muito menos significativas (provavelmente apenas uma "falta de TLB").Eu suspeito que
inputs
seja o número total de páginas lidas. Atualmente, acho que as páginas mapeadas de arquivos sempre têm o mesmo tamanho. 4096 bytes na maioria dos casos, mas você pode verificargetconf PAGESIZE
.Portanto, isso representa ~ 290 megabytes, lidos a algo acima de 100 megabytes por segundo, uma velocidade padrão para um disco rígido como o meu. Mistério resolvido!
Observe também que você está assumindo que possui uma CPU livre inteira para esse processo. Caso contrário, o processo poderia simplesmente ser bloqueado, aguardando que outros processos produzissem a CPU.
strace
mostra apenas quando o processo entra (e sai) no kernel devido a uma chamada do sistema. Ou quando um sinal unix é entregue. No entanto, existem outros tipos de interrupções questrace
não são exibidas. Então, isso incluifonte