Como cronometrar um programa Linux

Quer analisar quanto tempo de clock de parede, tempo de kernel, etc., um programa Linux leva para ser executado? Seja para testes de desempenho, otimização de código ou apenas curiosidade geral, este guia rápido irá ajudá-lo a começar!
Cronometrando programas Linux
A cronometragem de um programa Linux ajuda a entender quanto tempo foi gasto. O versátil comando de tempo do Linux pode ser usado para isso. O comando de tempo mede o tempo real (ou seja, o tempo do relógio de parede), do usuário e do sistema. A hora do usuário é a hora em que o programa é executado no modo de usuário, ou em outras palavras, fora do kernel. O sys time é o tempo em que o programa é executado dentro do kernel.
É importante notar que o tempo do usuário e o tempo do sistema são o tempo real da CPU gasto no modo de usuário e dentro do kernel, respectivamente. Em outras palavras, quando um programa fica bloqueado por um tempo e não está usando a CPU, esse tempo não contará para o tempo do usuário ou do sistema. Sabendo disso, podemos medir com precisão quanto tempo efetivo de CPU foi usado (combinando-os).
A ferramenta de tempo do Linux
Dado que os tempos do usuário e do sistema relatam apenas o tempo de CPU, enquanto o tempo real relata o tempo real do relógio, é (portanto) muito comum ver a saída de retorno da ferramenta de tempo em que uma combinação de usuário + sistema não é igual ao tempo real. Um exemplo pode ser visto ao cronometrar o sono:
tempo dormir 1

Aqui, cronometramos o comando sleep usando a ferramenta de tempo. Como podemos ver, nosso tempo real (1.001 segundos) corresponde ao nosso relógio de parede, e o tempo solicitado (dormir 1 requer um sono de um segundo) muito bem. Também vemos que muito pouco tempo de CPU teve que ser gasto no comando como um todo: combinando o tempo de usuário + sistema, vemos que apenas 0,001 segundos foram gastos.
Publicidade
Também podemos, provavelmente incorretamente, deduzir que o kernel não estava envolvido neste comando, pois o tempo sys é efetivamente 0. No entanto, como o manual de tempo afirma: “ Quando o tempo de execução de um comando é quase zero, alguns valores (por exemplo, a porcentagem de CPU usada) podem ser relatados como zero (o que está errado) ou um ponto de interrogação. ”
Usando o tempo para medição de desempenho
Podemos usar o tempo para avaliar quanto tempo determinadas ações levarão (ou seja, tempo de espera) e quanto tempo de CPU elas consumiram ao fazê-lo. Como um exemplo simples, poderíamos avaliar se algum cache do sistema de arquivos está operando em nosso sistema. Para fazer isso, podemos pular para o diretório / usr, que pode facilmente conter de 200k a 500k arquivos em uma instalação comum do Linux.
Uma vez lá, podemos usar a ferramenta de localização, cronometrada para avaliar quanto tempo levaria para verificar todas as pastas e listar todos os arquivos no diretório / usr:
localização de hora cd / usr. > / dev / null 2 > & 1

Como podemos ver, leva 12,484 segundos para listar todos os arquivos no diretório / usr (e abaixo dele). Redirecionamos a saída stdout (saída padrão) do comando para > / dev / null e também redirecionamos quaisquer erros stderr (erro padrão) para / dev / null usando um redirecionamento de stderr para stdout, ou seja, 2 > & 1.
Também vemos que nosso tempo de CPU é 1,043 segundos (usuário) + 2,908 segundos (sys) para um total de 3,951 segundos de tempo de CPU.
Vamos testar outra vez, limpando nosso (s) cache (s) inode (e outros):
sincronização; echo 3 | sudo tee / proc / sys / vm / drop_caches cd / usr time find. > / dev / null 2 > & 1

Publicidade
O primeiro comando descartará o cache de inodes, dentries (entradas de diretório) e pagecache. Desta vez o resultado voltou um pouco mais rápido, com 1,255 segundos salvos no comando. Provavelmente um cache baseado em disco físico ajudou aqui.
Para demonstrar como o cache do Linux funciona em geral, vamos executar novamente o comando, mas desta vez sem descartar os caches do Linux:

Que diferença! Vemos uma grande redução no tempo necessário em todas as três áreas temporizadas e nosso comando é executado em menos de meio segundo!
Usando o tempo para otimização de código
Quando nos sentirmos confortáveis com o uso do comando time na linha de comando, podemos expandir seu uso para otimizar nossos scripts e código Bash. Por exemplo, uma abordagem comumente usada entre alguns profissionais é executar um determinado comando muitas vezes, como 1000 execuções, e calcular o tempo total (ou médio) dessas execuções.
Então, um comando alternativo pode ser usado. Esse comando alternativo (ou solução / implementação – ou seja, vários comandos considerados juntos como um único pedaço de código a ser cronometrado) pode então ser cronometrado novamente. No Linux (ou mais especificamente na codificação Bash etc.), geralmente há muitas maneiras de abordar um determinado problema; geralmente existem várias ferramentas disponíveis para obter / alcançar o mesmo resultado.
Testar qual executa melhor otimiza o tempo de execução do programa e potencialmente outros fatores como E / S de disco (reduzindo o desgaste do disco) ou utilização de memória (permitindo que mais programas sejam executados na mesma instância). Para otimizar o tempo do relógio de parede, uma determinada ferramenta usa, em média, bem como o tempo de CPU consumido pela ferramenta (outro fator / consideração de otimização importante) pode ser medido pela ferramenta de tempo.
Publicidade
Vamos explorar um exemplo prático do uso da linha de comando para executar um comando que desejamos usar em um de nossos scripts. O comando obterá uma lista de processos e exibirá a segunda coluna. Usamos awk e sed para fazer isso e executamos cada comando 1000 vezes para ver a diferença no desempenho geral.
tempo para ((i = 1; i < = 1000; i ++)); fazer ps -ef | awk '' > / dev / null 2 > & 1; tempo concluído para ((i = 1; i < = 1000; i ++)); fazer ps -ef | sed 's | ^ [^] \ + [\ t] \ + ||; s | [\ t]. * ||' > / dev / null 2 > & 1; feito

Embora pareça mais complexo (ele usa uma expressão regular dupla para analisar a segunda coluna), nosso segundo comando é um pouco mais rápido do que nosso primeiro comando quando se trata de tempo de espera .
Usando uma configuração muito semelhante (ou seja, tempo para ((i = 1; i < = 1000; i ++)); faça command_to_be_timed > / dev / null 2 > & 1; done onde command_to_be_timed é o comando a ser testado para relógio de parede ou tempo de CPU), pode-se testar o tempo de qualquer comando ou conjunto de comandos (como é o caso aqui; usamos os comandos ps e awk / sed).
Seguir essas etapas para vários comandos demorados (em qualquer script do Linux) nos ajudará a reduzir o tempo de execução geral e / ou (se você otimizar para reduzir o tempo de CPU) a carga do sistema de nossos scripts.
Se você quiser saber mais sobre expressões regulares, é provável que seja do seu interesse Como modificar texto usando expressões regulares com o editor de fluxo sed.
Concluindo
Neste artigo, exploramos o comando time do Linux. Esclarecemos o que os tempos reais, do usuário e do sistema indicam e como os dois últimos se relacionam com o uso da CPU. Também revisamos vários exemplos de como usar o tempo de maneira prática.
Publicidade
Se você gostou de ler este artigo, dê uma olhada em Afirmações, erros e falhas: qual é a diferença? e o que é Stack Smashing? Pode ser consertado ?.
Nenhum comentário