Cómo programar un programa de Linux – CloudSavvy IT

Bash Shell

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

Programación de programas de Linux

El cronometraje de un programa de Linux ayuda a comprender cuánto tiempo se invirtió. 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, o en otras palabras, 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 la CPU invertido dentro del modo de usuario y dentro del kernel, respectivamente. En otras palabras, cuando un programa está bloqueado 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 efectivo de CPU se utilizó (combinándolos).

El Linux hora Herramienta

Dado que usuario y sys tiempos informan solo el tiempo de CPU, mientras que verdadero tiempo informa 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 + sys no es igual verdadero hora. Se puede ver un ejemplo al cronometrar sleep:

time sleep 1

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

Aquí cronometramos el sleep comando usando el time herramienta. Como podemos ver, nuestro verdadero tiempo (1.001 segundos) coincide con la hora del reloj de pared y la hora solicitada (sleep 1 pide un sueño de un segundo) muy bien. También vemos que se tuvo que dedicar muy poco tiempo de CPU al comando en su conjunto: combinar usuario + sys tiempo, vemos que solo se gastaron 0.001 segundos.

También podemos, probablemente incorrectamente, deducir que el kernel no estaba involucrado en este comando, ya que el sys el tiempo es efectivamente 0. Sin embargo, como el time indica el manual: «Cuando el tiempo de ejecución de un comando es muy cercano a cero, algunos valores (por ejemplo, el porcentaje de CPU utilizada) se pueden informar como cero (lo cual es incorrecto) o como un signo de interrogación».

Utilizando hora Para medir el rendimiento

Nosotros podemos usar time para evaluar cuánto tiempo tomarán las acciones dadas (es decir, tiempo de reloj de pared) y cuánto tiempo de CPU consumieron mientras lo hacían. Como ejemplo simple, podríamos evaluar si algún caché del sistema de archivos está funcionando en nuestro sistema. Para hacerlo, podríamos saltar al /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 herramienta, cronometrada por time para evaluar cuánto tiempo tomaría escanear todas las carpetas y listar todos los archivos en el /usr directorio:

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 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 mediante el uso de 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.

Probémoslo en otra ocasión borrando nuestra (s) caché (s) de inodo (y otras):

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

Borrar el inodo (y otros) cachés de Linux y volver a ejecutar nuestro comando de búsqueda en / usr

El primer comando eliminará el caché de inodos, dentries (entradas de directorio) y pagecache. Esta vez, el resultado volvió un poco más rápido, con 1,255 segundos guardados en el comando. Probablemente una caché basada en disco físico ayudó aquí.

Para demostrar qué tan bien funciona el almacenamiento en caché de Linux en general, volvamos a ejecutar el comando, pero esta vez sin eliminar los 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

¡Qué 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 en 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 estas ejecuciones.

Entonces, se puede usar un comando alternativo. Ese 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, existen múltiples herramientas disponibles para obtener / lograr el mismo resultado.

Probar cuál funciona mejor optimiza el tiempo de ejecución del programa y potencialmente otros factores como la E / S del disco (reduciendo el desgaste del disco) o la utilización de la memoria (permitiendo que más programas se ejecuten en la misma instancia). Para optimizar el tiempo del reloj de pared, una determinada herramienta utiliza, en promedio, así como el tiempo de CPU consumido por la herramienta (otro factor / consideración importante de optimización) 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 y sed para hacerlo, 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 permite optimizar los tiempos de ejecución de los scripts de Linux

Aunque parece más complejo (usa 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 del reloj de pared.

Usando una configuración muy similar (es decir 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 que se probará para el reloj de pared o el tiempo de la CPU), uno puede probar el tiempo de cualquier comando o conjunto de comandos (como es el caso aquí; usamos tanto el ps y awk/sed comandos).

Seguir 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 le interese Cómo modificar texto usando expresiones regulares con sed Stream Editor.

Terminando

En este artículo, exploramos Linux time mando. Aclaramos que verdadero, usuario y sys los tiempos indican y cómo los dos últimos se relacionan con el uso de la CPU. También revisamos varios ejemplos de cómo usar hora de forma práctica.

Si le gustó leer este artículo, eche un vistazo a Declaraciones, errores y bloqueos: ¿Cuál es la diferencia? y ¿Qué es Stack Smashing? ¿Se puede arreglar ?.

Deja un comentario

En esta web usamos cookies para personalizar tu experiencia de usuario.    Política de cookies
Privacidad