virtual thread 在 jdk21+graalvm 条件下简单测试

2023-09-20 10:56:14 +08:00
 yazinnnn
测试框架是 quarkus(resteasy reactive) 3.3.3
cpu i5 10400
jdk 版本



api 响应内容



测试代码(直接返回字符串与模拟进行 100 毫秒业务后返回字符串)

https://gist.github.com/yazinnnn/92a90ddb81579fdc619ca14395bf3dc2

测试命令(wrk 10 线程 5000 连接 5 秒)

wrk -t 10 -c 5000 -d 5s ~


首尾的 rss 分别为启动时和测试后的内存占用
native 结果(堆内存 200m)



jvm 结果(堆内存 200m)



两者的应用大小及启动时间对比

3300 次点击
所在节点    程序员
22 条回复
yazinnnn
2023-09-20 11:20:37 +08:00
补充一个 spring webflux 的简单测试(尚未支持 virtual thread)

native(-Xmx200m)



jvm(-Xmx200m)



启动时间

1055619878
2023-09-20 14:33:48 +08:00
有没有省流版本
taogen
2023-09-20 14:45:06 +08:00
同求
leexiaolang
2023-09-20 15:48:55 +08:00
内存占用降低,启动时间短,但是性能下降了?
mmdsun
2023-09-20 16:31:32 +08:00
spring boot 是不是要配置虚拟线程,默认是普通线程池?
Akitora
2023-09-20 16:41:10 +08:00
看起来在 quarkus 和 webflux 下,测试结束时 native 内存占用是 jvm 的一半左右,但同时吞吐量也下降了是比较意外的,这样的话 native 最大的优势只是启动速度吗……

以及比较好奇的是 native 会不会在 gc 后把内存还给操作系统?
zhady009
2023-09-20 18:04:51 +08:00
@Akitora 没有给出 build args ,没指定的话默认是 Serial GC 要加上--gc=g1 看看是不是因为 gc 的原因
ixiaohei
2023-09-20 18:24:34 +08:00
@zhady009 jdk21 serial gc 还没删掉么?
zhady009
2023-09-20 18:57:38 +08:00
@ixiaohei https://tschatzl.github.io/2023/08/04/jdk21-g1-parallel-gc-changes.html 还在,反正不是构建 native-image 的话默认都不是这个,无所谓
netabare
2023-09-20 18:59:21 +08:00
看了一下 quarkus 的 blog ,感觉对这个其实没啥太大的兴趣。reactive 的技术栈下,「开很多个线程」并不是一个痛点。

就是不知道 virtual thread 对 reactive 技术栈有没有什么帮助了。感觉还是存疑。
salmon5
2023-09-20 19:49:47 +08:00
@ixiaohei JDK21 默认还是 G1GC ,SerialGC 、ParallelGC 都还支持,从 JDK9 废弃 JDK14 移除的是 CMS GC ;
JDK21 新增了分代 ZGC ,但不是默认
ikas
2023-09-20 20:47:27 +08:00
virtual thread 本身就是为了代替 reactive ,异步等方式来实现高吞吐 io 的

目前最大的好处也就是是使用简单的同步方式来编写代码,性能肯定还需要打磨的
Leviathann
2023-09-20 20:50:33 +08:00
@netabare 可以做 await
bringyou
2023-09-20 21:02:54 +08:00
刚好 spring 也出了一篇文章介绍 Java21 + graalvm
https://spring.io/blog/2023/09/20/hello-java-21
cp19890714
2023-09-20 21:03:18 +08:00
这个结果很不错了。使用 虚拟线程+同步编程 就可以达到响应式编程 90%的效果,这已经可以降低成本了。
duduke
2023-09-20 21:26:48 +08:00
cpu 密集型性能肯定会下降,io 密集型的应该会有帮助,看 op 的结果有这个倾向,应该再上点请求量,可能会比较显著
kneo
2023-09-20 22:38:51 +08:00
结论?
ymmud
2023-09-20 22:41:12 +08:00
加上数据库最好
hez2010
2023-09-20 22:44:59 +08:00
虚拟线程的方式性能是不如 async/await 以及 reactive 的,但好处是解放了双手,不需要大幅度修改代码就能让已有同步阻塞代码的吞吐量得到提升。
Cabana
2023-09-20 23:04:42 +08:00
感觉还是类似 Kotlin 的协程好用些

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/975458

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX