支持JDK19虚拟线程的web框架,之一:体验( 三 )


  • 基本功能似乎没有问题,接下来可以压测了,用数据说话
  • 压测使用虚拟线程的接口
    • 这次使用的压测工具名为k6,选它的原因只有两个字:简单
    • 在执行压测的电脑上,确保docker可以正常使用
    • 新建名为k6-vt-docker.js的文件,内容如下,可见非常简单,发请求再校验响应,只要返回码是200,并且body大小大于0就算一次成功,要注意的事两个参数,其中vus是并发数,duration是测试持续时间,可见这里设置的是模拟30用户并发请求,持续时间是60秒
    import http from 'k6/http';import { sleep, check } from 'k6';export let options = {vus: 30,duration: '60s',};export default function () {let r = Math.floor(Math.random() * 6) + 1;const res = http.get(`http://192.168.0.1:8080/vt/persons/${r}`);check(res, {'is status 200': (res) => res.status === 200,'body size is > 0': (r) => r.body.length > 0,});sleep(1);}
    • 一行命令即可开始压测,如下
    docker run --rm -i loadimpact/k6 run - < k6-vt-docker.js
    • 等待一分钟,压测完成,得到以下数据

    支持JDK19虚拟线程的web框架,之一:体验

    文章插图
    • 这里将几个重要参数介绍一下
    1. checks : 通过率,如果满足返回码200且包体大小大于0的条件,就表示本次请求成功,这里显示100.00%,表示全部通过
    2. http_req_waiting:等待响应的事件,这里avg=33.83ms,表示平均等待时间为33.83毫秒
    3. http_reqs:每秒处理请求数,即常说的QPS,这里是28个每秒
    • 接下来将并发数调整为300(即vue参数),如下图

    支持JDK19虚拟线程的web框架,之一:体验

    文章插图
    • 再次压测,得到结果如下,并发数涨了10倍,QPS也涨了10倍,很完美的线程提升,不过平均等待时间略涨
      支持JDK19虚拟线程的web框架,之一:体验

      文章插图
    • 再来个狠的,并发数一口暴涨到5000试试,如下图,这么高的并发,已经无法保障100%的成功率了,好在95%也不低,另外平均等待时间从39毫秒暴涨到6.26秒,至于QPS当然不会太高,仅比300并发的时候高了百分之五十
      支持JDK19虚拟线程的web框架,之一:体验

      文章插图
    压测使用线程池的接口
    • 操作步骤和刚才差不多,只是要修改脚本中的接口地址,如下所示
    import http from 'k6/http';import { sleep, check } from 'k6';export let options = {vus: 30,duration: '60s',};export default function () {let r = Math.floor(Math.random() * 6) + 1;const res = http.get(`http://192.168.0.1:8080/pool/persons/${r}`);check(res, {'is status 200': (res) => res.status === 200,'body size is > 0': (r) => r.body.length > 0,});sleep(1);}
    • 30并发的压测结果如下,和使用虚拟线程并无区别
      支持JDK19虚拟线程的web框架,之一:体验

      文章插图
    • 300并发压测结果如下,和使用虚拟线程并无区别

    支持JDK19虚拟线程的web框架,之一:体验

    文章插图
    • 5000并发压测结果如下,和虚拟线程相比,平均等待时间略长,QPS略低,但是整体上差别不大

    支持JDK19虚拟线程的web框架,之一:体验

    文章插图
    小结
    • 在响应式web服务中,并且关联的数据库操作也是响应式的,相比传统的线程池模型,虚拟线程并未带来明显收益
    • 不甘心啊,接下来就换成SpringBoot应用,模拟咱们日常开发最常见的数据库访问场景,看看相比之下,差距有多大?
    停止quarkus应用

    经验总结扩展阅读