AWS CodeGuru Profiler

codeguru profiler

La función sin servidor de AWS que probablemente no esté utilizando (todavía)

En esta publicación de blog, proporcionaré una descripción general de las características de AWS CodeGuru Profiler para generar perfiles de funciones de Lambda y proporcionaré una guía paso a paso sobre cómo configurarlo y usarlo para optimizar el rendimiento de sus aplicaciones sin servidor.

Todos hemos estado allí: está trabajando en una nueva característica elegante, todo parece prometedor y funciona sin problemas… y de repente, se da cuenta de que el rendimiento no es excelente.

Al principio, intenta analizar el código y ver dónde está el problema, pero con microservicios complejos, puede ser bastante difícil perfilar componentes en su máquina, o incluso simular un entorno de producción.


Aquí es donde entra en juego AWS CodeGuru Profiler. A medida que aumenta la utilización de la arquitectura sin servidor, la necesidad de herramientas que puedan optimizar el rendimiento de estas aplicaciones se vuelve cada vez más importante.

CodeGuru Profiler es una poderosa herramienta que recopila datos de rendimiento en tiempo de ejecución de sus aplicaciones en vivo y proporciona datos y recomendaciones que pueden ayudarlo a ajustar el rendimiento de su aplicación.

  • Se integra a la perfección con las funciones de Lambda, lo que hace que toda la experiencia sea sencilla.

Configuración del generador de perfiles de CodeGuru

Una de las mejores cosas de usar CodeGuru Profiler es lo fácil que es configurar tiempos de ejecución de Lambda compatibles:

  • Python 3.6 a Python 3.9
  • Java 8 (Corretto)
  • Java 11 (Corretto)

Para aquellos que prefieren usar la consola de AWS, todo lo que tienen que hacer es habilitar la creación de perfiles de código en las herramientas de monitoreo y operaciones en la pestaña Configuración de su función.

  1. Esto agregará la capa CodeGuru Profiler a su función,
  2. Establecerá las variables de entorno necesarias
  3. Y agregará la política AmazonCodeGuruProfilerAgentAccess al rol de su función.

Como alternativa, puede utilizar la AWS CLI para configurar CodeGuru Profiler.

  • El siguiente es un ejemplo de un fragmento para una función de Python:

#!/bin/bash

group_name=$1
lambda_arn=$2

# Create a new profiling group
aws codeguruprofiler create-profiling-group \
--compute-platform AWSLambda \
--profiling-group-name "$group_name"

AWS_LAMBDA_EXEC_WRAPPER=/opt/codeguru_profiler_lambda_exec
CODEGURU_VARIABLES="{
\"AWS_LAMBDA_EXEC_WRAPPER\": \"$AWS_LAMBDA_EXEC_WRAPPER\",
\"AWS_CODEGURU_PROFILER_TARGET_REGION\": \"us-west-2\",
\"AWS_CODEGURU_PROFILER_HEAP_SUMMARY_ENABLED\": \"true\",
\"AWS_CODEGURU_PROFILER_GROUP_NAME\": \"$group_name\"
}"

ROLE=$(aws lambda get-function --function-name FancyFunction | jq -r '.Configuration.Role' | awk -F '/' '{print $NF}')
# Grant permissions to Lambda to perform CodeGuru actions
aws iam attach-role-policy \
--role-name "$ROLE" \
--policy-arn arn:aws:iam::aws:policy/AmazonCodeGuruProfilerAgentAccess

# Update environment variables
aws lambda update-function-configuration \
--function-name "$lambda_arn" \
--environment "{ \"Variables\": $CODEGURU_VARIABLES }" \
--layers "arn:aws:lambda:us-west-2:157417159150:layer:AWSCodeGuruProfilerPythonAgentLambdaLayer:11"
  • También se integra perfectamente con AWS CDK:

