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

你好

您可以在我的博客帖子 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,您看不到低于2秒的启动时间。

有趣的结果。我想知道为什么这个程序在Lambda上运行时比在普通计算机上要花费更长的时间。我的意思是,它所做的只是返回Hello World!在我的十年老笔记本电脑上,这的确不到1秒。

这是否意味着deflambda导致了这种情况?
在Fargate中运行时,启动时间也不会低于1秒。我在AWS上构建和运行Clojure已有多年经验,因此这些启动时间并不出人意料。

在运行在我的MacBook Pro(15英寸,2017)上时,极小的helloworld uberjar运行并退出的时间在1.3-1.5秒之间。Lambda环境的CPU未知(只能设置内存),但据我所知,它最多有两个线程。Clojure的启动是一项耗时的CPU操作,这或许可以解释为什么它在你笔记本电脑上比在AWS Lambda上快。

Deflambda仅是一个简单的宏,它生成Lambda运行必要的类。它不会给测试增加任何开销。
是的,但我还在想是否还有其他因素。比如,工件的大小,以及需要拉取Clojure、Spec等。

例如,我会假设Python、JS、Ruby和Java库已经包含在Lambda运行时中。因此,不需要下载这些库,也没有下载和解压的成本。这可能是Clojure的情况,也许这就是为什么它增加了这么多启动时间的原因?

例如,Native image对整个字节码进行tree-shaking,这可能会在此方面显著减少工件的大小。

我不是说数据是错误的,只是我们似乎没有找到真正的根本原因,因为老式计算机上的类加载速度仍然不是很慢。例如,在我的2013年Dell XPS上,hello world clojure程序启动时间不到2秒。
在我的经验中,程序件的大小并不是启动延迟的原因,因为 Python Lambda 在将大型库打包为一个程序件时,并不会显著变慢。

本篇博客是关于 Clojure 启动过程的详尽解释
http://clojure-goes-fast.com/blog/clojures-slow-start/

如您所读——Clojure 的启动至少需要一秒,目前无法避免。Lambda 环境在初始化时会增加几百毫秒,这可以通过比较不同运行环境的冷启动和热启动来测试。
我了解到 Clojure 初始化较慢,但即便如此,一个简单的 "Hello World" 程序也不应该超过 2 秒,尤其是在一个拥有 3GB 内存的 Lambda 上。我仍然很感兴趣,想要探究其中的原因。正如你提供的链接所示,Clojure 初始化需要 1 秒。在我的旧笔记本电脑上,有个双核 1.7 GHz 的 i7 处理器,4GB 内存:http://www.notebookreview.com/notebookreview/dell-xps-13-review-an-ultrabook-for-business-pros/2/ Clojure "Hello World" 应用程序启动时间仍然不到 2 秒。

这可能是使用的 JVM Lambda 或 Lambda 的一些特定问题。了解这一点可能有助于改善情况。也许 3GB 的 Lambda 正在运行非常有限的 CPU,或者有非常慢的硬盘 IO,或者类似的情况。

感谢您提供详细信息并做了这个基准测试。
欢迎来到 Clojure Q&A,您可以在这里提问,并从 Clojure 社区成员那里获得答案。
...