Desde hace tiempo vengo a buscando un servidor de pruebas que me brinde buena potencia y bajo costo para tenerlo corriendo las 24 horas. Mientras investigaba me encuentro que AWS ofrece un tipo de instancias EC2 que usa la arquitectura ARM y que te brindan buen rendimiento a bajo costo, Este tipo de instancias se llaman T4g:


Para probar el rendimiento de estos servidores se me ocurrió la idea de levantar un pequeño blog y ver como es su comportamiento en general en:

  • Instalación de software
  • Rendimiento para el admin y para el usuario
  • Velocidad de respuesta
  • Rendimiento corriendo contenedores docker

Tú sabes, Lo normal para poder trabajar sin ser ralentizado por temas del server.

Para este ejemplo voy a hacer uso de instancia llamada t4g.nano(la más básica de esta familia) que tiene un costo de 0.0042$ por hora. Mensualmente nos costaría aprox 3$ por mes. Vamos a proceder creando la instancia EC2 con las siguientes configuraciones:



También vamos a permitir el tráfico desde cualquier lugar de internet via ssh, http y https:


Es lo único que vamos a personalizar, todo las demás opciones las dejamos por defecto.

Para levantar el blog vamos a elegir wordpress ya que es una solución común para blogs, En mi caso lo voy a levantar usando docker con docker-compose. Voy a hacer uso de un archivo docker-compose.yml para levantar 2 servicio. Uno de MariaDB y otro de Wordpress:

version: '3'
    services:
    wordpress:
        image: wordpress
        links:
        - 'mariadb:mysql'
        environment:
        - WORDPRESS_DB_PASSWORD=password
        - WORDPRESS_DB_USER=root
        ports:
        - '80:80'
        volumes:
        - './html:/var/www/html'
    mariadb:
        image: mariadb
        environment:
        - MYSQL_ROOT_PASSWORD=password
        - MYSQL_DATABASE=wordpress
        volumes:
        - './database:/var/lib/mysql'
    volumes:
    data: 

Esta configuración la conseguí de internet solo para levantar los servicios, no prestes atención al detalle. Wordpress no es el fin de este post.

Levantamos los servicios con el comando:

docker-compose up -d

Podemos ver los contenedores que están corriendo ejecutando el comando docker ps:

Revisamos nuestra ip pública:


Comenzamos con el instalador de wordpress:


y voilá:


Muy bien, hasta ahora no tuve ningún problema de instalación o rendimiento a la hora de instalar docker o docker-compose, el servidor fluye de maravilla.

¿Y como va el server hasta ahora?

Voy a usar htop para ver como va el servidor en cuando a consumo de RAM y procesador:


El servidor antes de levantar mis contenedores consume un total de 154Mb de RAM. Con dos contenedores docker corriendo tenemos un consumo de 246Mb de RAM. Me parece bien para la prueba. Aunque considera que si levantas los servicios sin docker podrias ganar un poco de memoria ahí.


¿Y como responde la página?

Pues bastante bien. El tiempo de respuesta es bastante veloz incluso tomando en cuenta que mi instancia EC2 lo creé en us-east-1 (Norte de Virginia) y no en Sao Paulo que es el datacenter más cercano a mi posición actual:


Cabe recalcar que aunque la página tenga muchas imagenes la velocidad de carga sigue siendo bastante buena.

¿Cuántas peticiones simultáneas soporta?

Vamos a hacer una pruebas más técnica viendo cuantas peticiones simultáneas soporta nuestro server, Para esto vamos hacer uso de Apache benchmark. Lo instalamos y ejecutamos con el comando:

ab -n 100 -c 100 http://3.84.109.77/

Siendo:

  • -n es la cantidad de request que debe hacer en esta sesión
  • -c es la cantidad de conexiones simultáneas que debe ejecutar al mismo tiempo

Despues de hacer un rato de pruebas te puedo comentar que el servidor puede manejar 100 conexiones al mismo tiempo sin ningun problema. a partir de 100 conexiones simultáneas al mismo tiempo ya comienza a tener problemas de rendimiento como puedes ver a continuación:


Pero hey !!!
Soportar 100 conexiones simultaneas en un server de 3$ que tiene Docker, Wordpress y MariaDB corriendo. Me parece excelente la verdad.

Probando con 5 contenedores docker

Y que tal si corremos más contenedores docker como una aplicación real que usa la arquitectura de microservicios?

Vamos a probar levantando 5 contenedores que usan: nginx, mysql, alpine, redis y postgres y veamos que como se comporta el server.

Nota: Para esta prueba he bajado los contenedores del blog. Este es el docker-compose.yml que usaré:

version: '3'
    services:
    web-app:
        image: nginx:latest
        ports:
        - "80:80"
        networks:
        - my_network

    database:
        image: mysql:latest
        environment:
        MYSQL_ROOT_PASSWORD: root_password
        MYSQL_DATABASE: my_database
        MYSQL_USER: user
        MYSQL_PASSWORD: password
        networks:
        - my_network

    backend-server:
        image: alpine:latest
        command: tail -f /dev/null
        networks:
        - my_network

    cache-server:
        image: redis:latest
        networks:
        - my_network

    postgres-db:
        image: postgres:latest
        environment:
        POSTGRES_USER: user
        POSTGRES_PASSWORD: password
        POSTGRES_DB: my_postgres_db
        networks:
        - my_network

    networks:
    my_network:
        driver: bridge

Todo levanto sin absolutamente ningun problema, Podemos ver un incremento en el uso de memoria RAM, lo cual era esperado:


Podemos ver que tranquilamente podría soportar una aplicación pequeña/mediana que usa la arquitectura de microservicios.


Conclusión

Despues de tener el blog funcionando por dos meses puedo decir que: Sí, Si vale la pena las instancias de tipo t4g con arquitectura ARM. Y que la instancia más económica t4g.nano si da buen rendimiento si buscas un server para hacer pruebas o tener algún servicio corriendo ahí.