Cómo programar un programa de Linux

Contenidos

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 usar para esto. los time El comando mide el tiempo real (dicho de otra forma, 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 dicho de otra forma, fuera del kernel. El tiempo del sistema es el tiempo que el programa se ejecuta dentro del kernel.

Es esencial prestar atención 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. Dicho de otra forma, 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 tiempo 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 eso) muy común ver el time salida de retorno de herramienta donde una combinación de usuario + sys no es igual verdadero tiempo. 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 de nuestro reloj de pared y la hora solicitada (sleep 1 pide un sueño de un segundo) muy bien. Además 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.

Además podemos, probablemente incorrectamente, deducir que el kernel no estaba involucrado en este comando, puesto que el sys el tiempo es efectivamente 0. A pesar de esto, como el time indica el manual: «Cuando el tiempo de ejecución de un comando es muy cercano a cero, algunos valores (a modo de ejemplo, el porcentaje de CPU utilizada) se pueden informar como cero (lo cual es incorrecto) o como un signo de interrogación».

Usando tiempo Para medir el rendimiento

Nosotros podemos utilizar time para examinar cuánto tiempo tomarán las acciones dadas (dicho de otra forma, 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 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 utilizar el find herramienta, cronometrada por time para examinar 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 además redirigir cualquier error stderr (error estándar) a /dev/null a través de el uso de una redirección de stderr a stdout, dicho de otra forma 2>&1.

Además 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 quitar 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 disminución en el tiempo requerido en las tres áreas cronometradas y nuestro comando se ejecuta en menos de medio segundo!

Usando tiempo 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 aprovechar al máximo nuestros scripts y código Bash. A modo de ejemplo, un enfoque comúnmente utilizado entre algunos profesionales es ejecutar un comando determinado usualmente, como 1000 ejecuciones, y calcular el tiempo total (o promedio) de estas ejecuciones.

Entonces, se puede utilizar un comando alternativo. Ese comando alternativo (o solución / implementación, dicho de otra forma, 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 alternativas para abordar un obstáculo 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 aprovechar al máximo 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 a través de el time herramienta.

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 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

Aún cuando parece más complejo (utiliza 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 semejante (dicho de otra forma 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 post, 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. Además revisamos varios ejemplos de cómo utilizar tiempo de forma práctica.

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

Suscribite a nuestro Newsletter

No te enviaremos correo SPAM. Lo odiamos tanto como tú.