资讯动态

Vert.x Web 在 TechEmpower Framework Benchmarks 中的基准测试实现与 wrk 压测指南

发布时间:2026/10/16 3:11:07 来源:尧图企业网站定制
性能测试测试后端开发者工具【免费下载链接】FrameworkBenchmarksSource for the TechEmpower Framework Benchmarks project项目地址https://gitcode.com/gh_mirrors/fr/FrameworkBenchmarks点击查看免费下载导读本文围绕 FrameworkBenchmarks 仓库中 frameworks/Java/vertx-web/README.md 展开系统讲解 Vert.x Web 在 TechEmpower Web Framework Benchmarks 中参与评测的完整方案从测试端点plaintext / json / db / queries / fortunes / update的映射关系到 App.java 中各路由的异步实现细节再到使用 wrk 生成压测负载的标准命令与 HTTP 管道pipelining配置。读完本文你将掌握 Vert.x Web 基准项目的结构与端点语义并能独立复现 README 中描述的压测流程结合仓库 toolset 了解官方跑分的完整脚本链路。测试端点全景一个 Verticle 承载六大基准场景Vert.x Web 的基准实现核心是单个 Verticle——App.java。在start()方法中它创建了一个io.vertx.ext.web.Router将六个测试端点注册到监听8080端口的 HTTP 服务器上。下表完整继承自 README同时标注了每个端点在当前源码中的实际路由注册位置场景端点说明源码路由Plain Texthttp://localhost:8080/plaintext固定文本响应测试路由与吞吐app.get(/plaintext)JSON Encodinghttp://localhost:8080/jsonJSON 序列化app.get(/json)Database Mappinghttp://localhost:8080/psql/db单行查询 World 表app.get(/db)Multiple Querieshttp://localhost:8080/psql/queries?queries5可变数量随机查询app.get(/queries)Updatehttp://localhost:8080/psql/update?queries5读改写read-then-writeapp.route(/update)Template Renderinghttp://localhost:8080/psql/fortunes服务端模板渲染 HTML 转义app.get(/fortunes)注意README 中保留了http://localhost:8080/mongo/db等以mongo开头的端点它们是历史上 MongoDB 测试留下的说明。从当前仓库源码看App.java 只实现了基于 PostgreSQL 的PgClientBenchmark内部类pom.xml 也仅声明了vertx-pg-client依赖因此当前仓库实际可用的数据库场景是 psql 系列端点mongo端点并未在当前源码中注册路由。可以推断config.json中的 MongoDB 连接串是旧配置残留。从配置元数据理解评测定位benchmark_config.json与config.toml是两份内容等价分别采用 JSON 与 TOML 格式的评测元数据文件声明了该框架在两个测试组中的身份default 组无数据库json_url/json、plaintext_url/plaintextdatabaseNone。postgres 组db_url/db、query_url/queries?queries、fortune_url/fortunes、update_url/update?queriesdatabasePostgres。两个组共同的属性包括approachRealistic、classificationMicro、ormRaw不使用 ORM直接操作 SQL 客户端、platformVert.x、webserverNone由 Vert.x 自身作为 HTTP 服务器无前置 Nginx 等、port8080。其中versus字段在 default 组指向vertx用于与纯 Vert.x core 实现对比postgres 组为空。config.toml使用[main]与[postgres]两个 section 与上述配置一一对应是 framework 目录统一的 TOML 元数据格式。源码级解析六个路由的异步实现JSON 与 Plaintext框架基础能力JSON 测试路由直接返回new Message(Hello, World!)经Json.encodeToBuffer序列化的结果Content-Type 为application/jsonPlaintext 路由则以text/plain返回固定字符串Hello, World!。两者都在响应头中显式设置SERVER: vertx-web与动态维护的DATE头日期值由vertx.setPeriodic(1000, ...)每秒刷新一次见 App.java。值得注意的是序列化优化App类的静态初始化块中注册了BlackbirdModuleJackson 的轻量级模块避免反射开销static { DatabindCodec.mapper().registerModule(new BlackbirdModule()); }这一优化配合 vertx.json 中的preferNativeTransport: true优先使用 Netty 原生传输如 epoll / io_uring构成了 Vert.x Web 参与高吞吐测试的底层手段。pom.xml 中同样能看到已声明netty-transport-native-io_uringlinux-x86_64 classifier依赖。DB 与 Queries异步 SQL 与参数化查询数据库连接通过PgConnectOptions创建PgConnectOptions options new PgConnectOptions() .setCachePreparedStatements(true) .setHost(config.getString(host)) .setPort(config.getInteger(port, 5432)) .setUser(config.getString(username)) .setPassword(config.getString(password)) .setDatabase(config.getString(database)) .setPipeliningLimit(100_000);连接参数host、username、password、database来自--conf src/main/conf/config.json加载的配置默认值为tfb-database、benchmarkdbuser、benchmarkdbpass、hello_world与 toolset 中数据库镜像约定一致。setCachePreparedStatements(true)启用预处理语句缓存注释明确说明setPipeliningLimit(100_000)是因为只使用单条连接用大流水线减少 flush 次数。dbHandler使用preparedQuery(SELECT_WORLD).execute(Tuple.of(randomWorld()))执行SELECT id, randomnumber FROM world WHERE id $1结果为空时返回 404否则返回 JSON。queriesHandlerqueries参数由 Helper.getQueries 解析——默认值为 1范围钳制在 1500非数字输入回落为 1这与 toolset 的query.py验证用例(0,fail)、(501,warn)、(foo,fail)的行为一致。随后并行发起queries个查询通过int[] cnt计数实现最后一个查询完成后统一响应的收束逻辑。Update读改写与批量 UPDATEupdateHandler按queries数量循环执行随机 id 查行 → 换新随机数 → 收集的过程全部查完后对 worlds 按 id 排序再调用preparedQuery(UPDATE_WORLD).executeBatch(batch)一次性批量提交UPDATE world SET randomnumber $1 WHERE id $2最后返回更新后的数组。这里体现了 TechEmpower Update 测试可变数量的读-写数据库操作的语义。Fortunes模板引擎渲染fortunesHandler查询SELECT id, message FROM fortune追加一条测试规定的额外记录new Fortune(0, Additional fortune added at request time.)按 message 排序Fortune实现了ComparableFortune按message.compareTo比较后交给RockerTemplateEngine渲染 Fortunes.rocker.html 模板for ((ForIterator i, Fortune fortune) : fortunes) { tr tdfortune.getId()/td tdfortune.getMessage()/td /tr }Rocker 模板在编译期生成 Java 代码由rocker-maven-plugin在generate-sources阶段完成见 pom.xml语法对输出自动 HTML 转义满足测试的 XSS 防护要求。仓库中另保留了 fortunes.hbs 的 Handlebars 版本模板但当前App.java只实例化了RockerTemplateEngine。构建与运行方式构建基于 Mavenpom.xml通过vertx-stack-depchainBOM 管理版本主类为io.vertx.benchmark.App编译目标为 Java 25。两个 Dockerfilevertx-web.dockerfile 与 vertx-web-postgres.dockerfile内容一致均以maven:3.9.11-eclipse-temurin-25为基础镜像执行mvn package -q构建 fat jar 后以如下方式启动java -server \ -XX:UseNUMA -XX:UseParallelGC \ -Dvertx.disableMetricstrue \ -Dvertx.disableH2ctrue \ -Dvertx.disableWebsocketstrue \ -Dvertx.threadChecksfalse \ -Dvertx.disableContextTimingstrue \ -Dvertx.disableTCCLtrue \ -Dvertx.disableHttpHeadersValidationtrue \ -Dvertx.eventLoopPoolSize$(nproc) \ -Dio.netty.buffer.checkBoundsfalse \ -Dio.netty.buffer.checkAccessiblefalse \ -jar target/vertx-web-benchmark-5.0.5-fat.jar \ --instances $(nproc) \ --conf src/main/conf/config.json \ --options src/main/conf/vertx.json关键点--instances $(nproc)按 CPU 核数启动多个 Vert.x 实例每实例默认单 event loop 线程eventLoopPoolSize同样取自核数disable*系列系统属性用于关闭非评测所需的特性开销这对压测数据的可重复性有实际意义。使用 wrk 生成压测负载README 核心实操负载机器与工具选型README 强调压测负载最好在与被测服务器完全隔离的独立机器上生成以避免资源争用影响结果。压测工具选用 wrk它通过 Lua 脚本接口支持 HTTP pipelining而 plaintext 场景正是依靠管道压测的wrk 只能在 Linux 上运行Windows 用户可改用 Apache Benchab作为替代使用前需要在负载机器上克隆 wrk 仓库并按其官方说明编译安装wrk 以源码构建方式分发未随仓库提供二进制。JSON 场景基础压测命令README 给出如下示例使用 256 条连接、32 个客户端线程、持续 10 秒wrk -c 256 -t 32 -d 10 http://127.0.0.1:8080/json参数含义-c并发连接数-t客户端线程数wrk 要求线程数能整除连接数-d持续时间。README 同时提示-t线程数应根据负载机器的实际规格进行调整过小的机器可以降低线程数。Plaintext 场景HTTP Pipelining 压测plaintext 场景使用 HTTP 管道以考验框架对单连接多请求的承载能力。假设当前工作目录位于本仓库根目录且 wrk 已在 PATH 中执行--之后的最后一个参数是管道深度wrk -c 256 -t 32 -d 15 -s ./scripts/pipeline.lua http://localhost:8080/psql/update?queries20 -- 16仓库的标准做法是 plaintext 场景固定使用16 的管道深度——这与 toolset 中 plaintext.py 的get_script_variables里pipeline: 16完全一致也与官方 Toolset 在toolset/benchmark/framework_test.py中的设定一致。上面的命令示例其实展示了更通用的能力-s指定 Lua 脚本后任何需要管道的场景都可以用同样的写法README 示例故意将管道压测打在/psql/update?queries20上以演示组合用法。仓库自带的 scripts/pipeline.lua 实现要点如下init(args)读取--后的参数args[1]为管道深度args[2]可选为最大请求数脚本先把pipelineDepth个wrk.format(nil)请求头拼接成一条管道消息request()每次都返回整段管道请求当设置了maxRequests时response()里用计数器触发wrk.thread:stop()来精确控制请求总量。与官方跑分脚本的衔接上述手工命令与仓库 toolset 中真实使用的负载脚本一脉相承plaintext 场景对应 toolset/wrk/pipeline.sh其 wrk 调用为wrk ... $url -s pipeline.lua -- $pipeline管道深度由测试类型传入 16json / db 等固定并发场景对应 concurrency.shqueries 与 update 等按查询级别扫描的场景对应 query.sh其 URL 形如${url}2即遍历不同queries值。三个脚本都遵循Primer预热5 秒 8 连接→ Warmup正式热身→ 分级压测的节奏并设置--timeout 8与 keep-alive 请求头。这些脚本由 toolset 的framework_test.py按测试类型调度最终驱动 wrk.dockerfile 构建的 wrk 容器。小结Vert.x Web 基准项目以极简结构一个 Verticle 三个模型类 一个工具类覆盖了 TechEmpower 六类核心场景非数据库的 plaintext/json 验证路由与序列化吞吐Postgres 组的 db/queries/update/fortunes 验证异步 SQL、参数化查询、批量更新与模板渲染。配合 README 的 wrk 压测指引、仓库内置的 pipeline.lua 脚本以及 toolset 的自动化跑分脚本开发者可以在独立负载机上复现完整的基准测试流程并理解管道深度 16等关键参数背后的评测语义。赞分享性能测试测试后端开发者工具【免费下载链接】FrameworkBenchmarksSource for the TechEmpower Framework Benchmarks project项目地址https://gitcode.com/gh_mirrors/fr/FrameworkBenchmarks点击查看免费下载相关推荐TechEmpower Framework Benchmarks 中的 Erlang Cowboy 基准测试实现解析TechEmpower Framework Benchmarks 中的 Erlang Cowboy 基准测试实现解析 本文以 TechEmpower Frame性能测试测试后端开发者工具GoFrame 基准测试实战指南GoFrame 在 TechEmpower Framework Benchmarks 中的完整实现剖析GoFrame 基准测试实战指南GoFrame 在 TechEmpower Framework Benchmarks 中的完整实现剖析 本篇技术指南以 Tec性能测试测试后端开发者工具t-iotio-mvc框架在 TechEmpower Framework Benchmarks 中的基准测试实现解析t iotio mvc框架在 TechEmpower Framework Benchmarks 中的基准测试实现解析 本文以 frameworks/Java性能测试测试后端开发者工具上一篇Joplin HtmlToMd 表格自定义属性保留机制以 table_with_custom_attributes 测试夹具剖析 preserveTableStyles 实现下一篇5步解决Google ADK Python FastAPI启动失败的终极方案创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