AWS Lambda中的S3客户端初始化缓慢

y

我目前正在研究用Java编写的AWS Lambda函数。它需要从S3获取对象,因此,我设置了IAM角色,并在Lambda的处理程序中构建了S3客户端:

import com.amazonaws.services.lambda.runtime.Context;
import com.amazonaws.services.lambda.runtime.RequestHandler;
import com.amazonaws.services.s3.AmazonS3;
import com.amazonaws.services.s3.AmazonS3ClientBuilder;

public class Example implements RequestHandler<Void, Void> {

    @Override
    public Void handleRequest(Void nothing, Context ctx) {
        long start = System.currentTimeMillis();
        AmazonS3 amazonS3 = AmazonS3ClientBuilder.defaultClient();
        ctx.getLogger().log("Creating S3 client took " + (System.currentTimeMillis() - start) + "ms");
        ...
        return null;
    }
}

但是,由于使用AmazonS3ClientBuilder速度非常慢,因此在向该函数分配192MB时,log语句会打印出以下时序:

Creating S3 client took 13541ms
Creating S3 client took 16482ms
Creating S3 client took 13617ms
Creating S3 client took 16380ms

即使将内存增加到3008MB以获取最大处理能力(AWS为Lambdas分配与内存成正比的CPU能力),获取客户端仍需要1-2秒:

Creating S3 client took 1413ms
Creating S3 client took 1170ms
Creating S3 client took 1528ms
Creating S3 client took 1394ms

这些时间是在冷启动场景中记录的,我正在缓存AmazonS3实例以供后续请求使用,但是在不热的Lambda上构建一个S3客户端可能要花费16秒以上,这似乎非常极端。

我是否滥用了AmazonS3ClientBuilder,可能是由于未覆盖某些默认值而导致性能下降?如何加快客户端初始化?

y

适用于Java 2.0AWS开发工具包于11月发布。基本上,这是对1.x版的重写,并且似乎已经改善了很多性能。从问题中迁移代码以使用新的SDK将为我们提供类似于以下内容:

import com.amazonaws.services.lambda.runtime.Context;
import com.amazonaws.services.lambda.runtime.RequestHandler;
import software.amazon.awssdk.services.s3.S3Client;

public class Example implements RequestHandler<Void, Void> {

    @Override
    public Void handleRequest(Void nothing, Context ctx) {
        long start = System.currentTimeMillis();
        S3Client s3Client= S3Client.create();
        ctx.getLogger().log("Creating S3 client took " + (System.currentTimeMillis() - start) + "ms");
        ...
        return null;
    }
}

为该功能分配192MB时:

Creating S3 client took 9380ms
Creating S3 client took 9719ms
Creating S3 client took 10098ms
Creating S3 client took 9519ms

为该功能分配3008MB时:

Creating S3 client took 884ms
Creating S3 client took 873ms
Creating S3 client took 886ms
Creating S3 client took 877ms

基于这些粗略的数字,使用SDK版本2时,在冷启动方案中创建S3客户端的时间减少了三分之一以上。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何关闭AWS S3客户端连接

AWS S3事件-客户端标识

访问客户端的 AWS S3 存储桶

在.NET Core中配置AWS S3客户端

为什么我们需要在 AWS S3 Java 客户端中 setReadLimit(int)

使用客户端加密的AWS S3数据保护

AWS S3客户端竞争条件解决方案

使用AWS S3 Java客户端获取目录和对象元数据

用于连接到 s3 客户端的 aws 配置文件

Laravel 5 Amazon AWS S3错误:客户端错误:403 RequestTimeTooSkewed

如何将文件从AWS S3下载到客户端设备?

使用KMS的AWS S3客户端加密-区域被忽略

Java中的AWS Lambda字节流客户端

NameError(未初始化的常量Paperclip :: Storage :: S3 :: AWS):

通过PHP SDK的S3客户端初始化错误

AWS Lambda模块初始化错误

.NET中具有KMS的AWS S3客户端加密在传输的最后一部分上发出ProtocolViolationException

NodeJs:将存储在 AWS S3 上的图像提供给客户端 img 标签

AWS CLI S3调用HeadObject操作时发生客户端错误(403):禁止

使用AWS客户端仅从单个目录复制s3文件(非递归)

如何使用boto3 RDS客户端python在AWS Lambda中运行RDS SQL Server选择查询?

Rails回形针和aws s3集成错误“未初始化的常量回形针:: Storage :: S3 :: Aws”

React App 调用 `aws s3 sync` 将客户端本地文件夹上传到 s3

RDS,AWS Lambda,App客户端-设置类型

AWS Lambda代理-客户端未接收标头

在PHP客户端中无法获得AWS Lambda函数响应

.Net RabbitMQ 客户端是否在 .Net Core 2.0 中工作。AWS Lambda 函数?

如何在 AWS Lambda 中设置环境变量或使用即时客户端库

如何使用AWS Lambda中的websocket将响应发送回客户端