…esto no es un subtítulo…
2020-07-14
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. Por diversión, vamos a diseñar una 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 de tipo todo o nada, como un termostato: en todo momento, si la carga del sistema es inferior a la deseada, los P procesos se mantienen ocupados; si la carga es superior a la deseada, los P procesos duermen la mayor parte del tiempo, de forma que solamente despiertan una fracción insignificante del tiempo para comprobar la carga del sistema.
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 en el que, en cada iteración, se llama
a getloadavg
para obtener la carga promedio del sistema a
un minuto; si esta carga es superior a la deseada, el proceso duerme
durante un segundo (con lo que deja de estar en ejecución y no aumenta
la carga) para volver a iterar en el bucle; en caso contraro, el
proceso sigue iterando en el bucle tan rápido como puede (con lo que
está en ejecución y aumenta la carga).
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!
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-thermostat load-thermostat.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-thermostat 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/14/jugando-con-la-carga-del-sistema-1/