【发布时间】:2020-05-03 00:19:27
【问题描述】:
我正在从 AWS lambda 读取位于 S3 中的 1.5 MB 文件:
public class AwsFileStorage {
private static final AmazonS3 amazonS3;
static {
var builder = AmazonS3ClientBuilder.standard();
builder.setRegion(MY_REGION);
amazonS3 = builder.build();
}
public InputStream read(String filekey) {
var initTime = Instant.now(); // Timer ON
var s3Object = amazonS3.getObject("bucket-name", filekey);
var endTime = Instant.now(); // Timer OFF
var millis = Duration.between(initTime, endTime).toMillis();
System.out.println(millis);
return s3Object.getObjectContent();
}
}
当我直接从 AWS 控制台在 512 MB AWS lambda(在我的 S3 的同一区域)上运行此代码时,我得到:
3642 毫秒
但是当我运行相同的代码时,也会从 AWS S3 获取文件:
486 毫秒
我不明白,AmazonS3.getObject() 在我的笔记本电脑上的执行速度怎么可能比在 AWS 基础设施上执行的 lambda 快 10 倍,即使文件也托管在同一个 AWS 基础设施中 -同一地区。
这个延迟有什么原因吗? 有没有其他更优化的方式从 AWS lambda 读取托管在 S3 中的文件?
提前致谢
【问题讨论】:
-
你如何测量时间?它可能包括其初始配置,在这种情况下它会很慢。随着 lambda 重用其执行上下文,后续执行通常更快?
-
我同意@marcin .. 可能在 10 个循环中运行它。理想情况下,只有第一个应该需要时间,而其他 9 个应该超级快。 ..然后查看平均时间..也请为我的学习发布结果。
-
@Marcin 您可以在代码中看到我如何测量时间。我只测量调用 amazonS3.object() 所需的时间。我认为供应时间不会影响这里。另请注意,我的 AmazonS3 客户端是静态的,因此当这行代码运行时,客户端已经加载。
-
然后可以尝试更多的内存。 512 MB 只会给你 0.28 个 vCPU。如果您想要 1 个 vCPU 的功率,则需要 1792 MB 的内存。
-
当然,延迟来自低 vCPU,因为我的 lambda 的最大消耗 RAM 只有 185 MB。
标签: java amazon-web-services amazon-s3