请在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,您使用 Clojure 不会看到小于 2 秒的启动时间。

by
有趣的结果。我想知道为什么这个程序在 Lambda 上的运行时间要比在正常计算机上长这么多。我的意思是,它只做了一件事,就是返回 "Hello World!"。在我的十年笔记本电脑上,这肯定会在一秒内启动。

这个 deflambda 是否应该负责?
by
在使用 Fargate 运行时,您也不会看到小于 1 秒的启动时间。我有很多年构建和运行 AWS 上的 Clojure 的经验,因此这些启动时间并不令人意外。

使用我的 MacBook Pro (15 英寸,2017 型号) 运行和使用最少的 "helloworld" uberjar,运行和退出时间为 1.3-1.5 秒。Lambda 环境的 CPU 未知(只能设置内存),但据我所知,它最多有两个线程。Clojure 的启动是 CPU 密集型操作,这可能是它在您的笔记本电脑上比在 AWS Lambda 上运行得更快的原因。

Deflambda 只是一个简单的宏,它生成 Lambda 运行所需的必要类。它不会给测试带来任何开销。
by
是的,但是我还是在想,可能还有其他事情在发生。比如工件的大小,必须下载 Clojure、Spec 等。

例如,我会假设 Python、JS、Ruby 和 Java 库已经打包在 Lambda 运行时内部。因此,它们不必下载这些库,也不必支付下载和解压缩的成本。这可能对 Clojure 不适用,可能这就是它添加了大量启动时间的原因?

例如,本地化图像会进行整个字节码的摇树(tree-shaking),并可能在此方面减少工件大小。

我不是说数据是错误的,只是我们似乎没有找到真正的根本原因。因为旧计算机上的类加载并不慢。例如,在我的 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内存: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,或者磁盘I/O真的非常慢,或者类似的问题。

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