Seleccione sus preferencias de cookies

Usamos cookies esenciales y herramientas similares que son necesarias para proporcionar nuestro sitio y nuestros servicios. Usamos cookies de rendimiento para recopilar estadísticas anónimas para que podamos entender cómo los clientes usan nuestro sitio y hacer mejoras. Las cookies esenciales no se pueden desactivar, pero puede hacer clic en “Personalizar” o “Rechazar” para rechazar las cookies de rendimiento.

Si está de acuerdo, AWS y los terceros aprobados también utilizarán cookies para proporcionar características útiles del sitio, recordar sus preferencias y mostrar contenido relevante, incluida publicidad relevante. Para aceptar o rechazar todas las cookies no esenciales, haga clic en “Aceptar” o “Rechazar”. Para elegir opciones más detalladas, haga clic en “Personalizar”.

Maximice el rendimiento de Lambda SnapStart

Modo de enfoque
Maximice el rendimiento de Lambda SnapStart - AWS Lambda

Ajuste del rendimiento

Para maximizar los beneficios de SnapStart, tenga en cuenta las siguientes recomendaciones de optimización de código para su tiempo de ejecución.

nota

SnapStart funciona mejor cuando se usa con invocaciones de funciones a escala. Es posible que las funciones que se invocan con poca frecuencia no experimenten las mismas mejoras de rendimiento.

Para maximizar las ventajas de SnapStart, recomendamos que precargue las dependencias e inicialice los recursos que contribuyen a la latencia de inicio en el código de inicialización en lugar de hacerlo en el controlador de funciones. Esto elimina de la ruta de invocación la latencia asociada a la carga pesada de clases, lo que optimiza el rendimiento de inicio con SnapStart.

Si no puede precargar las dependencias o recursos durante la inicialización, recomendamos que las precargue con invocaciones ficticias. Para ello, actualice el código del controlador de funciones, como se muestra en el siguiente ejemplo de la función tienda de mascotas del repositorio de Labs GitHub de AWS.

