Quarkus Native模式下的性能对比(6)?

「本文已参与好文召集令活动,点击查看:后端、大前端双赛道投稿,2万元奖池等你挑战!

之前性能测试是跑在JVM上的(参见Quarkus的Insert&Select数据库性能),Quarkus Native的性能如何?

其实官网上也有对应的介绍,详细见下面截图。作为实践者,我们在本机上尝试下是否真香。
image.png

安装GraalVM环境

在Mac平台上安装GraalVM是比较容易的。在命令行中键入下面命令:

brew install --cask graalvm/tap/graalvm-ce-lts-java8
复制代码

安心等待,安装完成会提示
image.png
安装的GraalVM在本机路径

/Library/Java/JavaVirtualMachines/graalvm-ce-lts-java8-20.3.1/Contents/Home
复制代码

如果本机安装了多个JVM同版本应用,那可以通过如下命令查看

# meng @ Mbp in /usr/local/Caskroom [10:24:25] $ /usr/libexec/java_home -V
Matching Java Virtual Machines (2):
    1.8.0_292, x86_64:	"AdoptOpenJDK 8"	/Library/Java/JavaVirtualMachines/adoptopenjdk-8.jdk/Contents/Home
    1.8.0_282+07, x86_64:	"GraalVM CE 20.3.1"	/Library/Java/JavaVirtualMachines/graalvm-ce-lts-java8-20.3.1/Contents/Home

/Library/Java/JavaVirtualMachines/adoptopenjdk-8.jdk/Contents/Home
复制代码

我们将安装的GraalVM加载到我们的命令行中

vim ~/.bash_profile
复制代码

在文件~/.bash_profile中增加配置

export GRAALVM_HOME=/Library/Java/JavaVirtualMachines/graalvm-ce-lts-java8-20.3.1/Contents/Home
export PATH=$GRAALVM_HOME/bin:$PATH
复制代码

关闭~/.bash_profile文件编辑后,使用命令让配置生效

source ~/.bash_profile
复制代码

这时候我们可以使用GraalVM提供的bin,可以安装image-native

gu install native-image 
复制代码

打包Native

如果使用是maven,那么在项目路径下键入

./mvnw package -Pnative
复制代码

如果是gradle,那么在项目路径下键入

./gradlew build -Dquarkus.package.type=native
复制代码

打包完成后会告知成功
image.png
而在target的文件夹下会出现打包完成的native包。
image.png
native包体积大约66MB。
image.png
使用终端命令启动该服务。

$ ./target/quarkus1-1.0.0-SNAPSHOT-runner 
__  ____  __  _____   ___  __ ____  ______ 
 --/ __ \/ / / / _ | / _ \/ //_/ / / / __/ 
 -/ /_/ / /_/ / __ |/ , _/ ,< / /_/ /\ \   
--\___\_\____/_/ |_/_/|_/_/|_|\____/___/   
2021-07-09 10:45:58,352 INFO  [org.hib.rea.pro.imp.ReactiveIntegrator] (main) HRX000001: Hibernate Reactive Preview
2021-07-09 10:45:58,361 INFO  [org.mxx.con.lif.ApplicationLifecycle] (main) The application is starting...
2021-07-09 10:45:58,363 INFO  [io.quarkus] (main) quarkus1 1.0 native (powered by Quarkus 1.13.4.Final) started in 0.031s. Listening on: http://0.0.0.0:8080
2021-07-09 10:45:58,363 INFO  [io.quarkus] (main) Profile prod activated. 
2021-07-09 10:45:58,363 INFO  [io.quarkus] (main) Installed features: [cdi, hibernate-orm, hibernate-reactive, hibernate-reactive-panache, mutiny, reactive-mysql-client, reactive-pg-client, smallrye-context-propagation, smallrye-metrics, smallrye-openapi, vertx, vertx-web]
复制代码

启动速度十分迅速,花费0.031s(31ms)就启动起来了,JVM模式启动需要2.251s

性能测试对比

本机使用的是MacBook Pro (15-inch, 2017),10.13的操作系统,之前用最新Big Sur操作系统导致出现了一些问题,就还原回High Sierra

image.png

单元测试

测试的接口比较简单,返回字符串hello4, quarkusQuarkus版本1.13.4.Final

	@Route(path = "/hello4", methods = HttpMethod.GET)
    Uni<String> hello4(RoutingContext context) {
        return Uni.createFrom().item("hello4, quarkus");
    }
复制代码

JVM模式

启动时的CPU&内存指标
image.png
压测结果

$ wrk -c50 -d20s  http://127.0.0.1:8080/hello4 --latenc
Running 20s test @ http://127.0.0.1:8080/hello4
  2 threads and 50 connections
  Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency     1.97ms    5.44ms 109.63ms   94.93%
    Req/Sec    25.76k     7.32k   47.85k    64.25%
  Latency Distribution
     50%  663.00us
     75%    1.36ms
     90%    3.02ms
     99%   28.91ms
  1025903 requests in 20.04s, 97.84MB read
Requests/sec:  51192.58
Transfer/sec:      4.88MB
复制代码

压测时的CPU&内存指标
image.png

Native模式

启动时的内存和CPU指标
image.png
压测结果

$ wrk -c50 -d20s  http://127.0.0.1:8080/hello4 --latency
Running 20s test @ http://127.0.0.1:8080/hello4
  2 threads and 50 connections
  Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency     0.91ms    1.67ms  43.22ms   92.54%
    Req/Sec    37.78k    12.34k   69.22k    65.50%
  Latency Distribution
     50%  340.00us
     75%    0.90ms
     90%    2.17ms
     99%    7.68ms
  1509395 requests in 20.09s, 143.95MB read
Requests/sec:  75119.42
Transfer/sec:      7.16MB
复制代码

压测时的CPU&内存指标
image.png

闲话

相对于JVM模式,使用Native在资源利用上更有优势。

JVM模式 Native模式 备注
启动时间 2.251s 0.031s 时间越短越好
QPS 51192.58 75119.42 QPS值越大越好
平均响应时间 1.97ms 0.91ms 响应时间越短越好
响应时间方差 94.93% 92.54% 方差越小越稳定
响应时间99% 28.91ms 7.68ms 响应时间越短越好
内存(启动时的内存) 338M 13M 内存占用越少越省资源
内存(压测时的内存) 1162M 273M 内存占用越少越省资源

通过以上基本指标的对比,用Native模式去部署会节省更多的资源,同时提供更好的性能。

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享