DEV Community

olcortesb for AWS Español

Posted on • Originally published at olcortesb.hashnode.dev on

Lambda Power Tuning: Una comparativa entre arquitecturas x86_64 y arm64

¡Desde la aparición de la herramienta de Lambda Power Tuning, al menos desde mi perspectiva es menos usada de lo que podría haber imaginado. Sin embargo, entre las nuevas funcionalidades y mejoras que constantemente van agregando desde la comunidad asi como la discusión dentro de los equipos de desarrollo sobre migrar sus lambdas a una arquitectura de arm64, podría ser interesante reflotar esta herramienta y sacarle todo el jugo posible.

Lambda Power Tuning:

¿Pero qué es Lambda Power Tuning?. Tomando como referencia un Artículo de AWS podemos encontrar esta definición:

AWS Lambda Power Tuning es una herramienta de código abierto, que puede ayudarte a visualizar y ajustar con precisión la configuración de memoria/procesamiento de las funciones Lambda. Se ejecuta en tu cuenta de AWS, impulsada por AWS Step Functions, y admite múltiples estrategias de optimización.

Ref: https://serverlessrepo.aws.amazon.com/applications/arn:aws:serverlessrepo:us-east-1:451282441545:applications~aws-lambda-power-tuning

Es importante destacar que Lambda Power Tuning es una herramienta open sources y se puede colaborar, usar y probar bajo los términos de la licencia Apache 2.0, a continuación el Link del repositorio de GitHub:

Lambda Power Tuning es desde lo técnico un stack de CloudFormation. El despliegue del Stack se realiza con CDK y está disponible para los distintos lenguajes que soporta CKD.

La manera como funciona es, se despliega un Stack donde la herramienta central es una Step-function que controla la ejecución secuencial o en paralelo de las opciones de memoria que configuramos en los parámetros de la ejecución y sobre las que queremos comparar.

Desplegando el Stack:

Siguiendo la documentación de cómo desplegar el Stack vamos paso a paso:

Verificar que tenemos configuradas las credenciales para AWS

Si eres muy nuevo por aquí, dejo un Gits de como configurar AWS cli.

$ aws sts get-caller-identity
#{
# "UserId": "XXXXXXXXXXX",
# "Account": "XXXXXXXXXXX",
# "Arn": "arn:aws:iam::XXXXXXXXXXX:root"
#}
Enter fullscreen mode Exit fullscreen mode

Registrarnos en el ECR para poder gestionar las imágenes.

Es necesario hacer login con el repositorio de ECR para que permita la descarga de las imágenes que utilizará AWS SAM, más información en este link.

$ aws ecr-public get-login-password --region us-east-1 | docker login --username AWS --password-stdin public.ecr.aws
Enter fullscreen mode Exit fullscreen mode

Descargar repositorio

Clonamos el repositorio, como hemos comentado, el CKD está disponible para distintos lenguajes de programación.

$ git clone https://github.com/alexcasalboni/aws-lambda-power-tuning.git
Enter fullscreen mode Exit fullscreen mode

Sam Build

Compilando el Stack antes del Deploy

$ cd ./aws-lambda-power-tuning$ sam build -u
Enter fullscreen mode Exit fullscreen mode

Desplegar en el modo guiado donde hay que llenar todos los parámetros que pide, la mayoría por default. Para las primeras pruebas, están bien los valores por defecto.

$ sam deploy -g 
# version = 0.1
# [default.deploy.parameters]
# stack_name = "olcortesb-test-lambda-power-tuning"
# resolve_s3 = true
# s3_prefix = "olcortesb-test-lambda-power-tuning"
# region = "eu-central-1"
# confirm_changeset = true
# capabilities = "CAPABILITY_IAM"
# disable_rollback = true
# parameter_overrides = "PowerValues=\"128,256,512,1024,1536,3008\" # visualizationURL=\"https://lambda-power-tuning.show/\" 
# lambdaResource=\"*\" totalExecutionTimeout=\"300\" 
# permissionsBoundary=\"\" payloadS3Bucket=\"\" payloadS3Key=\"*\" # layerSdkName=\"\" logGroupRetentionInDays=\"7\" 
# securityGroupIds=\"\" subnetIds=\"\" 
# stateMachineNamePrefix=\"powerTuningStateMachine\""
# image_repositories = []
Enter fullscreen mode Exit fullscreen mode