private static SpringLambdaContainerHandler<AwsProxyRequest, AwsProxyResponse> handler; static { try { handler = SpringLambdaContainerHandler.getAwsProxyHandler(PetStoreSpringAppConfig.class); // Use the onStartup method of the handler to register the custom filter handler.onStartup(servletContext -> { FilterRegistration.Dynamic registration = servletContext.addFilter("CognitoIdentityFilter", CognitoIdentityFilter.class); registration.addMappingForUrlPatterns(EnumSet.of(DispatcherType.REQUEST), false, "/*"); }); // Send a fake Amazon API Gateway request to the handler to load classes ahead of time ApiGatewayRequestIdentity identity = new ApiGatewayRequestIdentity(); identity.setApiKey("foo"); identity.setAccountId("foo"); identity.setAccessKey("foo"); AwsProxyRequestContext reqCtx = new AwsProxyRequestContext(); reqCtx.setPath("/pets"); reqCtx.setStage("default"); reqCtx.setAuthorizer(null); reqCtx.setIdentity(identity); AwsProxyRequest req = new AwsProxyRequest(); req.setHttpMethod("GET"); req.setPath("/pets"); req.setBody(""); req.setRequestContext(reqCtx); Context ctx = new TestContext(); handler.proxy(req, ctx); } catch (ContainerInitializationException e) { // if we fail here. We re-throw the exception to force another cold start e.printStackTrace(); throw new RuntimeException("Could not initialize Spring framework", e); } }

Para maximizar las ventajas de SnapStart, recomendamos que precargue las dependencias e inicialice los recursos que contribuyen a la latencia de inicio en el código de inicialización en lugar de hacerlo en el controlador de funciones. Esto elimina de la ruta de invocación la latencia asociada a la carga pesada de clases, lo que optimiza el rendimiento de inicio con SnapStart.

Si no puede precargar las dependencias o recursos durante la inicialización, recomendamos que las precargue con invocaciones ficticias. Para ello, actualice el código del controlador de funciones, como se muestra en el siguiente ejemplo de la función tienda de mascotas del repositorio de Labs GitHub de AWS.

private static SpringLambdaContainerHandler<AwsProxyRequest, AwsProxyResponse> handler; static { try { handler = SpringLambdaContainerHandler.getAwsProxyHandler(PetStoreSpringAppConfig.class); // Use the onStartup method of the handler to register the custom filter handler.onStartup(servletContext -> { FilterRegistration.Dynamic registration = servletContext.addFilter("CognitoIdentityFilter", CognitoIdentityFilter.class); registration.addMappingForUrlPatterns(EnumSet.of(DispatcherType.REQUEST), false, "/*"); }); // Send a fake Amazon API Gateway request to the handler to load classes ahead of time ApiGatewayRequestIdentity identity = new ApiGatewayRequestIdentity(); identity.setApiKey("foo"); identity.setAccountId("foo"); identity.setAccessKey("foo"); AwsProxyRequestContext reqCtx = new AwsProxyRequestContext(); reqCtx.setPath("/pets"); reqCtx.setStage("default"); reqCtx.setAuthorizer(null); reqCtx.setIdentity(identity); AwsProxyRequest req = new AwsProxyRequest(); req.setHttpMethod("GET"); req.setPath("/pets"); req.setBody(""); req.setRequestContext(reqCtx); Context ctx = new TestContext(); handler.proxy(req, ctx); } catch (ContainerInitializationException e) { // if we fail here. We re-throw the exception to force another cold start e.printStackTrace(); throw new RuntimeException("Could not initialize Spring framework", e); } }

Para maximizar los beneficios de SnapStart, concéntrese en la organización eficiente del código y la administración de recursos dentro de sus funciones de Python. Como pauta general, realice tareas computacionales excesivas durante la fase de inicialización. Este enfoque elimina las operaciones que consumen mucho tiempo de la ruta de invocación, lo que mejora el rendimiento general de la función. Recomendamos que siga las siguientes prácticas recomendadas para implementar esta estrategia de manera efectiva:

  • Importe dependencias fuera del controlador de funciones.

  • Cree instancias boto3 fuera del controlador.

  • Inicialice las configuraciones o los recursos estáticos antes de invocar el controlador.

  • Considere la posibilidad de utilizar un enlace de tiempo de ejecución previo a la instantánea para tareas que consuman muchos recursos, como descargar archivos externos, precargar marcos como Django o cargar modelos de machine learning.

ejemplo Optimización de la función de Python para SnapStart
# Import all dependencies outside of Lambda handler from snapshot_restore_py import register_before_snapshot import boto3 import pandas import pydantic # Create S3 and SSM clients outside of Lambda handler s3_client = boto3.client("s3") # Register the function to be called before snapshot @register_before_snapshot def download_llm_models(): # Download an object from S3 and save to tmp # This files will persist in this snapshot with open('/tmp/FILE_NAME', 'wb') as f: s3_client.download_fileobj('amzn-s3-demo-bucket', 'OBJECT_NAME', f) ... def lambda_handler(event, context): ...

Para maximizar los beneficios de SnapStart, concéntrese en la organización eficiente del código y la administración de recursos dentro de sus funciones de Python. Como pauta general, realice tareas computacionales excesivas durante la fase de inicialización. Este enfoque elimina las operaciones que consumen mucho tiempo de la ruta de invocación, lo que mejora el rendimiento general de la función. Recomendamos que siga las siguientes prácticas recomendadas para implementar esta estrategia de manera efectiva:

  • Importe dependencias fuera del controlador de funciones.

  • Cree instancias boto3 fuera del controlador.

  • Inicialice las configuraciones o los recursos estáticos antes de invocar el controlador.

  • Considere la posibilidad de utilizar un enlace de tiempo de ejecución previo a la instantánea para tareas que consuman muchos recursos, como descargar archivos externos, precargar marcos como Django o cargar modelos de machine learning.

ejemplo Optimización de la función de Python para SnapStart
# Import all dependencies outside of Lambda handler from snapshot_restore_py import register_before_snapshot import boto3 import pandas import pydantic # Create S3 and SSM clients outside of Lambda handler s3_client = boto3.client("s3") # Register the function to be called before snapshot @register_before_snapshot def download_llm_models(): # Download an object from S3 and save to tmp # This files will persist in this snapshot with open('/tmp/FILE_NAME', 'wb') as f: s3_client.download_fileobj('amzn-s3-demo-bucket', 'OBJECT_NAME', f) ... def lambda_handler(event, context): ...

Para reducir el tiempo de carga del ensamblaje y la compilación justo a tiempo (JIT), considere invocar el controlador de funciones desde un enlace de tiempo de ejecución RegisterBeforeCheckpoint. Debido al funcionamiento de la compilación por niveles de .NET, obtendrá resultados óptimos si invoca el controlador varias veces, como se muestra en el siguiente ejemplo.

importante

Asegúrese de que la invocación de una función ficticia no produzca efectos secundarios no deseados, como el inicio de transacciones comerciales.

public class Function { public Function() { Amazon.Lambda.Core.SnapshotRestore.RegisterBeforeSnapshot(FunctionWarmup); } // Warmup method that calls the function handler before snapshot to warm up the .NET code and runtime. // This speeds up future cold starts after restoring from a snapshot. private async ValueTask FunctionWarmup() { var request = new APIGatewayProxyRequest { Path = "/heathcheck", HttpMethod = "GET" }; for (var i = 0; i < 10; i++) { await FunctionHandler(request, null); } } public async Task<APIGatewayProxyResponse> FunctionHandler(APIGatewayProxyRequest request, ILambdaContext context) { // // Process HTTP request // var response = new APIGatewayProxyResponse { StatusCode = 200 }; return await Task.FromResult(response); } }

Para reducir el tiempo de carga del ensamblaje y la compilación justo a tiempo (JIT), considere invocar el controlador de funciones desde un enlace de tiempo de ejecución RegisterBeforeCheckpoint. Debido al funcionamiento de la compilación por niveles de .NET, obtendrá resultados óptimos si invoca el controlador varias veces, como se muestra en el siguiente ejemplo.

importante

Asegúrese de que la invocación de una función ficticia no produzca efectos secundarios no deseados, como el inicio de transacciones comerciales.

public class Function { public Function() { Amazon.Lambda.Core.SnapshotRestore.RegisterBeforeSnapshot(FunctionWarmup); } // Warmup method that calls the function handler before snapshot to warm up the .NET code and runtime. // This speeds up future cold starts after restoring from a snapshot. private async ValueTask FunctionWarmup() { var request = new APIGatewayProxyRequest { Path = "/heathcheck", HttpMethod = "GET" }; for (var i = 0; i < 10; i++) { await FunctionHandler(request, null); } } public async Task<APIGatewayProxyResponse> FunctionHandler(APIGatewayProxyRequest request, ILambdaContext context) { // // Process HTTP request // var response = new APIGatewayProxyResponse { StatusCode = 200 }; return await Task.FromResult(response); } }

Prácticas recomendadas para redes

El estado de las conexiones que establece la función durante la fase de inicialización no está garantizado cuando Lambda vuelve a activar la función a partir de una instantánea. En la mayoría de los casos, las conexiones de red que establece un SDK de AWS se reanudan automáticamente. Recomendamos que siga las siguientes prácticas recomendadas para otras conexiones.

Restablezca las conexiones de red.

Restablezca siempre las conexiones de red cuando la función se reanude a partir de una instantánea. Se recomienda restablecer las conexiones de red en el controlador de funciones. Como alternativa, puede utilizar un enlace de tiempo de ejecución después de restaurar.

No utilice el nombre de host como identificador único del entorno de ejecución.

Se recomienda no utilizar un hostname para identificar el entorno de ejecución como un nodo o contenedor único en las aplicaciones. Con SnapStart, se utiliza una única instantánea como estado inicial para varios entornos de ejecución. Todos los entornos de ejecución devuelven el mismo valor hostname para InetAddress.getLocalHost() (Java), socket.gethostname() (Python) y Dns.GetHostName() (.NET). Para las aplicaciones que requieren una identidad de entorno de ejecución o un valor de hostname único, se recomienda generar un ID único en el controlador de funciones. O bien, utilice un enlace de tiempo de ejecución después de restaurar para generar un ID único y, a continuación, utilice el ID único como identificador del entorno de ejecución.

Evite vincular conexiones a puertos de origen fijos.

Se recomienda evitar vincular las conexiones de red a puertos de origen fijos. Las conexiones se restablecen cuando se reanuda una función a partir de una instantánea y las conexiones de red que están enlazadas a un puerto de origen fijo pueden fallar.

Evite utilizar la caché de DNS de Java.

Las funciones de Lambda ya almacenan en caché las respuestas de DNS. Si utiliza otra caché de DNS con SnapStart, es posible que se agoten los tiempos de espera de conexión cuando la función se reanude a partir de una instantánea.

La clase java.util.logging.Logger puede habilitar indirectamente la caché de DNS de la JVM. Para anular la configuración predeterminada, defina networkaddress.cache.ttl en 0 antes de inicializar logger. Ejemplo:

public class MyHandler { // first set TTL property static{ java.security.Security.setProperty("networkaddress.cache.ttl" , "0"); } // then instantiate logger var logger = org.apache.logging.log4j.LogManager.getLogger(MyHandler.class); }

Para evitar errores UnknownHostException en el tiempo de ejecución de Java 11, se recomienda establecer el valor networkaddress.cache.negative.ttl en 0. En Java 17 y tiempos de ejecución posteriores, este paso no es necesario. Puede establecer esta propiedad para una función de Lambda con la variable de entorno AWS_LAMBDA_JAVA_NETWORKADDRESS_CACHE_NEGATIVE_TTL=0.

Al deshabilitar la caché de DNS de la JVM, no se deshabilita la caché de DNS administrada de Lambda.

PrivacidadTérminos del sitioPreferencias de cookies
© 2025, Amazon Web Services, Inc o sus afiliados. Todos los derechos reservados.