Google Cloud Functions Java 11(测试版)运行时 - 性能问题

2024-02-20

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

  1. 使用 BitBucket 创建拉取请求
  2. 使用 SendGrid 向我发送电子邮件

注意:它还验证验证码,但我已禁用它进行测试。

该函数在我的本地计算机(基本型号 2019 Macbook Pro 13")上运行大约需要 3 秒。我位于东南亚。部署到 Google Cloud us-central1 时,相同的函数大约需要 25 秒(慢 8 倍) 。我在生产中运行了几乎相同的代码,作为 GAE Java 8 运行时上的 Servlet 的一部分,也在美国中部地区运行了几年。大约需要 2-3 秒,包括 recaptcha 验证和发送电子邮件。我正在尝试将其移植到 Cloud Function,但即使没有 recapcha 验证,Cloud Function 的性能也会慢 10 倍左右。

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

我注意到即使是基本的字符串连接,例如:String c = a + b;在云函数上花费了 100 毫秒。我对调用进行了计时,将大约 15 个字符串连接成一个字符串大约需要 1.5-2.0 秒。

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

/* Writing < 1KB to output stream takes about 4-5 secs */
wr = new OutputStreamWriter(con.getOutputStream());
wr.write(encodedParams);
wr.flush();
wr.close();

/* Reading response also take about 4-5 secs */
String responseMessage = con.getResponseMessage();

同样,下面的 SendGrid 代码还需要 10 秒来发送电子邮件。在我的本地机器上大约需要 1 秒。

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;
}

云功能显然有问题。由于我的原始代码在 GAE Java 8 运行时上运行,因此我可以轻松地将其移植到 Cloud Function,只需进行一些小的更改。否则我会选择 NodeJS 运行时。在本地计算机上运行此函数时,我也没有看到任何性能问题。

有人可以帮助我解决性能缓慢的问题吗?


您所看到的几乎可以肯定是由于与创建新服务器实例来处理请求相关的“冷启动”成本造成的。这是所有类型的 Cloud Functions 都存在的问题,如文档 https://cloud.google.com/functions/docs/bestpractices/tips:

本文档中的一些建议主要围绕所谓的冷启动。函数是无状态的,执行环境往往从头开始初始化,这称为冷启动。冷启动可能需要大量时间才能完成。最佳实践是避免不必要的冷启动,并尽可能简化冷启动过程(例如,通过避免不必要的依赖性)。

我预计 JVM 语言的冷启动时间会更长,因为除了服务器实例本身之外,初始化 JVM 也需要花费大量时间。

除了上述建议之外,几乎没有什么办法可以有效缓解冷启动。努力保温功能 https://stackoverflow.com/questions/51782742/how-can-i-keep-google-cloud-functions-warm并不像你想象的那么有效。如果你想搜索的话,网上有很多关于这个的讨论。

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Google Cloud Functions Java 11(测试版)运行时 - 性能问题 的相关文章

