2024 Clojure 状态调查! 中分享您的观点。

欢迎!请查看关于页面以获取更多关于此的工作方式的信息。

+2
Tools

我在阅读这篇文章: 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

你好

您可以在dev.solita.fi的博客文章中找到一些比较GraalVM本地图像的基准测试。特别关注“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 秒。

有趣的结果。我想知道为什么这个程序在 Lambda 上的运行时间比在普通电脑上要长。我的意思是,它只做了一件返回 "Hello World!" 的事情。在我的 10 年老笔记本电脑上,这肯定会在 1 秒以内启动。

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

以最小化的 "helloworld" uberjar 格式在我的 MacBook Pro (15 英寸,2017) 上运行和退出只需要 1.3 - 1.5 秒。Lambda 环境的 CPU 未知(只能设置内存),但据我所知,它最多有两个线程。Clojure 的启动是 CPU 密集型操作,这或许可以解释为什么它在您的笔记本电脑上比 AWS Lambda 上更快的启动时间。

Deflambda 只是一个简单的宏,它为 Lambda 运行生成必要的类。它不会产生任何测试开销。
当然,但仍然,我怀疑是否还有其他因素在起作用。比如工件的大小,需要下载 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秒,尤其是在内存为3G的Lambda上。我对彻底了解这一点仍然很感兴趣。正如您提供的链接所示,Clojure初始化需要1秒钟。在我旧的笔记本电脑上,我有一个1.7 GHz的酷睿i7和4GB的RAM: http://www.notebookreview.com/notebookreview/dell-xps-13-review-an-ultrabook-for-business-pros/2/ Clojure Hello World应用程序的启动时间仍低于2秒。

可能是Lambda使用的JVM或某些其他特定于Lambda的特性。了解这些信息可以帮助改善状况。也许3GB Lambda正在运行非常受限的CPU,或具有非常慢的磁盘I/O,或类似的情况。

感谢您提供所有细节以及进行基准测试。
欢迎来到Clojure问答社区,您在这里可以提问并获得Clojure社区成员的回答。
...