Prueba de trabajo en Batch

Stress test batch script

El otro día me llegó un servidor al trabajo y la primicia era: No prende. Así que me puse a revisarlo en la primera oportunidad que encontré. Lo primero que hice fue retirar la tapa del case ya que me preocupaba algún tipo de daño físico en el hardware. No detecté nada inusual a simple vista, pero noté que el disco duro se encontraba desconectado. Esto fue un punto importante ya que no sabía el motivo.

Prueba de trabajo en Windows

Por un lado podría ser que alguien lo desconectó intentando diagnosticar algún fallo, pero al no encontrar el problema no se molestó en conectarlo de nuevo. El problema con este posible caso es que yo no tenía contacto con la persona que manipuló el ordenador anteriormente y tampoco me era posible saber el nivel de conocimientos de esta.

Al ser la única anomalía observada en el equipo, lo primero que debía saber era el problema que encontró quién diagnosticó el servidor con un maravilloso: “No prende”. Tomando en cuenta que nuestro amigo del diagnóstico no necesariamente sería el mismo que dejó desconectado el disco duro, lo dejé desconectado y me dispuse a conectar monitor, teclado, mouse y corriente para así intentar replicar el fallo reportado.

Esperando pitidos, un error en la BIOS o una pantalla negra pulsé el botón de encendido, el equipo dio video y en pantalla: “Boot Device Not Found”. Era evidente que no iba arrancar, pero me estaba preparando para algo peor. Procedí a apagar el equipo, conectar el disco duro y arrancar de nuevo. Cargó el Sistema Operativo correctamente y problema resuelto. El disco duro estaba desconectado.

Pero no puedo mandar un equipo a producción así, sin tener la certeza de que no fallará de nuevo en poco tiempo. Mucho menos tratándose de un servidor. Podría ser que quién lo mandó a su lugar de trabajo olvidó conectar el disco después de una configuración/mantenimiento. O alguien trató de diagnosticar otro fallo y este sólo se presenta con el equipo en operación.

Con más preguntas que respuestas me dispuse a escribir un script que haga uso del procesador, la memoria RAM y el disco duro de forma continua con algunos requerimientos bastante sencillos.

  • Que funcione en cualquier equipo con Windows. Ya que este es el sistema operativo que usan la mayoría de las empresas en mi región.

  • Que sea fácil de leer. Para que exista la posibilidad de modificarlo de forma simple si las circunstancias lo requieren.

  • Que sea lo más corto posible. Ya que podría requerirse en algún equipo con bloqueo de unidades de almacenamiento externas y/o sin acceso a red; así que es importante que sea fácil de escribir “a mano”.

  • Que en el caso de algún error del equipo se pueda saber el momento en que falló. Para comenzar a reducir la lista de posibles causas.

Con esto en mente hice un script que crea un bucle infinito que hace X cantidad de ecuaciones matemáticas para después generar un archivo donde escribe la fecha y hora actuales, el número de ecuaciones que realizó y como ejemplo la última ecuación realizada. En seguida muestra en pantalla el último número de archivo creado, la fecha y la hora actuales. Después borra Y número de archivo, para evitar saturar el disco duro con miles de archivos pequeños y vuelve a comenzar.

El nivel de carga al procesador y RAM lo podemos controlar aumentando o reduciendo el número de ecuaciones por archivo que queremos que ejecute, ya que nos limita la velocidad de escritura del Disco Duro, así como si decidimos ver en pantalla las ecuaciones que hace con cada archivo. Es cosa de probar, ya que depende del hardware y lo que nos interese estresar más.

El resultado fue el siguiente, recordando que todas las líneas que comienzan con rem son comentarios y se pueden omitir en caso de escribirse “a mano”.

color A
echo off

rem Establecer el límite de ecuaciones por archivo:
set equationLimit=200
rem Establecer el número de archivos que se mantienen antes de ser borrados:
set filesLimit=20
rem Mostrar/Ocultar las ecuaciones por archivo:
set showEquations=0

rem Crea carpeta temporal para los archivos y crea un archivo para registrar el inicio de la prueba.
mkdir %tmp%\testfiles
echo %date% %time% > %tmp%\testfiles\start.txt
set num=1

:createFile
rem Genera el archivo y restablece el contador.
echo %date% %time% > %tmp%\testfiles\%num%.txt
set /a bucle=1
goto:random

:random
rem Genera dos números aleatorios y los multiplica, repite el proceso según el valor de la variable equiationsLimit.
set /a numA=%random%
set /a numB=%random%
set /a res=%numA%*%numB%
IF %showEquations%==1 (echo %numA% x %numB% = %res%)
IF NOT %bucle%==%equationLimit% (
set /a bucle=%bucle%+1
goto:random
) ELSE (
rem Cuando se cumpla el límite de ecuaciones se agrega al archivo creado el registro de las ecuaciones realizadas.
echo %bucle% times>> %tmp%\testfiles\%num%.txt
echo %numA% x %numB% = %res% >> %tmp%\testfiles\%num%.txt
goto:endFile
)

:endFile
rem Muestra en pantalla el último archivo creado, elimina un archvo anterior y regresa al bucle principal.
echo File number %num% date %date% time %time%
set /a filetodel=%num%-%filesLimit%
IF EXIST %tmp%\testfiles\%filetodel%.txt (del %tmp%\testfiles\%filetodel%.txt)
set /a num=%num%+1
goto:createFile

Para terminar la historia el servidor se quedó todo un fin de semana corriendo el script, con una carga del procesador de un %60, RAM a %80 y creando archivos cada 200 ecuaciones. No falló y regresó a producción con el diagnóstico: Tenía desconectado el disco duro.

Si te es útil te invito a probar el script. En caso de tener aportes, feedback o ideas de mejora me encantaría leerte en twitter @engell25 o en los comentarios. Nos leemos pronto.

Si te gusta lo que hago y quisieras apoyarme puedes suscribirte a mi Patreon o con un donativo vía PayPal lo que me facilita dedicar más tiempo a crear contenido con más frecuencia y que este sea de mayor calidad. No es obligatorio, pero si tienes la oportunidad te estaré profundamente agradecido.
 
comments powered by Disqus