SGCG

…esto no es un subtítulo…

Ir a: contenido categorías calendario archivo suscripción

Volver arriba

Jugando con la carga del sistema (2)

2020-07-17

Vimos que la carga de un sistema *nix es, de forma resumida, la cantidad promedio de procesos en ejecución en un intervalo de tiempo. Se da normalmente a un minuto, cinco minutos y quince minutos. Tras una primera herramienta, por diversión, vamos a diseñar la segunda pequeña herramienta que permite alcanzar una carga del sistema elegida a base de consumir tiempo de procesador de forma controlada.

Diseño básico

Si queremos alcanzar un cierta carga C, necesitamos al menos C procesos trabajando simultáneamente. En general, C no es un número entero, así que el número de procesos ha de ser, como poco, C redondeado a entero hacia arriba; llamaremos P a este número.

Nuestra herramienta va a tener un control de tipo PI (proporcional e integral): los procesos se mantienen ocupados una fracción de tiempo con dos contribuciones, una proporcional a la desviación de la carga objetivo y la carga real y otra proporcional a la integral en el tiempo de esa desviación. La contribución integral le da una memoria al bucle de control con el fin de que acabe convergiendo a la carga deseada.

Detalles

Escribiremos la herramienta en el lenguaje de programación C. Esta herramienta podrá funcionar en sistemas *nix modernos que cuentan con la función getloadavg (que sirve para obtener la carga del sistema), además de las funciones estándar de entrada y salida, creación de procesos y demás.

El programa es muy sencillo. Toma un único argumento, la carga deseada, que interpreta con una llamada a atof. Después, crea múltiples subprocesos con llamadas a fork de manera que, entre estos subprocesos y el proceso principal, la cantidad de procesos es igual a la carga deseada redondeada a entero hacia arriba. Cada proceso entra en un bucle que se repite diez veces por segundo y en el que, en cada iteración, se llama a getloadavg para obtener la carga promedio del sistema a un minuto; la desviación entre la carga deseada y la carga real pasa al controlador proporcional e integral para decidir el nivel de ocupación de cada proceso. Cada ciclo de una décima de segundo se reparte, de acuerdo con la ley de control, entre una fracción de tiempo de alto consumo del procesador y una fracción de tiempo de bajo consumo (durmiendo).

Más allá de verificar que el usuario pasa una cantidad correcta de argumentos, el programa no comprueba si hay errores. ¡No es más que un juguete hecho en escasos minutos!

Los parámetros del sistema de control están escogidos a voleo, así que es muy probable que haya una combinación mejor que permita converger rápidamente a la carga deseada sin apenas sobrepasarla.

El programa

El código fuente está disponible a través de este enlace. Para compilarlo en un sistema compatible, basta con usar el compilador de C:
cc -o load-pi load-pi.c

El programa necesita un argumento: la carga deseada. Por ejemplo, para pedir que la carga sea 3, podemos ejecutarlo así desde el mismo directorio en el que lo tenemos:
./load-pi 3

Con la orden anterior, el programa tratará de mantener la carga a 3 hasta que lo detengamos.

El programa, por supuesto, es software libre y se distribuye bajo la licencia GPLv3.


Categorías: Informática

Permalink: http://sgcg.es/articulos/2020/07/17/jugando-con-la-carga-del-sistema-2/