在2018年,Oracle宣布了GraalVM 1.0版本。
GraalVM是一种通用虚拟机,用于运行以JavaScript,Python,Ruby,R,基于JVM的语言(例如Java,Scala,Groovy,Kotlin,Clojure)以及基于LLVM的语言(例如C和C ++)编写的应用程序。 [资源]
对我而言,最有趣的功能之一是针对基于JVM的应用程序编译为本机二进制文件(在GraalVM中通常称为本机映像)。 Native Image意味着编译将是独立的,不需要JVM(例如C,C ++或Golang),但需要权衡(JIT与AOT)和限制。
Spring框架是JVM世界中最成熟,最流行的框架之一,由于我前面提到的局限性,当前不具有本机映像编译功能(即装即用)。 在2019年中期,开发了spring-graalvm-feature以支持Spring Boot(Spring Framework 5.2)的本机映像编译,并于2019年9月正式加入Spring Projects实验项目。 我很想尝试一下,但是它在构建过程中需要巨大的内存,我的笔记本电脑只有8GiB RAM,目前不需要添加更多的RAM。 好消息,此提交使内存使用量变小。
一些新的Java框架已经具备了本机图像编译功能,例如Quarkus,Micronaut和Helidon。 几个月前,我有兴趣尝试Quarkus,实际上1.0于去年11月发布,但我没有太多的空闲时间来尝试。 几个月前,在尝试了Quarkus几天之后,我很好奇如何用Spring(sping-graal-native)对Quarkus进行基准测试,但是在对spring-graal-native进行了几次试验之后,我认为它仍然很痛苦,即使对于simpe http API和JPA(使用主流SQL数据库),到目前为止,我的问题是#1,#54,#55,#93,#197。 难怪它是0.6.0,也许等待下一个版本或Spring 5.3的官方支持是个好主意。
几周前,发布了本机版本的spring-graal-native 0.7.1,许多问题已经关闭,我对GCP拥有免费信用,因此,让我们再试一次并做一些基准测试。 我知道现在比较spring-graalvm-native是不公平的,也许我们只能说这是"实验报告"。
![8b77d71fe9b884d3365671cd3a68bdba.png](https://i-blog.csdnimg.cn/blog_migrate/158d25ecb9b8886950b0a5ae93627d3a.jpeg)
应用
该基准测试针对四种类型的应用程序
· SpringBoot
· Webflux的Spring Boot
· Quakus
· Quarkus(Spring API扩展)
所有这些只是带有PostgreSQL数据库的基于HTTP的简单CRUD应用程序。 有6个http端点
· 插入
· 按编号查找
· 按页查找
· 按特定列查找(过滤)
· 更新资料
· 删除
您可以检查我的存储库中的源代码。 Webflux版本(第2个)中的Spring Data和JDBC版本没有反应。 我添加Webflux版本只是为了比较,因为Quarkus基于Netty。
有关如何将应用程序编译为Native Image的信息,可以查看Quarkus的本文档和spring-graalvm-native的本文档。 我将混合模式用于spring-graalvm-native和自定义构建脚本(请参阅spring项目的每个根目录上的compile.sh)。
对于框架和运行时版本,我使用的是Spring Boot 2.3.1(spring-graalvm-native 0.7.1),Quarkus 1.5.2,GraalVM 2.1.0 Java 11。
资料模型
id 主键resource_string 用于样本过滤resource_text *仅有效载荷为3000个随机char
构建过程
在4个vCPU,16 GiB RAM虚拟机,空闲状态下2.8%的RAM使用率上完成构建过程。
1.构建时间
spring-boot 8分钟39秒
spring-boot-webflux 8分钟12秒
quarkus 3分钟55秒
quarkus-spring-api 3分钟57秒
![888f8e137c18a9ddd1204af91ba37037.png](https://i-blog.csdnimg.cn/blog_migrate/8526b4c14c29fa785b5adfc2da069e78.jpeg)
在尝试多次编译后,构建时间的不一致可能高达20-30秒。
2.一段时间内的CPU使用率(%)
![42997e95427ab42c8f958993b32aaefc.png](https://i-blog.csdnimg.cn/blog_migrate/abef193247ddfa2ed26f2a465716c6c0.jpeg)
3. RAM使用率(%)随时间变化
![0b4aace7b2279cdf155afa24e3da8045.png](https://i-blog.csdnimg.cn/blog_migrate/9684a1fce8812f17da1b773935698007.jpeg)
4.峰值RAM使用率
SpringBoot 10.1 GiB
spring-boot-webflux 9.8 GiB
quarkus 8 GiBquarkus-spring-api 8 GiB
![9e49661b1eb2b16c20f622224cec2cfa.png](https://i-blog.csdnimg.cn/blog_migrate/97e1b36536b2c26426c2c6636542152d.jpeg)
5.二进制大小
SpringBoot 196.6 MB
SpringBoot webflux 182.7 MB
quarkus 69.8 MB
quarkus-spring-api 69.6 MB
![42cac2d6caf755f3bac98f538de03944.png](https://i-blog.csdnimg.cn/blog_migrate/c06794819cb758cc52e6591b8233669b.jpeg)
好吧,Spring的构建时间和二进制大小的结果要高得多,让我们等待(也许还会有所贡献)Spring 5.3和非实验版本的spring-graalvm-native。
启动时间
在2个vCPU或1个vCPU上,所有应用程序的启动时间都在1秒以下,我认为不需要更详细地介绍本节。
压力测试
虚拟机规格
数据库:6个vCPU,16个GiB RAM,SSD(us-west1-b)
应用:1个vCPU,2个GiB RAM(us-west1-b)
JMeter:4个vCPU,16个GiB RAM(us-west2-a)
JMeter VM位于不同的区域,因为我使用的免费试用帐户每个区域有8个vCPU。
情境
我正在使用JMeter随机控制器随机请求所有端点15分钟。 在此之前,我截断该表并插入10000条记录。
我没有对所有应用程序进行任何特殊的调整,而是对所有应用程序进行了默认设置(包括spring webmvc,所以有200个tomcat线程),只是设置了连接池数。 我只是在VM级别进行调优,增加打开文件的最大数量并启用tcp_tw_reuse。
吞吐量结果
在运行15分钟测试之前,我尝试进行了60秒钟的测试,以找到针对这种VM规范的最合适的设置(JMeter线程(并发用户)和连接池数)。 我正在使用Quarkus作为基线,这就是结果。
![a8d3522303252b6743cb870651fcf59a.png](https://i-blog.csdnimg.cn/blog_migrate/b19afc42fe054c881472a4103cb67072.jpeg)
根据该结果,我认为150个JMeter线程足够大。 为了提高效率,我们仅在缓冲池中使用2个连接,在1vCPU中使用。
好吧,这是在15分钟内在处理150个JMeter线程的池中建立2个连接的结果。
![81091ff787c98865b54c41875155eebf.png](https://i-blog.csdnimg.cn/blog_migrate/3a38fc2937e449cf656dcb7281f0f463.jpeg)
spring-boot 390.1 / spring-boot-webflux 631.6 / quarkus 1042.7 / s quarkus-spring-api 871.1 / s
这是一段时间内(每30秒)的平均吞吐量。
![a89f91b0e3dcc8c3c1cc7fb655ab2be3.png](https://i-blog.csdnimg.cn/blog_migrate/3c27d8e1656b21cd1b4d62832dcdb441.jpeg)
资源利用(压力测试期间)
应用虚拟机
· 一段时间内的CPU使用率(%)
![d9954c1f8d13982746626ebed9a76d62.png](https://i-blog.csdnimg.cn/blog_migrate/4f0d968e14b3855f809204ff1dfe23ab.jpeg)
注意:如您所见,quarkus-spring-api和所有Spring版本的应用程序VM CPU使用率随着时间的推移而下降。 但是在DB VM上,该版本的CPU使用率正在增加(请参阅下一节)。
· 随时间推移的RAM使用率(%)
![3d9e2a9e8d684d6f4456ef6a1e9047d5.png](https://i-blog.csdnimg.cn/blog_migrate/8412a765a8417514aec48aa67d39fbd5.jpeg)
数据库虚拟机
· 一段时间内的CPU使用率(%)
![192fbf96a2bd100613d2a7f4e93ee940.png](https://i-blog.csdnimg.cn/blog_migrate/91383ff21634abe7423d18b7cd764e58.jpeg)
注意:从" Application VM CPU使用说明"继续。 quarkus-spring-api和所有Spring版本的数据库VM CPU使用率随着时间的增长而增加。 我还没有进一步调查。 可能是因为我在查找JMeter线程数时使用Quarkus版本作为基准,而其他人无法使用该设置处理请求。 稍后,我将使用100个JMeter线程进行重新测试。
· 随时间推移的RAM使用率(%)
![d92fa8e759e0e311207d0989dcd485c1.png](https://i-blog.csdnimg.cn/blog_migrate/f80fd42cff7e227ef6302090a352410d.jpeg)
JMeter VM
· 一段时间内的CPU使用率(%)
![5ef84b2c0ca346b2206177f78cbdeffd.png](https://i-blog.csdnimg.cn/blog_migrate/17ba2aee44700c16cf2ebc23721080e3.jpeg)
· 随时间推移的RAM使用率(%)
![bf55face079d1f27121d026fdc0d9e99.png](https://i-blog.csdnimg.cn/blog_migrate/235556b14bf8bbc74da285f5b7bdd56e.jpeg)
完整的源代码可以在我的Github页面上找到。
感谢您的阅读(对不起我的英语不好),并随时发表评论。
您是要查找有关远程工作的信息还是要获得有关远程工作的出色资源(远程工作)。FYI是您需要了解的有关远程工作的全部信息,现在就可以找到并共享出色的资源。
(本文翻译自Ardiansyah的文章《GraalVM Native Image: Spring VS Quarkus》,参考:https://medium.com/swlh/graalvm-native-image-spring-vs-quarkus-a738263df069)