Cómo cronometrar un programa de Linux

¿Quiere analizar cuánto tiempo de reloj de pared, tiempo del kernel, etc., tarda en ejecutarse un programa de Linux? Ya sea que se trate de pruebas de rendimiento, optimización de código o simplemente trivia general, ¡esta guía rápida lo ayudará a comenzar!

Índice de contenidos()

    Programación de programas de Linux

    La sincronización de un programa de Linux ayuda a comprender cuánto tiempo se ha invertido. El Linux versátil time El comando se puede utilizar para esto. La time El comando mide el tiempo real (es decir, el tiempo del reloj de pared), del usuario y del sistema. El tiempo de usuario es el tiempo que el programa se ejecuta en modo de usuario, es decir, fuera del kernel. El tiempo del sistema es el tiempo que el programa se ejecuta dentro del kernel.

    Es importante tener en cuenta que tanto el tiempo del usuario como el tiempo del sistema son el tiempo real de CPU invertido en el modo de usuario y dentro del kernel, respectivamente. En otras palabras, cuando un programa está congelado por un tiempo y no está usando la CPU, ese tiempo no contará para usuario o sys veces. Sabiendo esto, podemos medir con precisión cuánto tiempo real de CPU se utilizó (combinándolos).

    Linux hora Herramienta

    Desde usuario es sys times informa solo el tiempo de la CPU, mientras que cierto el tiempo muestra el tiempo real del reloj de pared, es (por lo tanto) muy común ver el time salida de retorno de herramienta donde una combinación de usuario + sistema no es lo mismo cierto hora. Se puede ver un ejemplo al cronometrar sleep:

    time sleep 1

    Un comando de tiempo simple que verifica el tiempo que tarda un comando de suspensión 1 en el símbolo del sistema de Linux

    Aquí hemos cronometrado el sleep comando usando el time herramienta. Como podemos ver, el nuestro cierto tiempo (1.001 segundos) corresponde a la hora de nuestro reloj de pared y la hora solicitada (sleep 1 duerme un segundo) muy bien. También vemos que se tuvo que gastar muy poco tiempo de CPU en el comando como un todo: combinación usuario + sistema tiempo, vemos que solo se gastaron 0.001 segundos.

    También podemos, probablemente incorrectamente, inferir que el kernel no estaba involucrado en este comando, ya que el sistema el tiempo es 0. Sin embargo, dado que time estados manuales: "Cuando el tiempo de ejecución de un comando es muy cercano a cero, algunos valores (por ejemplo, el porcentaje de CPU usado) pueden ser reportados como cero (lo cual es incorrecto) o como un signo de interrogación".

    Utilizando hora Para medir el desempeño

    Nosotros podemos usar time para medir cuánto tiempo tomarán ciertas acciones (por ejemplo, el tiempo del reloj de pared) y cuánto tiempo de CPU consumieron mientras lo hacían. Como ejemplo simple, podríamos evaluar si un caché del sistema de archivos está operativo en nuestro sistema. Para hacer esto, podríamos saltar a la /usr directorio, que fácilmente podría contener 200k a 500k archivos en una instalación común de Linux.

    Una vez allí, podemos usar el find instrumento, cronometrado por time para evaluar cuánto tiempo tomaría escanear todas las carpetas y listar todos los archivos en el /usr lista:

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

    Enumere el contenido de / usr con la misma búsqueda y sincronización

    Como podemos ver, se necesitan 12,484 segundos para listar todos los archivos en el /usr directorio (y debajo de él). Redirigimos la salida stdout (salida estándar) del comando a >/dev/null y también redirigir cualquier error stderr (error estándar) a /dev/null usando una redirección de stderr a stdout, es decir 2>&1.

    También vemos que nuestro tiempo de CPU es 1.043 segundos (usuario) + 2.908 segundos (sys) para un total de 3.951 segundos de tiempo de CPU.

    Intentémoslo una vez más borrando nuestro caché de inodos (y otros):

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

    Borre el caché de inodos de Linux (y otros) y vuelva a emitir nuestro comando find in / usr

    El primer comando borrará el caché de inodos, dentries (entradas de directorio) y pagecaches. Esta vez, el resultado fue un poco más rápido, con 1.255 segundos guardados en el comando. Un caché basado en disco físico probablemente ayudó aquí.

    Para demostrar cómo funciona la caché de Linux en general, ejecutemos el comando nuevamente, pero esta vez sin borrar las cachés de Linux:

    Volver a ejecutar el comando de búsqueda sin borrar los cachés da como resultado una ejecución mucho más rápida

    ¡Una gran diferencia! Vemos una gran reducción en el tiempo requerido en las tres áreas cronometradas y nuestro comando se ejecuta en menos de medio segundo.

    Utilizando hora Para la optimización del código

    Una vez que nos sintamos cómodos usando el time comando desde la línea de comando, podemos expandir su uso para optimizar nuestros scripts y código Bash. Por ejemplo, un enfoque comúnmente utilizado entre algunos profesionales es ejecutar un comando determinado muchas veces, como 1000 ejecuciones, y calcular el tiempo total (o promedio) de esas ejecuciones.

    Luego, puede usar un comando alternativo. Este comando alternativo (o solución / implementación, es decir, múltiples comandos tomados juntos como una sola pieza de código para ser cronometrados) se puede cronometrar nuevamente. En Linux (o más específicamente en la codificación Bash, etc.), a menudo hay muchas formas de abordar un problema dado; Por lo general, hay varias herramientas disponibles para lograr el mismo resultado.

    Las pruebas que funcionan mejor optimizan el tiempo de ejecución del programa y potencialmente otros factores como la E / S del disco (reduciendo el desgaste del disco) o el uso de la memoria (permitiendo que varios programas se ejecuten en la misma instancia). Para optimizar el tiempo del reloj de pared, un instrumento determinado utiliza, en promedio, así como el tiempo de CPU consumido por el instrumento (otro factor / consideración de optimización importante) se puede medir mediante el time herramienta.

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

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

    Usar el tiempo para analizar el tiempo de ejecución promedio de cualquier comando, lo que le permite optimizar el tiempo de ejecución de los scripts de Linux.

    Si bien suena más complejo (use una expresión regular doble para analizar la segunda columna), nuestro segundo comando es un poco más rápido que nuestro primer comando cuando se trata de la hora en el reloj de pared.

    Usando una configuración muy similar (p. Ej. time for ((i=1;i<=1000;i++)); do command_to_be_timed >/dev/null 2>&1; done donde command_to_be_timed es el comando para probar el reloj de pared o el tiempo de la CPU), puede probar el tiempo de cualquier comando o conjunto de comandos (como en este caso; usamos tanto el ps es awk/sed comandos).

    Ejecutar estos pasos para varios comandos que consumen mucho tiempo (en cualquier script de Linux) nos ayudará a reducir el tiempo de ejecución general y / o (si optimiza para reducir el tiempo de CPU) la carga del sistema de nuestros scripts.

    Si desea obtener más información sobre las expresiones regulares, es probable que esté interesado en cómo editar texto usando expresiones regulares con sed Stream Editor.

    Terminando

    En este artículo hemos explorado Linux time mando. Dejamos claro lo que cierto, usuario es sistema los tiempos indican y cómo los dos últimos se relacionan con la utilización de la CPU. También vimos varios ejemplos de cómo usar hora de forma práctica.

    Si disfrutó leyendo este artículo, consulte Afirmaciones, errores y fallas: ¿cuál es la diferencia? y ¿qué es Stack Smashing? ¿Se puede solucionar ?.

    Deja una respuesta

    Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

    Subir