Comunicación en Congreso

Informe técnico, telemetría satelital de tiempo real sobre websockets y framework Django

 

Technical report, realtime satellite telemetry over websocket and Django framework



Pablo Soligo, Germán Merke, Jorge Salvador Ierache, Pablo Witold Martínez, Pablo Ferreira, Santiago Mansfeld.

 

 

Universidad Nacional de La Matanza,

Buenos Aires, Argentina

 


 

Resumen:

Se presenta los resultados preliminares obtenidos, en el uso de websockets sobre el framework para desarrollo web Django como solución a la visualización de telemetría de tiempo real en un prototipo experimental de software de segmento terreno multiplataforma-multimisión en el contexto del desarrollo de la estación terrena UNLaM. Se realizan pruebas de estrés para evaluar la factibilidad y los límites de aplicación para la tecnología actualmente utilizada como segmento terreno experimental en la UNLaM y su vinculación con el NASA OPENMCT [2].

 

Abstract:

Preliminary results are presented on the use of websockets over Django web framework as a solution for real-time telemetry visualization in an experimental prototype of multiplatform-multimission ground segment software in the context of the development of the UNLaM ground station. Stress tests are performed to evaluate the feasibility and application limits for the technology currently used as experimental ground segment at UNLaM and its integration with NASA OPENMCT [2].

 

Palabras Clave: Satélites, Segmento Terreno, Diseño de Software, websockets

 

 

Key Words: Satellites, Ground segment, Software Design, websockets

 

 

 


I. CONTEXTO

