【问题标题】:AmazonS3.readObject() very slow from AWS lambdaAWS lambda 的 AmazonS3.readObject() 非常慢
【发布时间】: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


【解决方案1】:

这取决于您在笔记本电脑上运行该进程时配置的内存和 CPU 分配。这可能远高于 512 mb

【讨论】:

    【解决方案2】:

    从技术上讲,尽管它是公开托管的,但它必须遍历公共互联网才能到达位于该区域的 AWS 公共区域中的 S3。

    您可以迁移您的Lambda to be located inside your VPC,并添加VPC Gateway Endpoint for S3

    此外,您能否确认这是平均 Lambda 请求时间,而不仅仅是第一个请求?如果是这样,那可能是冷启动

    【讨论】:

      猜你喜欢
      • 2021-12-17
      • 2018-03-16
      • 2018-12-24
      • 2018-08-02
      • 2015-11-23
      • 1970-01-01
      • 2020-12-22
      • 2016-05-16
      • 1970-01-01
      相关资源
      最近更新 更多