…esto no es un subtítulo…
2020-07-19
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 con control de tipo todo o nada, una segunda herramienta con control de tipo proporcional e integral y una tercera herramienta con control en lazo abierto, por diversión, vamos a diseñar la cuarta pequeña herramienta que permite alcanzar una carga del sistema elegida a base de consumir tiempo de procesador de forma controlada.
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 en lazo cerrado proporcional e integral modificado: sobre la actuación del control en lazo abierto se hace una modificación con control en lazo cerrado proporcional e integral. El punto de trabajo básico dicta que los procesos se mantienen ocupados una fracción de tiempo suficiente que permitiría alcanzar la carga deseada si no hubiera más procesos en ejecución; en general, la carga alcanzada será distinta de la deseada, con lo que esta actuación se perturba con una contribución que suma de una componente proporcional al error en la carga alcanzada y una componente proporcional a la integral en el tiempo de dicho error. La componente integral otorga al controlador una memoria que sirve para que converja con el tiempo.
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 cada uno de los ciclos de una décima de segundo, el tiempo se
reparte entre una fracción de tiempo de alto consumo del procesador y
una fracción de tiempo de bajo consumo (durmiendo). La fracción de
tiempo con alto consumo de procesador es igual a la carga deseada
dividida entre el número de procesos más una corrección proporcional
al error en la carga del sistema y una corrección proporcional a la
integral en el tiempo de dicho error.
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 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-modified-pi load-modified-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-modified-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: https://sgcg.es/articulos/2020/07/19/jugando-con-la-carga-del-sistema-4/