随机推荐

  • Haste 模块命名冲突:使用 AWS 服务响应本机应用程序(Amplify 项目)

    我已经开始使用 React Native 项目 之前是使用本机代码 我想添加 Amazon Lex 因此请按照链接中的以下步骤操作 https aws amplify github io docs js interactions https
  • 检查 pthread 互斥体是否被锁定或解锁(线程锁定自身之后)

    我需要查看 if 语句中互斥体是否被锁定或解锁 所以我像这样检查 if mutex id 2 do stuff 但是当我检查 gcc 时 出现以下错误 error invalid operands to binary have pthera
  • 如何正确设置树视图行前景色和背景色

    我在设置 ttk Treeview 的前景色和背景色时遇到问题 我尝试过使用 tag configure 但这似乎也不起作用 我有一些模型代码 如下 我用它来解决这个问题 可以更改标题颜色 但不能更改行 不确定我做错了什么 from tki
  • Objective c “你忘记嵌套 alloc 和 init 了吗?”

    我刚刚开始攀爬 Objective C 学习曲线 使用 Nerd Ranch iOS 编程书 根据我从其他语言中了解到的有关在一行中 嵌套 多个执行的信息 我认为我可以更改 NSString descriptionString NSStri
  • 返回很大范围内的非重复随机值

    我想要一个函数 它可以从一组 n 个整数 0 到 n 1 中生成 k 个伪随机值 而不重复任何先前的结果 k小于或等于n O n 内存不可接受由于尺寸较大n以及我需要重新洗牌的频率 这些是我到目前为止考虑过的方法 Array 通常 如果我想
  • 如何在.NET 2.0 ListView 中全选/全选?

    在不使用的情况下选择列表视图中的所有项目或不选择任何项目的好方法是什么 foreach ListViewItem item in listView1 Items item Selected true or foreach ListViewI
  • 在 Visual Studio 2017 中的类图中创建聚合和组合

    我正在考虑在 Visual Studio 中创建类图 我注意到工具箱似乎只允许类之间的关联关系 是否可以在类图中创建更强的关系 即聚合和组合关系 另外 是否可以从代码自动创建类图 好问题 首先 Visual Studio VS 类设计器不是
  • boost::process 异步 IO 示例不起作用?

    以下程序 include
  • 如何在 Eclipse 调试视角中识别线程?

    我正在开发一个具有一些线程的 Java 应用程序 我在控制台中打印 threadId 例如 17 18 19 等 但是当我打开调试透视图时 我有这个 调试 窗口 最左上角的窗口 它显示当前线程 但它们使用 Thread 2 thread 3
  • 强化学习+优化:如何做得更好?

    我正在学习如何使用强化学习进行优化 我选择的问题是最大匹配 https en wikipedia org wiki Maximum cardinality matching在二分图中 因为我可以轻松计算出真正的最优值 回想一下 图中的匹配是
  • 从页面基类查找页面中的控件

    希望你周五过得愉快 好吧 这是我的问题 我的所有 ASPX 页面都继承自名为 BasePage 的基类 BasePage 继承自 System Web UI Page 现在 如何从我的页面库访问 设置我的 aspx 页面中的控件 我试过这个
  • 匹配完全限定类名的正则表达式

    在文本中匹配完全限定的 Java 类名的最佳方式是什么 例子 java lang Reflect java util ArrayList org hibernate Hibernate Java 完全限定类名 假设为 N 具有以下结构 N
  • DDD:用户聚合根与其他聚合中几乎所有实体之间的一对多关系

    我有以下 DDD 场景 分为以下聚合 User 各位朋友 用户协会 文件 供用户上传 画廊 文件分组 消息 用户通信 群组 用户可以创建并且其他成员可以加入 GroupMessages 发送给组中所有成员的消息 群组论坛 群组成员可以讨论各
  • 将额外参数添加到 $cordovaFileTransfer.upload

    我在用 cordovaFileTransfer upload 将图片从设备上传到我的服务器 在文档中它说它排除了这些参数 server filePath options 我需要传递一些额外的自定义参数 比如user id 例如 有谁知道是否
  • 从水晶报表中的路径加载动态图像

    我想在我的报告中显示图像 我将图像路径保存在我的 sqlserver 数据库中 现在我想从路径加载图像 我搜索整个互联网并尝试所有指导 我首先将图像插入到我的报告中 然后之后我去 gt Format Editor gt picture gt
  • Linux 中的独立 Python 应用程序

    如何在 Linux 中分发独立的 Python 应用程序 我想我可以理所当然地认为任何现代发行版中都存在最新的 Python 解释器 问题在于处理那些不属于标准库的库 即wxPython scipy python cryptographic
  • 内联定义函数与非内联函数有什么区别?

    我正在读这本书计算机程序的结构和实现 http mitpress mit edu sicp full text book book Z H 4 html在其中一章中 有一些代码用于计算数字的阶乘 define factorial n fac
  • 如何处理“表达式在检查错误后已更改”的特殊情况

    关于这个特定错误 有很多值得阅读的内容 以及一些适用于它所解决的特定实现的解决方案 我不知道它如何适用于我的 我正在根据 FormGroup 是否有效来更改材质扩展面板的背景颜色 我在某些 FormGroup 上有一些复选框表单控件 可以切
  • 如何在 Alexa 中使用带有意图确认的意图链?

    我正在尝试混合对话管理和意图链 我已禁用自动委派 但我被困在 当用户填写所有槽值时 我使用意图确认并提示他数据是否正确 如果用户说 否 我想出于同样的目的重新启动对话管理 但我得到的错误是 指令 Dialog Delegate 只能在对话框
  • Google Cloud Functions Java 11(测试版)运行时 - 性能问题

    我使用 Java 11 测试版 运行时创建了一个新的 Cloud Function 来处理静态站点的 HTML 表单提交 这是一个简单的 3 字段表单 姓名 电子邮件 消息 不涉及文件上传 该函数主要做两件事 使用 BitBucket 创建