¡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.
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"
#}
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
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 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'])
}
Ejecutamos las pruebas
Para ejecutar las pruebas nos vamos a las Step-function en la consola de AWS, donde encontraremos la Step Function desplegada.
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"
}
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"
}
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
}
}
El parámetro visualización es una URL que llevará 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 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.
Top comments (0)