Como programar um programa Linux

Conteúdo

Bash Shell

Quer analisar quanto tempo o relógio de parede, tempo do kernel, etc., um programa Linux leva tempo 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.

Programação de programas Linux

Cronometrar um programa Linux ajuda a entender quanto tempo foi gasto. O versátil Linux time O comando pode ser usado para isso. a time O comando mede em tempo real (Em outras palavras, o tempo do relógio de parede), usuário e sistema. A hora do usuário é a hora em que o programa é executado no modo de usuário, ou dito de outra forma, fora do kernel. A hora do sistema é a hora em que o programa é executado dentro do kernel.

É essencial observar 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 no kernel., respectivamente. Em outras palavras, quando um programa está bloqueado por um tempo e não está usando a CPU, aquele tempo não contará para Nome do usuário o sys vezes. Sabendo disso, podemos medir com precisão quanto tempo efetivo de CPU foi usado (combinando-os).

El Linux clima Ferramenta

Dado que Nome do usuário e sys tempos reportam apenas o tempo de CPU, enquanto que verdade tempo relata o tempo real do relógio de parede, isto é (por isso) muito comum ver o time saída de retorno da ferramenta, onde uma combinação de Nome do usuário + sys não é igual verdade clima. Um exemplo pode ser visto ao cronometrar sleep:

hora de dormir 1

Um comando de tempo simples que testa o tempo que leva para um comando de suspensão 1 no prompt de comando do Linux

Aqui nós cronometramos o sleep comando usando o time ferramenta. Como podemos ver, nosso verdade clima (1.001 segundos) corresponde à hora do nosso relógio de parede e à hora solicitada (sleep 1 peça um sonho de um segundo) muito bem. Também vemos que muito pouco tempo de CPU teve que ser dedicado ao comando como um todo: combinar Nome do usuário + sys clima, nós vemos que eles só gastaram 0.001 segundos.

Nós também podemos, provavelmente incorretamente, deduzir que o kernel não estava envolvido neste comando, desde o sys o tempo é de fato 0. Apesar disto, como ele time indica o manual: “Cuando el tiempo de ejecución de un comando es muy cercano a cero, alguns valores (como um exemplo, a porcentagem de CPU usada) pode ser reportado como zero (o que está errado) o como un signo de interrogación”.

Usando clima Para medir o desempenho

Podemos usar time para examinar cuánto tiempo tomarán las acciones dadas (Em outras palavras, tiempo de reloj de pared) y cuánto tiempo de CPU consumieron mientras lo hacían. Como ejemplo simple, podríamos examinar si algún caché del sistema de archivos está funcionando en nuestro sistema. Para faze-lo, podríamos saltar al /usr diretório, que fácilmente podría contener 200k a 500k archivos en una instalación común de Linux.

Uma vez ali, podemos usar o find ferramenta, cronometrada por time para examinar cuánto tiempo tomaría escanear todas las carpetas y listar todos los archivos en el /usr diretório:

cd /usr
time find . >/dev / null 2>&1

Listar el contenido de / usr con buscar y cronometrar lo mismo

Como podemos ver, se necesitan 12.484 segundos para listar todos los archivos en el /usr diretório (y debajo de él). Redirigimos la salida stdout (saída padrão) del comando a >/dev/null y además redirigir cualquier error stderr (erro padrão) uma /dev/null a través de el uso de una redirección de stderr a stdout, Em outras palavras 2>&1.

Además vemos que nuestro tiempo de CPU es 1.043 segundos (Nome do usuário) + 2.908 segundos (sys) para um total de 3.951 segundos de tiempo de CPU.

Probémoslo en otra ocasión borrando nuestra (s) cache (s) de inodo (e outros):

sync; eco 3 | sudo tee /proc/sys/vm/drop_caches
cd /usr
time find . >/dev / null 2>&1

Exclua o inode (e outros) O Linux armazena em cache e execute novamente nosso comando de pesquisa em / usr

O primeiro comando irá limpar o cache de inode, dentries (entradas do 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 o quão bem o cache do Linux funciona em geral, vamos reexecutar o comando, mas desta vez sem remover caches Linux:

Reexecutar o comando de pesquisa sem limpar os caches resulta em uma execução muito mais rápida

Que diferenca! Vemos uma grande diminuição no tempo necessário em todas as três áreas cronometradas e nosso comando é executado em menos de meio segundo!!

Usando clima Para otimização de código

Assim que nos sentirmos confortáveis ​​com o time comando na linha de comando, podemos expandir seu uso para tirar o máximo proveito de nossos scripts e código bash. Como um exemplo, uma abordagem comumente usada entre alguns profissionais é executar um determinado comando geralmente, O que 1000 execuções, e calcular o tempo total (ou média) dessas execuções.

Então, comando alternativo pode ser usado. Esse comando alternativo (ou solução / implementação, Em outras palavras, vários comandos juntos como um único pedaço de código a ser cronometrado) pode ser cronometrado novamente. En Linux (ou mais especificamente na codificação Bash, etc.), muitas vezes existem muitas alternativas para lidar com um determinado obstáculo; Em geral, existem várias ferramentas disponíveis para obter / alcançar o mesmo resultado.

Testar qual funciona melhor otimiza o tempo de execução do programa e potencialmente outros fatores, como E / S do disco (reduzindo o desgaste do disco) ou uso de memória (permitindo que mais programas sejam executados na mesma instância). Para aproveitar ao máximo o tempo do relógio de parede, uma certa ferramenta usa, em média, bem como o tempo de CPU consumido pela ferramenta (outro fator / consideración importante de optimización) se puede medir a través de el time ferramenta.

Exploremos un ejemplo práctico del uso de la línea de comandos para ejecutar un comando que queremos utilizar en uno de nuestros scripts. El comando obtendrá una lista de procesos y mostrará la segunda columna. Usamos ambos awk e sed para faze-lo, y ejecute cada comando 1000 veces para ver la diferencia en el rendimiento general.

time for ((i = 1;eu<=1000;i ++)); do ps -ef | awk '{imprimir $2}' >/dev / null 2>&1; done
time for ((i = 1;eu<=1000;i ++)); do ps -ef | mas é|^[^ ]+[ t]+||;s|[ t].*||' >/dev / null 2>&1; feito

Use o tempo para analisar o tempo médio de execução de qualquer comando, que permite otimizar os tempos de execução de scripts Linux

Mesmo quando parece mais complexo (use 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 relógio de parede.

Usando uma configuração muito semelhante (Em outras palavras time for ((i=1;i<=1000;i++)); do 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; nós usamos tanto o ps e awk/sed comandos).

Siga estas etapas para vários comandos demorados (em qualquer script linux) nos ajudará a reduzir o tempo de execução geral e / o (se você otimizar para reduzir o tempo de CPU) a carga do sistema de nossos scripts.

Se você quiser aprender mais sobre expressões regulares, Você pode estar interessado em Como modificar texto usando expressões regulares com sed Stream Editor.

Final

Neste post, nós exploramos Linux time comando. Nós esclarecemos que verdade, Nome do usuário e sys tempos indicam e como os dois últimos se relacionam com o uso da CPU. Também revisamos vários exemplos de como usar clima de uma forma prática.

Se você gostou de ler este post, dê uma olhada em Declarações, erros e travamentos: Qual é a diferença? e o que é Stack Smashing? Pode ser consertado ?.

Assine a nossa newsletter

Nós não enviaremos SPAM para você. Nós odiamos isso tanto quanto você.