「本文已参与好文召集令活动,点击查看:后端、大前端双赛道投稿,2万元奖池等你挑战!」
之前性能测试是跑在JVM上的(参见Quarkus的Insert&Select数据库性能),
Quarkus Native
的性能如何?
其实官网上也有对应的介绍,详细见下面截图。作为实践者,我们在本机上尝试下是否真香。
安装GraalVM环境
在Mac平台上安装GraalVM
是比较容易的。在命令行中键入下面命令:
brew install --cask graalvm/tap/graalvm-ce-lts-java8
复制代码
安心等待,安装完成会提示
安装的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
复制代码
打包完成后会告知成功
而在target
的文件夹下会出现打包完成的native
包。
native
包体积大约66MB。
使用终端命令启动该服务。
$ ./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
单元测试
测试的接口比较简单,返回字符串hello4, quarkus
。Quarkus
版本1.13.4.Final
。
@Route(path = "/hello4", methods = HttpMethod.GET)
Uni<String> hello4(RoutingContext context) {
return Uni.createFrom().item("hello4, quarkus");
}
复制代码
JVM模式
启动时的CPU&内存指标
压测结果
$ 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&内存指标
Native模式
启动时的内存和CPU指标
压测结果
$ 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&内存指标
闲话
相对于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模式去部署会节省更多的资源,同时提供更好的性能。