用 Spring Boot 3.2 虚拟线程搭建静态文件服务器有多快?
Spring Boot 3.2 于 2023 年 11 月大张旗鼓地发布,标志着 Java 开发领域的一个关键时刻。这一突破性的版本引入了一系列革命性的功能,包括:
- 虚拟线程:利用 Project Loom 的虚拟线程释放可扩展性,从而减少资源消耗并增强并发性。
- Native Image支持:通过Native Image编译制作速度极快的应用程序,减少启动时间并优化资源利用率。
- JVM 检查点:利用 CRaC 项目的 JVM 检查点机制实现应用程序的快速重启,无需冗长的重新初始化。
- RestClient:采用新的 RestClient 接口的功能方法,简化 HTTP 交互并简化代码。
- Spring for Apache Pulsar:利用 Apache Pulsar 的强大功能实现强大的消息传递功能,无缝集成到您的 Spring Boot 应用程序中。
其中,虚拟线程是最近 Java 版本中引入的最具变革性的特性之一。正如官方文件所述:虚拟线程是轻量级线程,可减少编写、维护和调试高吞吐量并发应用程序的工作量。线程是可以调度的最小处理单元。它与其他此类单位同时运行,并且在很大程度上独立于其他此类单元运行。它是 java.lang.Thread 的一个实例。有两种线程:平台线程和虚拟线程。平台线程是作为操作系统 (OS) 线程的瘦包装器实现的。平台线程在其底层操作系统线程上运行 Java 代码,平台线程在平台线程的整个生命周期内捕获其操作系统线程。因此,可用平台线程数限制为操作系统线程数。与平台线程一样,虚拟线程也是 java.lang.Thread 的实例。但是,虚拟线程不绑定到特定的操作系统线程。虚拟线程仍在操作系统线程上运行代码。但是,当在虚拟线程中运行的代码调用阻塞 I/O 操作时,Java 运行时会挂起虚拟线程,直到它可以恢复为止。与挂起的虚拟线程关联的操作系统线程现在可以自由地对其他虚拟线程执行操作。虚拟线程适用于运行大部分时间被阻塞的任务,通常等待 I/O 操作完成。但是,它们不适用于长时间运行的 CPU 密集型操作。
虽然人们普遍认为虚拟线程在 I/O 密集型方案中表现出色,但它们在 CPU 密集型任务中的性能仍然是一个问号。本系列文章深入探讨了虚拟线程在各种用例中的潜在优势,从基本的“hello world”到静态文件服务(I/O 密集型)、QR 码生成(CPU 密集型)和多部分/表单数据处理(混合工作负载)等实际应用。
在本系列的开头文章中,我们已经了解了虚拟线程与物理线程相比在最简单(且不切实际)的 hello world 情况下的性能。物理线程和虚拟线程之间几乎没有任何性能或资源使用差异。在本文中,我们将更加“实用”,并针对静态文件服务器情况进行比较。这绝对是一个常见且“真实世界”的案例。让我们看看这次我们发现了什么。
如果大家正在做Spring Boot 2.3升级Spring 3.2,这里顺手给大家推荐Spring Boot 2.x 到 3.2 的升级指南。
测试环境
所有测试均在配备 16G RAM、8 个物理内核和 4 个效率内核的 MacBook Pro M2 上执行。测试工具是 Bombardier,它是更快的 HTTP 负载测试器之一(用 Go 编写)。
软件版本为:
- Java v21.0.1
- Spring Boot 3.2.1
程序配置
除了主 Java 类之外,不需要编写任何 Java 文件,静态文件服务器只能通过配置就能发挥作用。
application.properties
文件如下:
server.port=3000 spring.mvc.static-path-pattern=/static/** spring.web.resources.static-locations=file:/Users/mayankc/Work/source/perfComparisons/static/
使用虚拟线程时,我们将通过添加以下行来启用它们:
spring.threads.virtual.enabled=true
pom.xml
内容:
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>3.2.1</version> <relativePath/> </parent> <groupId>com.example</groupId> <artifactId>demo</artifactId> <version>0.0.1-SNAPSHOT</version> <name>demo</name> <description>Demo project for Spring Boot</description> <properties> <java.version>21</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies>
测试数据
大小完全相同但数据不同的 100K 文件被放置在静态资源目录中。每个文件大小正好是 102400 字节。
文件的命名范围为 1 到 100000。
使用 Bombardier 的修改版本,为每次运行生成随机请求 URL: http://localhost:3000/static/<file-name>
应用场景
为了确保结果一致,每个测试在开始数据收集之前都会经历 5K 请求预热阶段。
然后,在不同范围的并发连接级别(50、100 和 300)中仔细记录测量结果,每个级别都承受 500 万个请求工作负载。
结果评估
除了简单地跟踪原始速度之外,我们还将采用详细的指标框架来捕获延迟分布(最小值、百分位数、最大值)和吞吐量(每秒请求数)。
CPU 和内存的资源使用情况监控将补充此分析,从而提供不同工作负载下系统性能的全面了解。
测试结果
结果以图表形式呈现如下:
总结
对静态文件服务的分析表明,物理线程在性能和资源效率方面略胜一筹(与我们的预期相反)。
不过,这种受 I/O 限制的场景可能并不是充分发挥虚拟线程潜力的理想场所。涉及数据库交互的任务可能会显示出更多令人信服的优势。也许负载不足以让虚拟线程发挥出最大的作用。为了找出答案,我们将在接下来的文章中介绍 URL短链(数据库驱动)、二维码生成(CPU受限)和混合工作负载场景(如表单数据处理),旨在揭示虚拟线程真正出类拔萃的案例。
欢迎关注我的公众号:程序猿DD。第一时间了解前沿行业消息、分享深度技术干货、获取优质学习资源
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
.NET 8、Mojo🔥、Bun 1.0……最硬核极客的年度发版汇总
回顾一下 2023 年最重磅、最极客、最硬核的(开源)项目更新资讯,保证全网最全——如有遗漏,欢迎补充。 Wine-CE 首个正式版发布,可跨指令架构运行程序的 Wine LineageOS 20 正式发布,开源 Android 系统分支 Flutter 3.7 稳定版发布,开源跨平台应用开发工具包 Meilisearch 1.0 稳定版发布,Rust 高性能开源搜索引擎 Pigsty v2 正式发布:更好的 RDS PG 开源替代 Manticore Search 6 正式发布,C++ 高性能搜索引擎 京东轻量级移动端组件库 NutUI 4.0 正式发布! Go 1.20 正式发布 历经风波,elementary OS 7 正式发布 Homebrew 4.0.0 发布,MacOS 上的包管理器 FFmpeg 6.0 发布 Conan 2.0 发布,开源 C/C++ 包管理器 TypeScript 5.0 发布 GNOME 44 正式发布 RT-Thread 5.0.0 发布,嵌入式实时多线程操作系统 开源 3D 游戏引擎 Godot 正式发布 4.0 CeresDB 1.0 正式发布...
- 下一篇
总结:停止自嗨、走进用户,努力提供有价值的服务
运营总结: 1、每天在开源市场有30个左右的start,github/gitee:start总计270,较上周增长140,感谢研发同仁对开放签的认可; 2、每天陆陆续续咨询的用户有5个左右,感觉客户越来越多了,还没有成交的客户,这得好好分析自己的不足; 3、当有客户咨询我们时,我们首先秉持“能使用开源版就用开源版,实在有企业版本需求再使用企业版。”的原则引导客户,实际上开放签开源工具版实际用户已经突破100; 4、在产品能力、品牌等方面与市场上的老牌服务商(法大大、e签宝、上上签、契约锁等等前辈们)还有很大差距,比如安装体验不好、功能不全、服务不完善等,我们要多向他们学习。 新年工作的第一周,就用自我吐槽的方式激励开放签变得更好吧。 槽点1:用户体验做的确实不好,要自责、要学习、要进步、要接受批评; 槽点2:运营还很菜,叫好不叫座,要深度刨析问题出在哪里?不能只关注自己而脱离用户;要大胆的否定自己,还要及时的建立信心; 槽点3:内部管理有问题,1、工作目标不清晰,更新内容不能及时的内外同步;2、不能脱离用户,产品更新迭代要考虑、贴近用户。 开放签本周更新内容: 1、优化了开源市场...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- Linux系统CentOS6、CentOS7手动修改IP地址
- Red5直播服务器,属于Java语言的直播服务器
- CentOS7,8上快速安装Gitea,搭建Git服务器
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- Windows10,CentOS7,CentOS8安装MongoDB4.0.16
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题