Node.js 基准测试
Node.js 24.18.0,node-postgres 8.16.3。机器配置与测量方法。
测量日期为 2026 年 9 月 14 日,扩展构建为 67e5754,缓存预算 384 MiB;客户端在 macOS 上通过 Docker 发布的 SQL 端口连接。
每请求 64 个键时,三个 10 秒样本的 requests/s 中位数:
| 连接数 | 预备 SQL | SQL mget |
|---|---|---|
| 4 | 7,023 | 7,528 |
| 64 | 15,577 | 16,616 |
| 256 | 15,459 | 16,574 |
64 个连接时,mget 每请求消耗 170 µs 服务器 CPU,SQL 则为 286 µs。服务器平均 CPU 为 2.80 核与 4.43 核;采样内存峰值为 215.0 MiB 与 205.5 MiB。客户端 CPU 为 0.84 核与 0.87 核。
64 个连接、每请求一个键时,SQL 更快:55,409 对 53,646 requests/s。批量结果不适用于单键读取。
原始测量包含延迟分位数、资源样本与源码版本。
读写混合
Node.js 应用测试程序使用 64 个连接、每样本 50,000 个请求,重复三次。读取循环访问 128 行热数据;混合负载中 5% 的操作更新行。
| 工作负载 | 键/请求 | 预备 SQL requests/s | mget JSON requests/s |
|---|---|---|---|
| 热读取 | 1 | 56,104 (52,246–56,364) | 52,842 (52,494–53,399) |
| 热读取 | 16 | 37,391 (36,996–37,938) | 38,425 (38,340–38,617) |
| 热读取 | 64 | 15,178 (15,109–15,488) | 16,294 (16,131–16,368) |
| 5% 更新 | 1 | 55,768 (54,273–56,527) | 52,621 (51,432–53,216) |
| 5% 更新 | 16 | 38,669 (38,429–38,718) | 37,604 (37,481–37,916) |
| 5% 更新 | 64 | 16,049 (16,008–16,063) | 16,814 (16,771–17,229) |
数值为 requests/s 中位数,括号内为最小值–最大值。混合样本合并统计读写操作。JSON 中的 application_run 包含冷填充与写入开销场景。批次为 64 的冷填充只有 64 个延迟观测值,不足以得到有意义的 p99 估计。
查询配置
SELECT array_to_json(local_cache.mget('public.items'::regclass, $1::bigint[])) AS rows;
复用连接和具名预备语句。请求时间包含 JSON 解码与输入位置恢复。参阅 Node.js 示例。
复现
运行 Node.js 基准测试
在仓库根目录运行,需要 Docker 和 Node.js 20+:
./examples/benchmark.sh node > node.json
当前默认值:4/64/256 个连接、1/16/64 个键,每种情况采集三个五秒样本。Node.js 现在在 Docker VM 内运行三种路径:预备 SQL、SQL mget 和 RESP MGET。脚本创建一次性服务器与独立客户端容器,记录资源后移除两者。可覆盖 CONNECTIONS、BATCHES、REPEATS 和 DURATION_SECONDS。使用 all 可在相同矩阵中加入 Go。要复现记录中的宿主机客户端配置,请使用测量 JSON 中的版本。
运行读写混合测试:
BATCHES=1,16,64 ./examples/benchmark.sh node-workload > benchmark.json
python3 scripts/benchmark_report.py benchmark.json
默认值:64 个连接、每样本 50,000 个请求,重复三次。测试程序在样本之间重置演示表。可覆盖 CLIENTS、REQUESTS、BATCHES 和 REPEATS。
更新于 .