Por que o `strace` não mostra que esse processo está esperando por algo?

11

O poderoso straceme decepcionou. Como isso é possível?


time foomostra que fooleva 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 foomostra 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

sourcejedi
fonte
Hmm ... como o seu programa "foo" não é apenas um processo simples, com um único processo, você se sentiria melhor servindo ao strace para seguir e anexar aos garfos. '-ff' é seu amigo! :) Você também desejará, então, usar "-o / dev / shm / strace-foo" para bloquear todos os arquivos de saída do processo strafe em um único local. Apenas uma sugestão.
Jesse Adelman
@JesseAdelman Acho que journalctlexecuta apenas um processo. Eu tenho a sensação de que journalctlusa 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. timeanalisa o processo como um todo e mostrou que o processo como um todo é bastante sonolento (bloqueando alguma coisa). stracenã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 o timeresultado.
sourcejedi

Respostas:

18

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 alguns mmap()no rastreamento de chamadas do sistema.

Se você tivesse usado o /usr/bin/timeprograma em vez do timeshell embutido, também deve ter notado:

0.04user 0.10system 0:02.29elapsed 6%CPU (0avgtext+0avgdata 40464maxresident)k
73632inputs+0outputs (376major+1081minor)pagefaults 0swaps

majorAs falhas de página são as que requerem E / S do sistema de arquivos. minoras falhas de página são muito menos significativas (provavelmente apenas uma "falta de TLB").

Eu suspeito que inputsseja 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 verificar getconf 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.

stracemostra 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 que stracenão são exibidas. Então, isso inclui

  • Falhas na página.
  • O temporizador interrompe. Isso é usado para alternar para um processo diferente, quando o atual esgotar seu intervalo de tempo alocado na CPU.
sourcejedi
fonte
1
Boa resposta, parabéns! É realmente importante entender as limitações das ferramentas que estamos usando. +1; Também gosto deste assunto: unix.stackexchange.com/questions/418354/… e unix.stackexchange.com/questions/419697/…
Rui F Ribeiro