Las lambdas

Para la prueba utilizaremos dos lambas con el mismo código, una lambda sobre arquitectura x86_64 y otra sobre arm64.

Arquitecturas disponibles

El código que ejecutará cada lambda se trata de una función que calcula la serie fe Fibonacci para un valor de posición de manera recursiva.

import json

def fibonacci(n):
    if n < 2:
        return n
    else:
        # fn = fn-1 + fn-2
        return fibonacci(n-1) + fibonacci(n-2)

def lambda_handler(event, context):
    return {
        'statusCode': 200,
        'body': fibonacci(event['value'])
    }
Enter fullscreen mode Exit fullscreen mode

x86

Ejecutamos las pruebas

Para ejecutar las pruebas nos vamos a las Step-function en la consola de AWS, donde encontraremos la Step Function desplegada.

arm

Para cada lambda preparamos un body con la información de la lambda sobre el que se ejecuta la prueba "lambdaARN" y el body "payload" que deber recibir cada prueba.

Lambda con arquitectura X86_64

{
  "input": {
    "lambdaARN": "arn:aws:lambda:eu-central-1:{ACCOUNT-NUMBER}:function:fibonacci-x86_64",
    "powerValues": [
      128,
      256,
      512,
      1024,
      2048,
      3008
    ],
    "num": 10,
    "payload": {
      "value": 8,
      "weight": 10
    },
    "parallelInvocation": true,
    "strategy": "cost"
  },
  "inputDetails": {
    "truncated": false
  },
  "roleArn": "arn:aws:iam::{ACCOUNT-NUMBER}:role/lambda-power-tuning-statemachineRole-QW8Kjjb44WgL"
}

Enter fullscreen mode Exit fullscreen mode

Lambda con arquitectura arm64

{
  "input": {
    "lambdaARN": "arn:aws:lambda:eu-central-1:{ACCOUNT-NUMBER}:function:fibonacci-arm64",
    "powerValues": [
      128,
      256,
      512,
      1024,
      2048,
      3008
    ],
    "num": 10,
    "payload": {
      "value": 8,
      "weight": 10
    },
    "parallelInvocation": true,
    "strategy": "cost"
  },
  "inputDetails": {
    "truncated": false
  },
  "roleArn": "arn:aws:iam::{ACCOUNT-NUMBER}:role/lambda-power-tuning-statemachineRole-QW8Kjjb44WgL"
}

Enter fullscreen mode Exit fullscreen mode

Resultados

Lambda X86_64

Como salida de la ejecución, cada prueba arroja una respuesta como la siguiente:

{
  "output": {
    "power": 128,
    "cost": 4.2e-9,
    "duration": 1.6050000000000002,
    "stateMachine": {
      "executionCost": 0.0006,
      "lambdaCost": 0.0000023604000000000003,
      "visualization": "https://lambda-power-tuning.show/{your-id}"
    }
  },
  "outputDetails": {
    "truncated": false
  }
}

Enter fullscreen mode Exit fullscreen mode

El parámetro visualización es una URL que llevará a una gráfica como la que se muestra a continuación.

x86

Lambda arm64

arm

Conclusiones

  • El rendimiento del procesador x86 es mucho más estable en función de la memoria que el del ARM.

  • Si bien el rendimiento del procesador x86 es mucho más estable después de los 512 MB el procesador ARM aumenta la eficiencia significativamente y llega a igualarlo.

  • El punto de equilibrio del procesador ARM es mucho más económico y eficiente que el procesador X86_64 por encima de los 512 MB

  • Será interesante realizar esta prueba para cada carga de trabajo que se tenga pensado optimizar con el código de cada lambda, siempre que permita ser ejecutado en un procesador ARM.

  • La herramienta de Lambda Power Tuning es una herramienta que no debe faltar en nuestros diseños y desarrollos de arquitecturas Serverless basadas en lambda, ofrece una versatilidad en validar nuestra arquitectura y un ajuste fino del hardware que necesitamos para una ejecución eficiente.

Referencias

Top comments (0)