Por que o 'strace' não mostra que este processo está esperando por algo?

11

O poderoso strace me decepcionou. Como isso é possível?

time foo mostra que foo leva vários segundos para ser executado ("real"), mas usa um tempo insignificante de cpu, tanto no espaço do usuário ("usuário") quanto no kernel ("sys"). Para os curiosos, foo é definido abaixo.

Assim, ele passa a maior parte do tempo esperando por algo mais, não executando instruções da CPU. Normalmente, posso ver como ele está aguardando em strace - ou seja, qual chamada de sistema está bloqueando por um longo período de tempo. Infelizmente esta abordagem não funcionou.

strace -ttt -T -C -w foo mostra as chamadas do sistema, o registro de data e hora e um resumo do tempo (real) gasto nas chamadas do sistema. Mas este processo em particular mostrou como gastar um tempo geral (real) insignificante dentro das chamadas do sistema.

foo é, na verdade, 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 tentei obter os registros de qualquer unidade do sistema. EDITAR : depois de responder a pergunta principal, também percebi razão pela qual eu estava tendo este problema reproduzindo o atraso .

O tempo gasto por este processo é um problema específico, aparentemente, não ocorre em todos os sistemas. link

    
por sourcejedi 28.01.2018 / 22:25

1 resposta

17

O motivo comum para acertar esse problema é que o processo está bloqueando as 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ê deve ter notado alguns mmap() no rastreamento de chamadas do sistema.

Se você usou o programa /usr/bin/time em vez do shell time embutido, você também deve ter notado:

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

major pagefaults são os que requerem IO do sistema de arquivos. minor pagefaults são muito menos significativos (provavelmente apenas um "TLB miss").

Suspeito que inputs seja o número total de páginas lidas. Atualmente, acho que as páginas mapeadas por arquivos são sempre do mesmo tamanho. 4096 bytes na maioria dos casos, mas você pode verificar getconf PAGESIZE .

Isso representa ~ 290 megabytes, lidos em algo acima de 100 megabytes por segundo, uma velocidade padrão para um disco rígido como o meu. Mistério resolvido!

Note também que você está assumindo que tem toda uma CPU livre para esse processo. Caso contrário, o processo poderia simplesmente ser bloqueado aguardando outros processos renderem a CPU.

strace mostra apenas quando o processo entra (e depois deixa) o kernel devido a uma chamada do sistema. Ou quando um sinal unix é entregue. No entanto, existem outros tipos de interrupções que strace não mostram de todo. Então, esses incluem

  • falhas de página.
  • A interrupção do temporizador. Isso é usado para alternar para um processo diferente, quando o atual exauriu sua fatia de tempo alocada na CPU.
por 28.01.2018 / 22:25