export class LambdaStack extends Stack {

constructor(scope: Construct, id: string, props?: StackProps) {
super(scope, id, props);

let region = Stack.of(this).region; 
const LAYER_ARN = 'arn:aws:lambda:us-west-2:157417159150:layer:AWSCodeGuruProfilerPythonAgentLambdaLayer:11';

const CodeGuruLayer = LayerVersion.fromLayerVersionArn(this, 
"CodeGuruLayer",
LAYER_ARN
);

const function = new lambda.Function(this, 'MyFunction', {
runtime: lambda.Runtime.PYTHON_3_9,
handler: 'lambda_handler.handler',
code: Code.fromAsset("./lambda_assets/"),
environment: {
'AWS_LAMBDA_EXEC_WRAPPER': '/opt/codeguru_profiler_lambda_exec',
},
layers: [CodeGuruLayer],
profiling: true,
});


function.add_to_role_policy(
iam.PolicyStatement(
effect=iam.Effect.ALLOW,
actions=[
"codeguru-profiler:ConfigureAgent",
"codeguru-profiler:CreateProfilingGroup",
"codeguru-profiler:PostAgentProfile",
],
resources=["arn:aws:codeguru-profiler:*:*:profilingGroup/*"],
)
);

}

}

También vale la pena señalar que CodeGuru Profiler puede integrarse con otras versiones de tiempo de ejecución de Java o Python.

CodeGuru Profiler en acción

Para demostrar las capacidades de CodeGuru Profiler, creemos una nueva función Lambda con un controlador simple que tiene un problema de permisos.

  • La función incluye varias funciones lentas que simulan un problema de rendimiento:

import time

def slow_function():
time.sleep(2)

def another_slow_function():
time.sleep(3)

def even_slower_function():
time.sleep(4)

def innocent_looking_function():
even_slower_function()
another_slow_function()

def innocent_function():
time.sleep(0.2)

def lambda_handler(event, context):
innocent_function()
innocent_looking_function()
slow_function()
innocent_function()
another_slow_function()
even_slower_function()
innocent_looking_function()
innocent_function()

return {
'statusCode': 200,
'body': 'Hello, World!'
}

Siguiendo las instrucciones anteriores, habilitaremos la creación de perfiles de código desde la consola de Lambda.

  • Una vez que se ejecuta la función, podemos ver los resultados en CodeGuru Profiler:

Obviamente, el ejemplo aquí está demasiado simplificado.

  • Aquí hay una demostración de muestra proporcionada por CodeGuru:

CodeGuru Profiler

Realmente me gusta la capacidad de navegar entre diferentes marcos en el gráfico de la CPU.

  • Esto proporciona un desglose detallado de lo que sucede con el rendimiento de su

    Lambda.

CodeGuru Profiler
Gráfico de resumen de montón

El gráfico de resumen del montón también proporciona información valiosa sobre el uso del montón de su aplicación a lo largo del tiempo, aunque agradecería más información granular…

  • Como el uso del montón para paquetes específicos:

CodeGuru Profiler
Panel de recomendaciones

El panel de recomendaciones es una gran adición, ya que ofrece sugerencias procesables para mitigar los problemas de rendimiento. Si bien personalmente no he encontrado que las recomendaciones sean particularmente útiles todavía, creo que esta característica tiene potencial.

Creo que navegar a través de las recomendaciones y el gráfico de uso de la CPU podría ser más fácil de usar y señalar dónde se deben realizar los cambios en mi base de código.

Es importante tener en cuenta que los datos recopilados serán más confiables y precisos si ejecuta su función varias veces durante un período de tiempo prolongado.

    • Tenga en cuenta que los resultados pueden tardar unos minutos en aparecer.

En general, AWS CodeGuru Profiler es una excelente herramienta que puede ayudarlo a:

  • identificar y solucionar problemas de rendimiento,
  • mejorar experiencia del usuario y costos reducidos.

Definitivamente, usted debe darle una oportunidad.


Gracias por llegar hasta aquí, si encuentras esto útil no olvides dejar un👍🏼y suscribirse para recibir más contenido.

Si le interesa, puede echar un vistazo a algunos de los otros artículos que he escrito recientemente sobre Node.js y AWS Lambda:

Recent Post