20 de diciembre de 2017

Concurso navideño de entrenamiento

Guerrero montando el árbol de navidad. Imagen de KiloWhat en https://kilowhat.deviantart.com/art/A-merry-Star-Wars-Christmas-580131501

Desde el CEEDCV (Centro Específico de Educación a Distancia Comunidad Valenciana) se organizó, como el año anterior, el concurso navideño de entrenamiento para ProgramaMe. Pensado para meter el gusanillo de la programación y crear cantera para los regionales de marzo, se celebró el día 20 de diciembre, en el último suspiro del trimestre.

La inscripción fue ¡¡un éxito!!. Con un total de 177 equipos de 33 centros diferentes, se multiplicó por 2'5 la participación del año anterior. Todos compitieron de manera amistosa en función de un reglamento adaptado para la ocasión que permitía equipos de 1, 2 o 3 alumnos. En la práctica, más del 85% de los equipos estuvieron formados por 3 alumnos, y solamente 4 fueron unipersonales.

Los problemas, inspirados en el universo de La guerra de las galaxias, se publicaron en el juez en línea Acepta el reto y los envíos se hicieron a través de dicha plataforma. En total, se recibieron 615 envíos de 159 de los equipos, y de 35 usuarios adicionales que decidieron unirse sobre la marcha. La evolución del concurso y su clasificación en vivo pudo presenciarse desde aquí. El primer problema aceptado no se hizo esperar mucho. Ocurrió solo 6 minutos después de empezar.

Los cinco primeros clasificados fueron:

# Centro Logo Equipo Resueltos Tiempo acumulado
1 Institut Sabadell Logo Institut Sabadell - Sabadell (Barcelona) Vacíos legales 5 09:17:55
2 IES La Sénia Logo IES La Sénia - Paiporta (Valencia) Petaflops 4 04:59:32
3 IES Virgen de La Paz Logo IES Virgen de La Paz - Alcobendas (Madrid) Los sermos 4 05:24:57
4 Institut Camí de mar Logo Institut Camí de mar - Calafell (Tarragona) Camins 4 05:26:44
5 IES Virgen de La Paz Logo IES Virgen de La Paz - Alcobendas (Madrid) GibiBytes 4 05:46:27
La clasificación completa la tenéis disponible aquí.

¿Qué fue bien?

Un participante disfrazado de Darth Vader

Con una inscripción de 177 equipos (el último solo 5 minutos antes de empezar), el concurso de entrenamiento se alzó con la mayor tasa de participación de la historia de ProgramaMe. Los minutos anteriores al inicio pudimos sentir las muestras de interés y ganas de empezar que nos llegaban desde todos los rincones.

Los problemas, inspirados en la saga de La guerra de las galaxias, dejaron volar la imaginación de algunos de los centros participantes, que ambientaron sus aulas para la ocasión.

¿Qué... no fue tan bien?

La alta tasa de participación tuvo su lado oscuro . El juez usado para el concurso, ¡Acepta el reto!, no estuvo a la altura de las circunstancias y murió de éxito.

Algunos de los alumnos que participan en ProgramaMe aprenden no solo programación, sino también redes, administración y gestión de servidores. Para que no solo nosotros, que lo vivimos desde dentro, aprendamos de la experiencia, sino que todos podais saber lo que pasó, os damos algunos detalles.

Han Solo tranquilo, hablando con Luke

La plataforma del juez lleva en marcha desde 2014 y su uso no ha dejado de crecer. Durante el año 2017 se recibieron el mismo número de envíos que durante los tres años anteriores completos. La mayor prueba de carga del sistema hasta el momento la habíamos vivido durante el concurso Las 12 UVas el 31 de diciembre de 2016, con 200 inscritos, un número mayor que la participación en el concurso de entrenamiento. Las gráficas de carga que manejábamos del juez eran tranquilizadoras, porque mostraban además algo de margen para crecer, por lo que teníamos confianza de que todo funcionaría bien. Pero pocos minutos después de comenzar, empezaron a llegarnos noticias inquietantes.

Clones en formación

Los datos que veíamos en la carga del servidor escapaban a nuestras previsiones. La cantidad de envíos recibidos por minuto era muy alta y, sobre todo, las solicitudes para ver el marcador del concurso, hacer login en el sistema, e incluso registros de usuarios de última hora estaba más allá de toda lógica. El concurso estaba en marcha, y no era un juego de niños. Más bien parecía ¡un ataque clon!

Conmoción en la fuerza: explosión del planeta Alderaan

El sistema, sencillamente, se desbordó. Para entendernos, el backend de ¡Acepta el reto! tiene que atender a "clientes" con diferentes roles. El primer tipo son los usuarios web. Cuando alguien visita la página, hace login o manda una solución, el backend tiene que procesar la solicitud y enviar una respuesta. Además, al ser un concurso, también había un tipo de clientes web distintos al del propio portal, que venían desde aquí, la página del marcador de ProgramaMe, duplicando el número de accesos.

