Amazon web services VPC下Lambda函数的响应时间不一致

Amazon web services VPC下Lambda函数的响应时间不一致,amazon-web-services,aws-lambda,amazon-vpc,Amazon Web Services,Aws Lambda,Amazon Vpc,最近,我们开始探索AWS lambda技术,希望我们能够将所有的微服务变成无服务器的。这些服务目前正在生产环境中的EC2实例中运行。所以我们选了其中一个,试着让它成为lambda。在那里,我被看演出所困住了。我相信我做错了什么,需要你的帮助来解决这个问题。 我们有一个java应用程序,在Tomcat上的EC2实例中运行,它从同一VPC和同一区域下的另一个实例获取数据。请注意,这些服务器之间有几个来回调用。对Tomcat服务的单个请求所花费的时间在4到5秒之间,这是相当一致的。现在,当我们在Lam

最近,我们开始探索AWS lambda技术,希望我们能够将所有的微服务变成无服务器的。这些服务目前正在生产环境中的EC2实例中运行。所以我们选了其中一个,试着让它成为lambda。在那里,我被看演出所困住了。我相信我做错了什么,需要你的帮助来解决这个问题。 我们有一个java应用程序,在Tomcat上的EC2实例中运行,它从同一VPC和同一区域下的另一个实例获取数据。请注意,这些服务器之间有几个来回调用。对Tomcat服务的单个请求所花费的时间在4到5秒之间,这是相当一致的。现在,当我们在Lambda基础设施下运行相同的服务时,响应变得非常不一致(5到25秒)

在第一阶段,我没有将我们的VPC与lambda联系起来。我认为这可能是导致响应时间不一致的原因,因为在Lambda函数和我们的一个EC2实例之间有几个http请求。所以我把我们的VPC和Lambda联系起来,但遗憾的是看到了相同的响应时间。下面是我做的vpc配置。 1.我们只有一个VPC包含所有EC2实例。我通过AWS控制台将其与Lambda功能配置相关联。 2.我们在专有网络中有2个子网。vpc配置中给出了这两个子网。 3.我已经添加了分配给我的第二个EC2实例的安全组ID,我正在进行呼叫

我的理解是,如果我将VPC与Lambda函数关联,该函数将在同一VPC下的机器上运行。因此,我们应该在Lambda函数和相关EC2实例之间获得GBPS的LAN速度。但这可能不会发生。我们的Tomcat服务提供可预测的响应时间,因为它们位于同一VPC LAN上。 请注意,我是通过从客户端调用函数来直接测量函数响应时间的,到目前为止,两者之间没有API网关

以下是我的Lambda在部署10次后续调用后所花费的时间(以毫秒为单位): 16797, 17965, 10026, 5846, 7689, 5118, 4349, 9297, 4378, 11692

其中,Tomcat服务(在同一数据集中运行相同的代码)在随后的10次调用中花费的时间如下。 3597, 3568, 4009, 3808, 3585, 3859, 3576, 3657, 3444, 3440

请注意,对Tomcat服务的服务调用不会超过4秒。 “将Lambda与VPC关联”是否意味着Lambda程序与位于同一VPC上的其他EC2实例在同一LAN上运行?或者是通过互联网的安全连接

Edit1: 以下是您提出的所有要点的注释

  • 冷启动时间:我理解这个事实。我对此没有任何问题。如果Lambda空闲5分钟,则下一次呼叫将花费更多时间进行冷启动。但是我随后打了两秒钟的电话。如果我认为第一次通话的冷启动时间更长,那么后续通话也不会花费更少的时间。事实上,第二个电话比第一个电话花的时间多。如果我将基于服务器的响应与lambda响应进行比较,在本例中仅为三分之一。有什么解释吗

  • 指定的Lambda内存:我已将Lambda配置为使用最大可用内存(即1.5 GB)。因此,这不会导致问题

  • 埃尼:这对我来说是一件全新的事情,我对这方面的知识不多。从Lambda获取调用的EC2实例是c3.1。从AWS文档中,我看到这种情况下给出的最大网络接口是3。我们有没有办法调整它以适应演出?如果我们选择更大的实例,那么我能期望更好的性能吗

  • 地区:VPC和Lambda都在同一地区

  • 代码初始化:没有来自Lambda的数据库连接。我们将http端点从Lambda调用到承载少量服务的EC2盒

  • Edit2: 进一步观察。我创建了两个测试lambda,它们连接到我们VPC中的同一个EC2端点并获取一些数据

  • Lambda1:没有VPC关联。通过公共IP一次性调用EC2端点
  • Lambda2:启用VPC后,可以访问EC2实例的安全组。通过专用(子网)IP一次性调用EC2端点。 两者所需的时间相似。只有Lambda2的第一次运行(启用VPC)需要更长的冷启动时间。我预计响应时间将在Lambda2中下降,因为我们将客户机和服务置于同一个专有网络(应该相当于局域网)下。但事实并非如此。 我在同一vpc下的另一个EC2实例中运行的同一个java代码(作为一个简单的java应用程序),所花费的时间始终是Lambda1或Lambda2的1/3。 有没有什么方法可以让Lambda获得相同的响应时间?请帮忙
  • Edit3: 下面是我从Lambda或简单Java应用程序运行的代码

    public class Lambda implements RequestStreamHandler {
    @Override
    public void handleRequest(InputStream inputStream, OutputStream outputStream, Context context) throws IOException {
    try {
    JSONObject payload = (JSONObject) new JSONParser().parse(new InputStreamReader(inputStream, "UTF-8"));
    System.out.println("payload = " + payload);
    outputStream.write(Request.Get("http://" + (String)payload.get("ip") + "/api/xxx").
    execute().returnContent().toString()).getBytes());
    } catch (ParseException e) {
    e.printStackTrace();
    }
    }
    }
    

    有效负载中的ip作为Lambda1的公共ip(没有VPC)和Lambda2的私有或本地ip(启用VPC)从呼叫方发送。

    您所经历的被称为冷启动。此时必须配置底层AWS基础结构,并将函数放入内存。在专有网络中,由于提供弹性网络接口(ENI)所需的时间,问题通常更严重。由于Lambda将使容器在一段时间内保持可用和温暖,因此后续的一些调用会更快。您可以在AWS文档中找到更多信息。下面的链接也是相关的-

    此外,还有几个项目可以让您的lambda保持温暖。这里有一些不错的-


    具有VPC的Lambda意味着Lambda在同一组子网上运行