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.