La UNLaM (Universidad Nacional de La Matanza) posee un prototipo de segmento terreno experimental denominado UGS (UNLaM Ground Segment) [1]. Actualmente se puede visualizar, en la versión pública (https://ugs.unlam.edu.ar) telemetría satelital histórica de satélites en órbita procesada desde datos crudos provenientes principalmente de la red SatNogs [3] y otras fuentes alternativas. El Grupo de Investigación y Desarrollo Aeroespacial de la UNLaM (GIDSA) [4] se encuentra desarrollando su propia estación terrena para enlazar de manera directa con los satélites en órbita y como consecuencia de esto es necesario implementar mecanismos que permitan la visualización eficiente de telemetría en tiempo real. El UGS ha sido desarrollado como una plataforma de investigación, experimentación y capacitación, y tiene entre sus objetivos lograr que las soluciones en el área aeroespacial sean costo-efectivas y vinculadas con el estado del arte de la ingeniería de software, minimizando tanto como sea posible alternativas que impliquen desarrollos ad-hoc, herramientas de escasa penetración en la industria de software de propósito general o de costosa implementación. Desde su primera versión, el prototipo ha tenido como objetivo ser multimisión, pudiendo trabajar con satélites de organizaciones y fabricantes independientes.

 

II. INTRODUCCIÓN

Un sistema moderno de operación multimisión debe proveer de herramientas de explotación de datos que incluyan, entre otras, las siguientes características [5] y [6]:

·       Habilidad de mantener de forma eficiente, segura y transparente los datos de la misión completa.

·       Integración para cambiar entre datos históricos y de tiempo real.

·       Una performance que permita obtener datos de años en unos pocos segundos.

·       Manejar grandes volúmenes de datos y niveles de variabilidad y granularidad.

·       Garantía de fiabilidad.

·       Punto de acceso único disponible desde interfaces de programación de aplicaciones (API del inglés Application Programming Interface)

El UGS, si bien es un prototipo de investigación, ha tenido en cuenta estos requerimientos. En trabajos anteriores [7] se han explorado distintos diseños y herramientas de almacenamiento para la telemetría histórica. En este trabajo se analiza e implementa una alternativa para la comunicación en tiempo real entre las herramientas de visualización y la telemetría en tiempo real obtenida. Con la estación terrena operativa será necesario para el UGS tener la capacidad de visualizar telemetría en tiempo real sobre su capa de visualización, derivada del producto de código abierto de la NASA Open MCT, estando el back-end desarrollado principalmente en Python Django. El uso de websockets no es necesariamente obligatorio, pero es la opción explícitamente desarrollada y puesta como ejemplo por el equipo de Open MCT [8]. Aunque Django no soporta nativamente el uso de websockets, sí dispone de bibliotecas para hacerlo. El presente trabajo presenta las experiencias en la adaptación del UGS y el Open MCT para visualización de telemetría en tiempo real usando la biblioteca Django Channels (https://channels.readthedocs.io/en/stable/).

Mediante una serie de pruebas de estrés se busca conocer la posible degradación en función de la cantidad de conexiones, obtener los límites de operación para estas tecnologías y analizar la factibilidad de usarlas masivamente en un sistema de segmento terreno multimisión en la nube.

 

III. MÉTODOS

Los websockets ofrecen una solución para establecer una conexión bidireccional entre en un servidor y un cliente sobre internet, especialmente bien soportada por los navegadores web. El UGS actualmente dispone de un servicio web que puede recibir telemetría de múltiples fuentes, tanto sea de una estación terrena, mediante adaptadores que consumen u obtienen datos crudos de internet, o directamente desde archivos compartidos por agencias espaciales vinculadas. Toda telemetría novedosa recibida deberá ser informada a los clientes que se suscriban. El cliente puede ser una instancia de Open MCT, la cual, según qué variables este visualizando, deberá subscribirse, anunciando su intención de ser informado de las novedades.

Para cumplir con este objetivo, teniendo en cuenta la tecnología y frameworks utilizados, sería suficiente con la alternativa disponible e integrada por defecto en el ORM (Object Relational Mapper) de Django. Django channels propone utilizar un decorador (@receiver) asociado a una señal denominada “post_save”. Esta señal se encuentra incorporada por defecto y puede, mediante retrollamada, informar sobre el salvado de un objeto, en nuestro caso una variable de telemetría. Sin embargo, y por cuestiones de eficiencia, el UGS no realiza el salvado de cada variable de forma individual, sino que realiza el guardado en una única transacción de la totalidad de variables que se encuentran en un paquete recibido, utilizando el método disponible en el ORM de Django bulk_create. Por defecto bulk_create no enviara ninguna señal [9].

Con este escenario se plantearon modificaciones en los frameworks tendientes a optimizar el funcionamiento. Siguiendo las alternativas que ofrece el framework Django [10] se desarrolló un “manager” propio (TlmyVarManager) para la clase TlmyVar (variable de telemetría) y una señal especial indicando que se guardaron telemetrías, agregando como parámetro cuales fueron. Para minimizar el tiempo de comunicación entre el cliente y el servidor las novedades se informan antes de su almacenamiento físico. Los archivos fuentes del prototipo donde se realizaron las modificaciones y las pruebas se encuentran disponibles en github [9].

Una vez recibida la notificación será informada mediante un message bróker (REDIS) [11] a los “AsyncWebsocketConsumer”, entidades del servidor responsables de administrar las conexiones websocket con los clientes, y puntualmente de decidir si debe informar a los clientes la novedad en función de si están o no subscriptos a las variables que se notificaron. Las instancias de “AsyncWebsocketConsumer” serán responsables de guardar la lista de variables a las que están subscritas cada uno de los clientes. La Figura 1- Diagrama de alto nivel del proceso de difusión de novedades a los clientes conectadosse presenta el diagrama de alto nivel del proceso de difusión de novedades a los clientes conectados, donde se muestra el proceso de recibir novedades (desde uno o más canales), para posteriormente proceder a la serialización de la información para ser comunicada vía REDIS a los diferentes procesos encargados de atender a los clientes.

Figura 1- Diagrama de alto nivel del proceso de difusión de novedades a los clientes conectados

Las limitaciones que impone el GIL (Global Interpreter Lock) al uso de hilos en Python obligan a desarrollar procesos separados y a establecer una comunicación mediante datos serializados en lugar de compartir memoria hecho este que agrega un costo de procesamiento en la constante serialización y deserialización para el filtrado. La Tabla 1 - Pila de hardware y software detalla el hardware utilizado en la prueba, y ofrece además un detalle de las unidades de software que fue necesario instalar para simular un equipo de producción.

 

 

Hardware

Procesador

AMD A10-7860K Radeon R7, 12 Compute Cores 4C+8G

Memoría

8 GB

HD 1

ScanDisk SSD PLUS *

HD 2

WDC WD6003FZBX-0

Software

Servidor wsgi

Gunicorn

Servidor asgi

Uvicorn

Proxy reverso

Nginx

Base de datos

Postgresql 14

Otros

Redis

Tabla 1 - Pila de hardware y software

La cantidad de variables, 7500, se ha mantenido en relación con la cantidad esperable para un satélite de comunicaciones [5], la frecuencia de envió se ha definido en 10 segundos siendo este un número superior al tiempo necesario para el procesamiento y almacenamiento de las 7500 variables. El objetivo es que sin implementar corutinas o procesos distribuidos el servidor se encuentre en una situación de equilibrio antes de recibir las conexiones clientes sin encolados de ningún tipo. Con esta frecuencia, todos los paquetes pueden ingresar sin demoras, utilizando el hardware y software indicado en la Tabla 1 - Pila de hardware y software, incluyendo tiempos de transferencias http, autenticación y autorización, siendo el productor de los paquetes un solo proceso.

Los clientes son simulados utilizando la biblioteca websockets [12] de Python. Para las pruebas se crearán clientes y se medirán los tiempos entre la llegada del paquete al servidor y la recepción de la novedad por parte del cliente.

Cada cliente suscribirá 30 variables aleatorias suponiendo que es la cantidad de variables que pueden observase de manera simultánea en una pantalla. Para simplificar la prueba los clientes mantienen vivas el total de las subscripciones. Se mide el promedio de los tiempos entre que la variable llega al servidor back-end (el paquete crudo es procesado) y que la novedad llega al cliente. Las variables de telemetría viajan con una marca de tiempo que permite calcula la diferencia y los tiempos de los equipos son sincronizados utilizando comandos para tal fin (timesyncd).

 

IV. RESULTADOS

En la Figura 2- Tiempos de retardo promedio según cantidad de conexiones clientes se muestran los tiempos de retardo promedio según cantidad de conexiones para 5, 25, 125 y 625 clientes con 30 variables subscriptas cada uno. Se han realizado las pruebas ejecutando el servidor ASGI (Asynchronous Server Gateway Interface) con 4 y 8 workers, o procesos paralelos. La Tabla 2 - Tiempos de retardo promedio según cantidad de conexiones clientespresenta los tiempos de retardo promedio según cantidad de conexiones clientes.

 

Figura 2- Tiempos de retardo promedio según cantidad de conexiones clientes

 

Clientes

Workers

4

8

5

0,63s

0,55s

25

1,05s

1,04s

125

3,51s

3,33s

625

16,59s

18,10s

Tabla 2 - Tiempos de retardo promedio según cantidad de conexiones clientes

 

VI. CONCLUSIONES

La implementación actual no ofrece rendimientos que permitan pensar en un sistema en la nube que pueda escalar utilizando hardware de bajo costo.

Durante las pruebas se detectaron inicialmente demoras importantes, al iniciar una serie de mediciones utilizando “cProfile” [13] se observó que los principales problemas radican la serialización, deserialización y filtrado de novedades correspondientes a cada cliente. Cada cliente subscribe a un subconjunto de variables y es necesario dividir que novedad es aplicable a cada cliente siendo inicialmente un problema de N*S*C, N novedades contra S variables subscriptas y eso para cada cliente C, en nuestras pruebas N=7500, S=30 y 5<C<625. Se debe observar que la información debe viajar serializada a cada instancia de “AsyncWebsocketConsumer” que puede ser ejecutado en un proceso separado.

Para atender a este problema se ha trabajado con el tipo integrado “set( que demostró mejor rendimiento al momento de determinar la intersección entre las novedades recibidas y las que deben ser informadas a cada cliente. La naturaleza asincrónica de la clase “AsyncWebsocketConsumer” solo aplica al envió del paquete mediante sockets una vez este conformado.

A pesar de todas las optimizaciones aplicadas se observan retardos importantes cuando la cantidad de clientes crece. Los tiempos de deserialización, filtrado y serialización no son despreciables incluso aplicando optimizaciones y eligiendo los tipos integrados que mejor se comporten para estas operaciones. Estos procesos se deben realizar para cada cliente y haciéndolo especialmente sensible cuando tiene que atender a un alto número de conexiones.

La limitación del intérprete de Python para trabajar con múltiples hilos o procesos livianos y compartir memoria obliga a crear “workers” o procesos paralelos donde la información tiene que ser transmitida de forma serializada. Posteriormente debe ser deserializada para separar que información se debe comunicar a que cliente. Si bien cada “worker” puede deserializar, filtrar, serializar y enviar simultáneamente, cuando la cantidad de clientes supera las capacidades de paralelización del hardware se producen encolados.

 

VII. TRABAJO A FUTURO

Como trabajo a futuro se intentará aplicar optimizaciones y diseños alternativos. Las limitaciones del GIL impiden pensar en soluciones que eviten la serialización y deserialización en cada proceso, no parece posible salvar esa limitación y por tanto se pueden pensar alternativas que reduzcan tanto como sea posible los conjuntos a compartir entre procesos. Una primera alternativa implica enviar a los procesos o “workers” solo las variables que hayan sufrido cambios y/o enviar a los procesos o “workers” solo las variables que al menos estén subscriptas a algún cliente. Ambas alternativas requieren un preproceso, pero reducen los conjuntos que deben deserializar y filtrar en cada proceso. Estas opciones deben ser probadas para verificar que genera beneficios, aunque complejizan la implementación.

Una segunda solución de sencilla implementación implica generar una señal individual por cada variable Luego cada cliente decidirá si le pertenece o no esa variable puntual. Esta opción reduce el tamaño de los datos a serializar y los filtrados traduciendo la mayor carga de trabajo al “message broker” (REDIS). Adicionalmente también se puede aplicar un prefiltros para asegurarse que la variable esta subscripta a al menos un cliente.

Una tercera solución posible es enviar todas las novedades al cliente si está subscripto al satélite en lugar de estar subscripto individualmente a una variable, esta última alternativa puede presentar reparos en cuanto a la seguridad y confidencialidad de los datos y, por lo tanto, si bien es de muy sencilla implementación y puede ser aplicable en entornos de redes cerradas no resulta aceptable para soluciones en la nube. Finalmente mayores capacidades de hardware y procesos desacoplados de la aplicación del centro de control, particularmente serialización y desrealización con cada satélite pueden brindar soluciones tentadoras de explorar para superar las limitaciones indicadas.

 

VIII. REFERENCIAS Y BIBLIOGRAFÍA

[1]

https://ugs.unlam.edu.ar, UNLaM Ground Segment, 2020.

[2]

J. Trimble y A. Henry, «Building a Community of Open Source Contributors,» de International Conference on Space Operations (SpaceOps 2018), 2018.

[3]

D. J. White, I. Giannelos, A. Zissimatos, E. Kosmas, D. Papadeas, P. Papadeas, M. Papamathaiou, N. Roussos, V. Tsiligiannis y I. Charitopoulos, «SatNOGS: satellite networked open ground station,» 2015.

[4]

https://gidsa.unlam.edu.ar, Grupo de Investigación y Desarrollo de Software Aeroespacial de la Universidad Nacional de La Matanza, 2020.

[5]

T. Morel, G. Garcia, M. Palsson y J. C. Gil, «High Performance Telemetry Archiving and Trending for Satellite Control Centers,» de SpaceOps 2010 Conference Delivering on the Dream Hosted by NASA Marshall Space Flight Center and Organized by AIAA, 2010.

[6]

G. Pace, M. Schick, A. Colapicchioni, A. Cuomo y U. Voges, «EO ON-LINE DATA ACCESS IN THE BIG DATA ERA,» de Proceedings of the 2019 conference on Big Data from Space, 2019.

[7]

P. Soligo, J. S. Ierache y G. Merkel, «Telemetrı́a de altas prestaciones sobre base de datos de serie de tiempos,» 2020.

[8]

«OPENMCT Getting Started,» [En línea]. Available: https://github.com/nasa/openmct-tutorial. [Último acceso: 5 12 2022].

[9]

The Django Software, «https://docs.djangoproject.com/en/4.1/ref/models/querysets/,» [En línea]. Available: https://docs.djangoproject.com/en/4.1/ref/models/querysets/. [Último acceso: 24 10 2022].

[10]

GIDSA, «UGS Backend,» [En línea]. Available: https://github.com/unlamgidsa/unlam_gs_backend.git. [Último acceso: 5 12 2022].

[11]

Django Software Foundation, «https://docs.djangoproject.com/en/4.0/topics/db/managers/,» [En línea]. Available: https://docs.djangoproject.com/en/4.0/topics/db/managers/. [Último acceso: 24 10 2022].

[12]

«Redis,» [En línea]. Available: https://redis.com/solutions/use-cases/messaging/. [Último acceso: 5 12 2022].

[13]

websockets-the-project, «websockets,» [En línea]. Available: https://websockets.readthedocs.io/en/stable/. [Último acceso: 24 10 2022].

 

Recibido: 2022-12-20

Aprobado: 2022-12-28

Hipervínculo Permanente: https://doi.org/10.54789/reddi.7.2.5

Datos de edición: Vol. 7 - Nro. 2 -Art. 5

Fecha de edición: 2022-12-29