请在2024 状态 Clojure 调查中分享您的想法!

欢迎!请查阅关于页面了解更多关于此网站的工作方式。

+2
工具

我正在阅读这篇文章:https://mikhail.io/serverless/coldstarts/aws/languages/ 并注意到即使是 Go 语言,冷启动时间通常也在 250ms 到 450ms 之间。

让我惊讶的是,即使是“快速启动”的语言在遇到 AWS Lambda 冷启动时仍然如此缓慢。所以我一直在想 Clojure 究竟会慢多少?由于 Lambda 冷启动本身就已经带有一个相当大的开销,如果我们从 Go 的平均 300ms 提高到 Clojure 的平均 600ms,实际上可能并不那么重要,因为我们已经处于“用户能感知到的慢”的范围之内。

但随后我在网上搜索,却找不到任何使用 Clojure 进行基准测试的实际结果。我只能找到 ClojureScript 或 GraalVM 本地图像 Clojure 的基准测试。

有人可以对 AWS Lambda 冷启动进行 Clojure 基准测试(理想情况下是最新的,因为 AWS 在过去几年中已经大幅改善了他们的 JVM 冷启动)。

1 答案

+1

你好

您可以在我的博客文章中找到一些比较 GraalVM 本地图像的基准测试结果,该文章在我的 dev.solita.fi 博客中。特别是查看“Clojure 在 JVM AWS Lambda 中运行”这一章。

https://dev.solita.fi/2018/12/07/fast-starting-clojure-lambdas-using-graalvm.html

我还对常规JVM进行了基准测试。遗憾的是,Clojure启动速度非常慢,并且随着项目的增大,启动速度会大幅下降。慢速启动主要是由于JVM类加载引起的。遗憾的是,Clojure会生成大量的类,因为每个Clojure变量定义和函数都会编译成类。

不使用GraalVM,你无法看到Clojure启动时间低于2秒。

by
结果很有趣。我想知道为什么这个程序在Lambda上的运行时间比在普通电脑上长这么多。我的意思是,它只是返回“Hello World!”而已。在我的10年前旧的笔记本电脑上,这肯定会在1秒内完成。

那个deflambda可能是原因吗?
by
在Fargate上运行时,启动时间也不会低于1秒。我在AWS上构建和运行Clojure已有多年经验,因此这些启动时间并不意外。

使用我的MacBook Pro (15英寸,2017)运行最小的helloworld uberjar只需要1.3-1.5秒。Lambda环境的CPU未知(只能设置内存),但据我所知,它最多有两条线程。Clojure启动是CPU密集型操作,这可能是为什么Lambda比你的笔记本电脑快。

Deflambda只是简单地生成Lambda运行所需的类。它不会给测试添加任何开销。
by
是的,但我还是想知道是否还有其他问题。例如,工件的大小,需要下载Clojure、Spec等。

例如,我认为Python、JS、Ruby和Java库已经包含在Lambda运行时中。因此,它们不必下载这些并支付下载和解压缩的费用。这可能不适用于Clojure,也可能这就是启动时间增长的原因?

本地化代码可以对整个字节码进行摇树,并在此方面减少工件大小。

并不是说数据是错误的,只是感觉我们这里没有找到真正的根本原因,因为旧电脑上的类加载仍然不是那么慢。例如,在我2013年的Dell XPS上,Hello World Clojure应用程序启动只需要不到2秒钟。
by
在我的经验中,工件大小并不是启动延迟的原因,因为Python Lambda在工件中捆绑大型库时,并不会出现任何可察觉的减速。

这篇帖子对Clojure启动进行了全面解释。
http://clojure-goes-fast.com/blog/clojures-slow-start/

正如你所阅读的那样 - Clojure的启动至少需要一秒钟,这是目前无法避免的。Lambda环境在初始化时增加了几百毫秒,这可以通过比较在不同运行时中的冷启动和热启动来测试。
by
我知道Clojure初始化速度慢,但即使如此,Hello World应用程序的时间不应超过2秒,尤其是在具有3GB内存的Lambda上。我仍然想弄清楚这一点。正如你提供的链接所示,Clojure初始化需要1秒钟。在我的旧笔记本电脑上,我有一个1.7 GHz的双核i7和4 GB的RAM:http://www.notebookreview.com/notebookreview/dell-xps-13-review-an-ultrabook-for-business-pros/2/ Clojure Hello World应用程序仍然不到2秒钟。

可能是JVM Lambda使用的,或者是一些其他Lambda特有的奇怪之处。了解到这一点可能有助于改善这种情况。也许3 GB的Lambda运行的是非常受限的CPU,或者拥有非常慢的磁盘I/O,或者类似的东西。

感谢所有详细信息和进行基准测试。
欢迎来到Clojure问答,在这里你可以向Clojure社区的成员提问并接收答案。
...