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

欢迎!有关此如何工作的一些更多信息,请参阅关于页面。

+2
工具

我在阅读这篇文章:https://mikhail.io/serverless/coldstarts/aws/languages/,注意到即使是Go语言,冷启动通常也需要大约250毫秒到450毫秒。

令我惊讶的是,“快速启动”的语言在触发AWS Lambda的冷启动时竟然如此慢。所以我一直在想,Clojure实际上会慢到什么程度?由于Lambda的冷启动本身就有一个相当大的开销,如果我们从Go语言的平均300毫秒到Clojure的平均600毫秒,实际上可能并不是那么重要,因为我们已经属于“用户可能会注意到”的速度范围。

但我后来在网上搜索了一下,却找不到任何使用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!在我的10年前的笔记本上,这肯定会低于1秒。

难道那个deflambda发挥了作用吗?
在Fargate上运行时,启动时间也不会低于1秒。我在AWS上构建和运行Clojure已有多年经验,因此这些启动时间并不令人意外。

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

deflambda只是一个简单的宏,它为Lambda运行生成必要的类。它不会给测试带来任何开销。
没错,但还是要看看是否还有什么其他原因。比如工件大小,必须拉取Clojure,Spec等。

例如,我假设Python、JS、Ruby和Java库已经捆绑在Lambda运行时中。因此,它们不需要下载这些库,也不需要支付下载和解压缩的费用。这可能不是Clojure的情况,这可能是它增加了这么多启动时间的原因。

例如,本地映像会对整个字节码进行tree-shaking,也可能在这个方面减少工件大小。

不是在说数据错误,只是感觉在这里没有找到真正的根本原因,因为旧电脑上的类加载仍然不是很慢。以我的2013年款的戴尔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秒。在我老式的笔记本电脑上,我有一个双核i7处理器,频率为1.7 GHz,4GB的RAM: 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问答社区,在这里您可以提出问题,并从Clojure社区成员那里获得答案。
...