Google cloud platform 谷歌云功能Java 11(测试版)运行时-性能问题

Google cloud platform 谷歌云功能Java 11(测试版)运行时-性能问题,google-cloud-platform,google-cloud-functions,java-11,Google Cloud Platform,Google Cloud Functions,Java 11,我已经使用Java11(Beta)运行时创建了一个新的云函数来处理静态站点的HTML表单提交。这是一个简单的三字段表单(姓名、电子邮件、消息)。不涉及文件上传。该函数主要做两件事: 使用BitBucket创建拉取请求 使用SendGrid向我发送电子邮件 注意:它也会验证recaptcha,但我已经在测试中禁用了它 在我的本地机器(基本型号2019 Macbook Pro 13)上运行该功能大约需要3秒。我位于东南亚。部署到Google Cloud us-central1上的相同功能大约需要25

我已经使用Java11(Beta)运行时创建了一个新的云函数来处理静态站点的HTML表单提交。这是一个简单的三字段表单(姓名、电子邮件、消息)。不涉及文件上传。该函数主要做两件事:

  • 使用BitBucket创建拉取请求
  • 使用SendGrid向我发送电子邮件
  • 注意:它也会验证recaptcha,但我已经在测试中禁用了它

    在我的本地机器(基本型号2019 Macbook Pro 13)上运行该功能大约需要3秒。我位于东南亚。部署到Google Cloud us-central1上的相同功能大约需要25秒(速度慢8倍).几年来,我在美国中部地区的GAE Java 8运行时上运行的代码与Servlet上运行的代码几乎相同。包括recaptcha验证和发送电子邮件在内,大约需要2-3秒。我试图将其移植到云功能,但即使没有recaptc,云功能的性能也要慢10倍左右ha验证

    相比之下,云函数在256MB/400GHz实例上运行,而我的GAE Java 8运行时在F1(128MB/600GHz)实例上运行。该函数仅使用约75MB的内存。该函数配置为接受未经验证的请求

    我注意到,即使是像:
    stringc=a+b;
    这样的基本字符串连接,云函数也需要100毫秒的时间。我对调用进行了计时,一个简单的字符串连接大约需要1.5-2.0秒

    此外,向HTTPUrlConnection输出流写入一条小消息(~1KB)并读回响应大约需要10秒(是秒)

    云函数显然有点问题。由于我的原始代码是在GAE Java 8运行时上运行的,所以我很容易将其移植到云函数,只需稍作修改。否则,我会选择NodeJS运行时。在本地计算机上运行此函数时,我也没有看到任何性能问题

    Email from = new Email(fromEmail, fromName);
    Email to = new Email(toEmail, toName);
    Email replyTo = new Email(replyToEmail, replyToName);
    Content content = new Content("text/html", body);
    
    Mail mail = new Mail(from, subject, to, content);
    mail.setReplyTo(replyTo);
    SendGrid sg = new SendGrid(SENDGRID_API_KEY);
    Request sgRequest = new Request();
    Response sgResponse = null;
    try {
        sgRequest.setMethod(Method.POST);
        sgRequest.setEndpoint("mail/send");
        sgRequest.setBody(mail.build());
        sgResponse = sg.api(sgRequest);            
    } catch (IOException ex) {
        throw ex;
    }
    

    有人能帮我解释一下性能缓慢的问题吗?

    您所看到的几乎肯定是由于创建新服务器实例来处理请求所带来的“冷启动”成本。这是所有类型的云功能都存在的问题,如下所述:

    本文档中的一些建议围绕所谓的冷启动展开。函数是无状态的,执行环境通常是从头开始初始化的,这称为冷启动。冷启动可能需要花费大量时间来完成。避免不必要的冷启动和简化流程是最佳做法在任何可能的范围内(例如,通过避免不必要的依赖性)冷启动过程

    我希望JVM语言有更长的冷启动时间,因为除了服务器实例本身之外,初始化JVM所需的时间也更长

    除上述建议外,有效缓解冷启动的方法非常少。这些方法的效果不如你想象的那么好。如果你想搜索,互联网上有很多关于这方面的讨论


    请记住,Java运行时也处于测试阶段,因此您可以期待将来的改进。其他运行时也发生了同样的情况。

    您是对的。这是我第一次使用GCF。我想我检查了冷启动时间,但显然没有。我重新测试了它,第二个请求在2.2秒内完成。我只得到about 25条评论/周,每个请求的15-20秒冷启动延迟是不可接受的(假设它们分散几个小时)。我已经在使用cron技巧通过每5分钟ping一次来保持我的GAE实例的活动。我将使用GCF尝试同样的方法并查看。我原以为GCF至少可以保持一个实例的活动,但我错了。非常感谢您的帮助。我希望能对您有所帮助
    Email from = new Email(fromEmail, fromName);
    Email to = new Email(toEmail, toName);
    Email replyTo = new Email(replyToEmail, replyToName);
    Content content = new Content("text/html", body);
    
    Mail mail = new Mail(from, subject, to, content);
    mail.setReplyTo(replyTo);
    SendGrid sg = new SendGrid(SENDGRID_API_KEY);
    Request sgRequest = new Request();
    Response sgResponse = null;
    try {
        sgRequest.setMethod(Method.POST);
        sgRequest.setEndpoint("mail/send");
        sgRequest.setBody(mail.build());
        sgResponse = sg.api(sgRequest);            
    } catch (IOException ex) {
        throw ex;
    }