Lambda Power Tuning: Una comparativa entre arquitecturas x86_64 y arm64
¡Desde su aparición, 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 y 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?, en definición de un artículo de AWS podemos encontrar esta definición que abarca todo lo que podemos aprovechar de la herramienta:
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/potencia de las funciones Lambda. Se ejecuta en tu cuenta de AWS, impulsada por AWS Step Functions, y admite múltiples estrategias de optimización.
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 centrar es una Step-function que controla la ejecución secuencial o en paralelo de las opciones de memoria que configuremos en los parámetros de la ejecución y sobre las que queremos comparar.
Desplegando el Stack:
Siguiendo la documentación de como 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"
#}
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 utilizara 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
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
Sam Build
Compilando el Stack antes del Deploy
$ cd ./aws-lambda-power-tuning
$ sam build -u
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 = []
Las lambdas
Para la prueba utilizaremos dos lambas con el mismo código, una lambda sobre arquitectura x86_64 y otra sobre arm64.
El código que ejecutara cada lambda se trata de una función que calcula la serie fe Fibonacci para un valor de posición “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'])
}
Ejecutamos las pruebas
Para ejecutar las pruebas nos vamos a las step función donde encontraremos la Step Function desplegada.
Para cada lambda preparamos un body con la información de la lambda sobre el que se ejecutará la prueba "lambdaARN"
y el body "payload"
que deberá recibir cada pruebas
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"
}
Lambda con aerquitectura 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"
}
Resultados
Lambda X86_64
Como salida de la ejecución, cada prueba arroba 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
}
}
El parámetro visualización es una URL que llevara a una gráfica como la que se muestra a continuación.
Lambda arm64
Conclusiones
El rendimiento del procesador x86 es mucho más estable 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ía 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 nuestro diseño y un ajuste fino del hardware que necesitamos para una ejecución eficiente.