Aparte de los clientes web, el backend tiene que atender a demonios de la plataforma. Los menos prioritarios los habíamos detenido temporalmente durante el concurso para disminuir la carga. pero el demonio de evaluación de envíos, en máquinas independientes, tenía que estar, por razones obvias, lanzado.

Muerte de Obi-Wan Kenobi

Ante el acceso masivo desde la web, el backend dejó de poder atender al demonio de evaluación de envíos. Este demonio hace encuesta, pidiendo al backend el siguiente envío a evaluar. Cuando lo recibe, lo compila, y evalúa, y una vez que tiene el veredicto lo envía de vuelta al backend para su almacenamiento y notificación a los clientes web. Monitorizando al servidor vimos que el demonio de evaluación tardaba más de 20 segundos en recibir del backend el siguiente envío a evaluar, y a veces hasta un minuto en poder enviar el veredicto de vuelta. Eso significaba que el sistema estaba recibiendo decenas de envíos por minuto de los participantes, pero solo estaba juzgando uno en ese mismo tiempo. Es fácil entender por qué media hora después de empezar el concurso, la cola de envíos a la espera de ser evaluados superaba los 200. La decisión que tomamos fue detener temporalmente el acceso por web. Confiamos en que los participantes pudieran trabajar "offline" en el resto de problemas, y mientras dejábamos respirar al servidor para que el demonio de evaluación pudiera quitarse trabajo pendiente.

Administrando el backend

Mientras tanto, además, intentamos evaluar la situación y buscar soluciones para que, cuando relanzáramos de nuevo el acceso web, pudiéramos tener confianza en que no volvería a caer. Cada vez que hacíamos alguna prueba y abríamos momentáneamente el sistema de envíos, recibíamos un montón de accesos. ¡¡Notábamos la presión que nos mandábais!! Por desgracia, ninguna de las soluciones que probamos (ampliar la memoria, el número de hebras para clientes, reducir los tiempos del long polling usados por el marcador para conseguir comunicación push...) dio resultado. Las únicas opciones que nos quedaban era mejoras en el hardware que eran imposibles de realizar en tiempo de concurso.

De modo que lo único que pudimos hacer fue asumir la situación y replantear la solución. Ampliamos la duración del concurso para paliar el tiempo de desconexión vivido, y asumimos que, irremediablemente, las evaluaciones de los envíos se retrasarían. Convertimos al concurso en una "competición ciega": los usuarios no podrían ver el veredicto de sus envíos hasta cerrado el concurso. Aunque no es una situación ideal, era algo habitual hace muchos años, cuando no existían sistemas de evaluación automáticos y los envíos tenían que comprobarlos manualmente los jueces. Como la evaluación estaba, en la práctica, anulada, decidimos, para descargar más al servidor, cerrar la página del marcador de ProgramaMe, de modo que al menos la plataforma de envíos funcionara un poco mejor.

Administrando el backend

Con el concurso finalizado, hicimos análisis de la situación vivida. Nuestras previsiones eran que el servidor aguantaría; de otro modo habríamos cerrado la inscripción para no admitir a más equipos de los que sabíamos que íbamos a poder soportar. ¿Qué había fallado entonces? La conclusión fue que no hicimos bien las cuentas. El número de inscritos alcanzó los 177 equipos. La cifra es espectacular. Para ponerlo en contexto, es un equipo más que la suma de los participantes de todos los regionales de la edición de 2015-16. Y el problema fue que contamos equipos, dado que en los concursos regionales presenciales cada equipo puede utilizar únicamente un ordenador. Pero en los concursos online eso no ocurre, y por tanto lo que había que hacer era contar integrantes de equipos, y fuisteis 506 participantes. No todos usasteis un ordenador cada uno, claro, pero sí un porcentaje muy alto. Y para esa cantidad de carga no estábamos preparados. Dicho de otra forma, no supimos crecer lo suficiente.

Para ¡Acepta el reto!, la (mala) experiencia fue muy educativa, y se han tomado medidas para poder soportar esta carga de tráfico, con hardware nuevo y algunos cambios en la arquitectura de la aplicación. Os pedimos disculpas por todas las dificultades sufridas. Esperamos que no impidan que confiéis en nosotros, y nos pongáis a prueba en el concurso del año que viene o, si no quieres esperar tanto, en Las 12 UVas de dentro de unos días .

Prueba tus soluciones

Puedes probar tus soluciones en ¡Acepta el reto!, el juez on-line con problemas de ediciones anteriores.

Programame 2.0

Visita nuestro blog con acertijos programables.