Como obter estatísticas sobre o tempo de execução de comandos no Linux – Elias Praciano
Categories
Linux Tutoriais

Como obter estatísticas sobre o tempo de execução de comandos no Linux

Como medir o tempo que um script, um programa ou um conjunto de tarefas leva para ser concluído, com o comando time, no Linux.
Veja também como formatar a saída do comando, para melhorar o seu relatório.

Entre os comandos que todo administrador deveria dominar, o time é, com certeza, um deles.
Útil para obter valores sobre a performance do sistema e para monitorar alguns aspectos da execução de tarefas, o comando time retorna o tempo decorrido desde o início de uma atividade.
Veja como é fácil usá-lo.
tag heuer semi cronograph time cronômetro
Desenvolvedores também podem se beneficiar deste comando, para testar a performance de aplicativos ou scripts.

Como usar o comando time

A sintaxe do comando time é a seguinte:

time <comando> <parâmetros do comando>

É mais fácil entender com um exemplo prático.
Veja como determinar o tempo que o comando ‘ls -l’ leva para retornar a lista de arquivos dentro do seu diretório atual:

time ls -l

Depois de exibir a lista de arquivos, o time mostra a tempo de execução, conforme o exemplo abaixo (2 centésimos de segundo):

real   0m0.002s
user   0m0.000s
sys    0m0.000s

As três linhas se referem aos números referentes ao tempo total (em>real) gasto para rodar o comando ls, o tempo gasto dentro do user mode e o tempo dispendido dentro do kernel mode (sys).
Saiba mais sobre o que são kernel mode e user mode.

Um desenvolvedor preocupado com a performance, pode rodar diversas seu programa ou script, à medida em que faz modificações no código para torná-lo mais eficiente.

time vs /usr/bin/time

Você tem 2 comandos para usar:
time e
/usr/bin/time.
O primeiro, é um comando built-in, ou embutido, no Bash. O segundo, é um aplicativo GNU.
A versão embutida pode fornecer uma precisão de milisegundos, enquanto o programa externo oferece precisão de centésimos de segundos.
A versão Bash tem precisão maior por que usa a função getrusage(), enquanto a versão externa usa a função times().
Por outro lado a versão GNU, oferece mais opções de formatação da saída.

Diferentes shells têm diferentes implementações de comandos internos ou built in commands. Assim, você pode esperar diferentes comportamentos do time executado no zsh, no ksh etc.

Nossos exemplos, a seguir, se baseiam na versão externa (ou GNU), invocada através do comando /usr/bin/time.

Como direcionar a saída do comando para arquivos

Como comportamento padrão, a saída do time é colocada ao final da saída do comando que você executou com ele.
Para redirecionar a saída para um arquivo, veja o seguinte exemplo:

/usr/bin/time -o timelog.log sudo apt update

Para ver o resultado, use o comando cat:

cat timelog.log 
4.72user 0.43system 0:11.99elapsed 42%CPU (0avgtext+0avgdata 47476maxresident)k
14400inputs+557216outputs (8major+55843minor)pagefaults 0swaps

No exemplo acima, as estatísticas referentes ao comando “sudo apt update” são gravadas no arquivo “timelog.log”:
Repare que as opções dadas ao comando time, são feitas antes do comando que você deseja rodar.
Para não apagar os dados anteriores, contidos no arquivo, use a opção ‘append’. Com esta opção, o time acrescenta a nova saída ao arquivo, em vez de sobrepor todo o conteúdo anterior:

/usr/bin/time -a -o timelog.log sudo apt update
cat timelog.log

O resultado, abaixo, se refere a 4 execuções do comando acima:

0.78user 0.06system 0:02.76elapsed 30%CPU (0avgtext+0avgdata 43964maxresident)k
0inputs+155440outputs (0major+37247minor)pagefaults 0swaps
0.79user 0.05system 0:01.14elapsed 74%CPU (0avgtext+0avgdata 44888maxresident)k
0inputs+155408outputs (0major+37269minor)pagefaults 0swaps
0.85user 0.06system 0:01.23elapsed 74%CPU (0avgtext+0avgdata 44252maxresident)k
0inputs+155248outputs (0major+37174minor)pagefaults 0swaps
0.82user 0.06system 0:01.19elapsed 74%CPU (0avgtext+0avgdata 45080maxresident)k
0inputs+155248outputs (0major+37239minor)pagefaults 0swaps

Desta forma, é possível comparar as estatísticas de várias execuções, dentro do mesmo arquivo.

Opções de formatação da saída do comando time

Como você já sabe, ao final da execução o time (Bash built-in) exibe uma saída padrão de dados assim:

real    0m3.789s
user    0m0.912s
sys     0m0.076s

ou assim (GNU):

0.00user 0.00system 0:00.00elapsed ?%CPU (0avgtext+0avgdata 2352maxresident)k
0inputs+0outputs (0major+110minor)pagefaults 0swaps

Neste tópico, vamos ver como melhorar isto.
Você pode usar uma série de opções para alterar a formatação e adequar a apresentação dos dados estatísticos às suas necessidades. Veja uma lista:

  • C — Argumentos usados de nome e linha de comando
  • D — Tamanho médio da área de dados não-compartilhada do processo (em KiB)
  • E — Tempo decorrido no formato de relógio
  • F — Número de page faults (falhas de página)
  • I — Número de entradas no sistema de arquivos feitas pelo processo
  • K — Média geral da memória usada pelo processo em KiB
  • M — Tamanho máximo do resident set do processo durante seu tempo de vida, em KiB.
  • O — Número de saídas geradas pelo processo
  • P — Percentual da CPU que o trabalho (ou job) recebeu
  • R — Número de page faults menores ou recuperáveis
  • S — Total de segundos da CPU usados pelo sistema no kernel mode
  • U — Total de segundos da CPU usados pelo sistema no user mode
  • W — Número de vezes em que o processo foi varrido da memória principal
  • X — Quantidade média de texto compartilhado no processo
  • Z — Tamanho da página do sistema em KiB
  • c — Quantidade de vezes em que processo foi alternado, baseado em contexto
  • e — Tempo real decorrido relacionado ao processo, em segundos
  • k — Número de sinais entregues ao processo
  • p — Tamanho médio do stack não compartilhado do processo em KiB
  • r — Número de mensagens socket recebidas pelo processo
  • s — Número de mensagens socket enviadas pelo processo
  • t — Tamanho médio do resident set do processo em KiB
  • w — Número de vezes em que o processo sofreu alternâncias no modo de execução voluntariamente
  • x — Status de saída do comando.
  • Veja alguns exemplos da formatação da saída do comando, a seguir.

    /usr/bin/time -f "\nResultado do time:\nTempo decorrido = %E, Entradas %I, Saídas %O" apt search weston
    

    Veja como ficou, nas 2 últimas linhas da saída abaixo:

    Sorting... Pronto
    Full Text Search... Pronto
    weston/testing 1.11.0-1 amd64
      reference implementation of a wayland compositor
    
    
    Resultado do time:
    Tempo decorrido = 0:00.77, Entradas 0, Saídas 0
    

    Altere o código, acima, usando outras opções da tabela anterior.
    Para inserir novas linhas e deixar o visual mais fácil de entender, use ‘\n’.

    Referências

    http://linux.about.com/od/commands/a/Example-Uses-Of-The-Command-Time.htm.

By Elias Praciano

Autor de tecnologia (livre, de preferência), apaixonado por programação e astronomia.
Fã de séries, como "Rick and Morty" e "BoJack Horseman".
Me siga no Twitter e vamos trocar ideias!

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.