新闻详情

新闻详情

首页 / 资讯中心 / 详情

grpc-rust 基准测试框架解析:Worker、Server 与 Client 三大组件的 gRPC 性能压测实现

发布时间:2026/10/2 1:58:06来源:尧图网络
grpc-rust 基准测试框架解析:Worker、Server 与 Client 三大组件的 gRPC 性能压测实现
后端RPC框架【免费下载链接】grpc-rustA native gRPC client server implementation with async/await support.项目地址https://gitcode.com/GitHub_Trending/to/grpc-rust点击查看免费下载本指南聚焦当前仓库中grpc-benchmark目录下的 gRPC 基准测试框架代码完整剖析其在 Rust 生态中落地 gRPC 官方基准测试协议的方式包括 worker 进程的启动方式、BenchmarkServer 与 BenchmarkClient 的压测实现、直方图延迟统计原理以及独立命令行工具bench的使用方法。读完本文你将掌握这套框架的目录结构、控制协议control.proto中各个配置字段的含义、压测数据的采集与上报机制并能直接编译运行 worker 与 bench 对本地 gRPC 服务发起基准测试。框架定位gRPC 官方基准测试体系中的 Rust 实现grpc-benchmark/README.md 明确指出该目录承载的是gRPC Benchmarking FrameworkgRPC 基准测试框架中 worker、server、client 三部分的 Rust 实现代码。框架的整体设计遵循 gRPC 官方的基准测试约定Driver驱动负责编排整个测试场景如并发数、RPC 类型、测试时长向各 worker 下发配置并汇总结果官方驱动代码及运行说明位于 gRPC 官方仓库的tools/run_tests/performance目录下不在本仓库内Worker工作进程由 driver 通过 gRPC 远程调用控制负责在本机启动压测 server 或 clientBenchmarkServer / BenchmarkClient真正执行负载与统计的实体持续监控官方通过这套基准测试持续跟踪各语言 gRPC 实现的性能指标数据汇总到 gRPC 官方性能仪表盘README 中提到的 performance dashboard。需要说明的是本仓库内虽然没有官方 driver 的代码但提供了一个自包含的独立驱动工具bench源码见 grpc-benchmark/src/bin/bench.rs它可以本地拉起 worker、下发配置、运行压测并直接打印报告便于在无法连接官方 driver 的情况下快速验证框架本身。这也从侧面印证了 worker/server/client 三层架构在 Cargo.toml 中的落地该 crate 声明了两个二进制目标bench与worker并导出了库模块供二者复用。目录结构与模块总览grpc-benchmark的核心布局如下以下路径均以仓库根目录为起点路径职责grpc-benchmark/src/main.rsworker二进制入口解析--driver_port并启动 WorkerService gRPC 服务grpc-benchmark/src/bin/bench.rsbench二进制入口自包含驱动解析压测参数并驱动 workergrpc-benchmark/src/worker.rsWorkerService实现暴露run_server、run_client、core_count、quit_worker四个 RPCgrpc-benchmark/src/server.rsBenchmarkServer与被测BenchmarkServiceproto 服务器实现grpc-benchmark/src/client.rsBenchmarkClient闭循环压测负载生成与延迟直方图采集grpc-benchmark/src/rusage.rs跨平台 CPU 用户态/内核态时间采集封装grpc-benchmark/src/lib.rs汇总生成代码与模块同时编译 protobuf 与 tonic 两套生成产物grpc-benchmark/proto/grpc/testing/官方基准测试协议定义control.proto、benchmark_service.proto、stats.proto、payloads.proto、messages.proto、worker_service.proto等grpc-benchmark/data/tls/基准测试专用 TLS 测试证书ca.pem、server1.pem、server1.keylib.rs中generated模块同时 include 了两套代码生成产物一套是基于 protobuf 运行时protoc-gen-rust-grpc风格模块路径generated::grpc::testing一套是基于 tonic 与 prostgenerated::services::grpc::testing。前者用于驱动脚本bench构造配置消息后者用于实现真正的 gRPC 服务与客户端。build 阶段的代码生成由grpc-protobuf-build、protoc-gen-rust-grpc与tonic-prost-build三个本地 crate 完成见 Cargo.toml 的 build-dependencies。worker承载压测的 gRPC 服务进程启动方式与命令行参数worker是一个独立的可执行文件其唯一必需参数是 driver 通信端口用法如下worker --driver_portport从 grpc-benchmark/src/main.rs 的解析逻辑可以看到入口会遍历std::env::args()仅接受形如--driver_portport的参数port必须是合法的u16端口号否则打印错误并退出其他未知参数会打印Warning: Unrecognized argument。未提供--driver_port时输出Usage: worker --driver_portport并以非零码退出。该文件注释还解释了线程模型的一个设计取舍默认 Tokio 运行时每个逻辑处理器一个线程官方测试框架虽然支持在测试配置中指定线程数但部署在 k8s 上的测试依赖特定机型规格、不期望 client/server 自行限制资源占用且 Tokio 不支持嵌套运行时因此当前版本未实现按测试配置设定线程数的能力。WorkerService 的四个 RPCworker进程通过tonic启动一个 gRPC 服务将WorkerServiceServer::new(WorkerServer::new(quit_notify))挂载到0.0.0.0:driver_port并使用serve_with_shutdown让quit_workerRPC 触发优雅退出见 grpc-benchmark/src/main.rs 的run_worker。WorkerService定义于官方协议文件 grpc-benchmark/proto/grpc/testing/worker_service.proto其 Rust 实现位于 grpc-benchmark/src/worker.rsrun_server/run_client均为服务端流式 RPC。driver 通过流式请求先下发Setup对应ServerConfig/ClientConfig之后周期性下发Markreset为 true 表示快照后清零统计来取回统计数据。worker 端使用async_stream::try_stream!逐个处理请求并禁止重复启动already_exists错误。统计通过闭包yield回ServerStatus/ClientStatus其中ServerStatus还携带绑定的端口号与可用 CPU 核数core_count一元 RPC返回available_parallelism()探测到的逻辑核数quit_worker一元 RPC触发Notify通知serve_with_shutdown正常退出。run_server的实现细节grpc-benchmark/src/worker.rs 的run_server分支体现了ServerStatus的字段来源stats来自BenchmarkServer::get_statscores来自core_count()port来自server.port()——其中端口是启动时实际绑定到的端口配置为 0 时由系统分配。run_client分支则要求 client 存在时才能响应Mark并在每个请求处理后异步取回ClientStats。控制协议配置字段与语义所有压测配置都定义在官方控制协议 grpc-benchmark/proto/grpc/testing/control.proto 中理解这些字段是正确使用框架的前提ClientConfig 关键字段server_targets待连接的目标列表至少一个worker 端实际构造连接时会在每个 target 前补dns:///前缀见 grpc-benchmark/src/client.rsclient_typeSYNC_CLIENT、ASYNC_CLIENT等枚举当前 Rust 实现接受SyncClient与AsyncClient两种取值outstanding_rpcs_per_channel每个 channel 上并发的在途 RPC 数必须 0client_channels要创建的独立 channel 数必须 0第 i 个 channel 连接server_target[i % size]rpc_typeUNARY/STREAMING服务端流式 ping-pong等枚举load_params负载模型。ClosedLoopParams一个 RPC 完成后立即发起下一个是当前实现的唯一支持项PoissonParams泊松到达率的开放环路在源码中显式返回unimplemented注释说明待 xDS 基准测试支持时再实现payload_config负载内容。支持SimpleProtoParamsreq_size/resp_sizeByteBufferParams与ComplexProtoParams在 client 与 server 中均返回unimplementedhistogram_params延迟直方图参数resolution与max_possible语义见下文。ServerConfig 与安全参数ServerConfig的关键字段是port0 表示由系统挑选空闲端口实际绑定值通过ServerStatus.port回传给驱动与security_params。SecurityParams中use_test_ca为 true 时启用 TLS 并使用内置测试证书server_host_override用于客户端覆盖连接 authoritySNI/证书校验主机名。负载与基准服务定义被测服务定义于 grpc-benchmark/proto/grpc/testing/benchmark_service.proto即BenchmarkServiceUnaryCall(SimpleRequest) returns (SimpleResponse)一请求一响应服务器原样回显客户端负载StreamingCall(stream SimpleRequest) returns (stream SimpleResponse)流式 ping-pong逐条回显StreamingFromClient/StreamingFromServer/StreamingBothWays其余三种组合形态本仓库的 proto server 均返回unimplemented见 grpc-benchmark/src/server.rs 中ProtoServer的实现。BenchmarkServer被压测服务的实现要点BenchmarkServer::startgrpc-benchmark/src/server.rs负责按ServerConfig拉起被压测服务核心要点如下HTTP/2 自适应窗口Server::builder().http2_adaptive_window(Some(true))开启自适应流控窗口这是基准测试场景下提升高带宽流吞吐的常见调优项TLS 支持当配置了SecurityParams且use_test_ca为 true 时加载编译期嵌入的测试证书include_bytes!读取 grpc-benchmark/data/tls/server1.pem 与server1.key构造ServerTlsConfig否则使用空的 TLS 配置动态端口port 0时绑定到0.0.0.0:0由操作系统分配端口随后通过local_addr()获取实际端口并保存到BenchmarkServer.portTCP 细节对每个接入连接调用set_nodelay(true)关闭 Nagle 算法降低小包延迟统计采样get_stats(reset)基于Instant与Rusage见 grpc-benchmark/src/rusage.rsUnix 下用nix的getrusage(RUSAGE_SELF)取用户态与内核态时间差计算time_elapsed、time_user、time_system并返回ServerStatscq_poll_count等字段按官方约定置 0Java 与 Go 同样不设置这些字段。被测 handler 的实现非常轻量unary_call构造一个响应体为vec![0; response_size]的SimpleResponse直接返回streaming_call对入站流逐条回显同样大小的响应体模拟真实协议开销但不去做业务计算从而让压测聚焦在 RPC 框架本身的吞吐与延迟上。BenchmarkClient闭循环压测与直方图采集BenchmarkClient::startgrpc-benchmark/src/client.rs是压测负载的生成端实现要点如下配置校验依次校验client_type、payload_config仅接受SimpleParams、load_params仅接受ClosedLoop、client_channels 0、outstanding_rpcs_per_channel 0、server_targets非空不合规即返回带具体原因的invalid_argument/unimplemented状态TLS 客户端凭证若配置use_test_ca加载内置 grpc-benchmark/data/tls/ca.pem 作为信任根构造RustlsChannelCredentials若提供server_host_override则通过Channel::builder(...).authority(...)覆盖连接 authority测试场景中常用假域名foo.test.google.fr配合测试 CA 做证书校验否则使用LocalChannelCredentials明文连接任务拓扑任务总数num_tasks client_channels × outstanding_rpcs_per_channel每个 channel 一个Channel按rpc_type为每个在途 RPC spawn 一个 Tokio 任务运行blocking_unary或blocking_streaming的闭循环闭循环语义每个任务循环执行——先检查取消标记与统计请求标记watch通道再发起一次 RPC 并计时将耗时纳秒记录进共享的hdrhistogram::Histogram统计请求到达时将直方图快照通过mpsc通道送回reset为 true 时清空直方图后继续。流式模式下是发送一条请求 → 接收一条响应的 ping-pong时间从发送前计时到接收完成统计聚合get_stats通过watch::Sender广播统计请求等待所有num_tasks个直方图回传并合并2 秒超时返回deadline_exceeded随后基于合并结果计算min_seen、max_seen、sum、sum_of_squares、count并按指数桶把频次铺满到max_possible上限驱动端期望覆盖全部桶区间封装为ClientStats返回。直方图与延迟百分位计算延迟统计依赖HistogramParams的两个参数grpc-benchmark/proto/grpc/testing/stats.protoresolution第一个桶为[0, 1 resolution)后续桶按resolution指数增长默认 0.01即 1%max_possible覆盖的最大延迟上限超过该值histogram.record会失败并打印告警bench 中设为60e9纳秒即 60 秒。bench通过calculate_percentilegrpc-benchmark/src/bin/bench.rs在HistogramDataView上做线性插值累计桶频次直至达到percentile × count再在目标桶内按比例内插出延迟值从而得到 p50 / p90 / p99 等指标。独立驱动 bench无需官方 driver 的本地压测bench是理解整套框架调用关系的最佳入口grpc-benchmark/src/bin/bench.rs。它展示了驱动 → worker → 被测服务/客户端的完整闭环运行流程为在127.0.0.1:0上临时绑定一个监听端口作为 worker 服务端口本地 spawnWorkerServiceServer用grpccrate 的Channeldns:///127.0.0.1:portLocalChannelCredentials创建WorkerServiceClient通过run_server流式 RPC 下发ServerConfig{port: 0}动态端口等待ServerStatus返回真实绑定端口通过run_client流式 RPC 下发ClientConfig等待客户端就绪先预热 5 秒随后发送Mark{reset: true}清零统计再运行设定的时长发送Mark{reset: false}取回最终ClientStats计算并打印报告关闭两个流并通知本地 worker 退出。命令行参数从--help输出grpc-benchmark/src/bin/bench.rs 的main函数可以拿到完整的参数清单Usage: bench --duration secs --channels num --rpcs-per-channel num --rpc-type unary|streaming [--secure] [--req-size bytes] [--resp-size bytes]参数必填默认值说明-d, --duration是无压测时长秒--channels否1客户端 channel 数--rpcs-per-channel是无每个 channel 的并发在途 RPC 数--rpc-type是无unary或streaming其他取值报错--secure否关闭启用 TLS使用内置测试 CA--req-size否1请求负载字节数--resp-size否1响应负载字节数参数解析使用pico-args多参数字段解析完成后会调用pargs.finish()任何未消费的残留参数都会被当作错误抛出。启用--secure时bench 会在ServerConfig中设置SecurityParams{use_test_ca: true}并在ClientConfig中设置SecurityParams{use_test_ca: true, server_host_override: foo.test.google.fr}——这正是上面提到的测试 CA 主机名覆盖的典型用法。报告输出示例压测结束后 bench 按如下格式打印结果QPS 由count / time_elapsed计算延迟单位毫秒来自calculate_percentile的插值结果Benchmark Config: Duration: 10 s Channels: 1 RPCs per channel: 16 RPC type: unary Security: insecure Request size: 100 bytes Response size: 100 bytes Benchmark server bound to port: 49821 Warming up for 5 seconds... Running benchmark for 10 seconds... Report: QPS: 152301.25 Avg Latency: 0.1037 ms 50th Percentile Latency: 0.0923 ms 90th Percentile Latency: 0.1310 ms 99th Percentile Latency: 0.2846 ms编译与运行在仓库根目录工作区下可以分别运行两个二进制# 方式一worker 模式供官方 driver 或自定义驱动远程调用 cargo run -p grpc-benchmark --bin worker -- --driver_port50051 # 方式二bench 模式自包含驱动本地完成全流程压测 cargo run -p grpc-benchmark --bin bench -- \ --duration 10 --channels 2 --rpcs-per-channel 8 \ --rpc-type unary --req-size 100 --resp-size 100 # TLS 模式 cargo run -p grpc-benchmark --bin bench -- \ --duration 10 --channels 1 --rpcs-per-channel 4 \ --rpc-type streaming --secure编译该 crate 需要仓库内多个本地依赖grpc、tonic、tonic-prost、grpc-protobuf、protoc-gen-rust-grpc、grpc-protobuf-build、tonic-prost-build等且 Unix 平台下额外引入nixresourcefeature用于资源统计tonic依赖启用了tls-aws-lc特性main 入口中通过rustls::crypto::aws_lc_rs::default_provider().install_default()安装默认加密提供者。需要说明的是当前实现聚焦于官方基准测试框架的协议兼容ByteBufferParams、ComplexProtoParams、泊松负载与其余三种流式 RPC 形态在源码中明确标注为未实现使用时应以SimpleProtoParamsUnaryCall/StreamingCall场景为准。与官方框架的关系及适用前提需要再次强调的是本目录在 gRPC 生态中的定位依据 grpc-benchmark/README.md 的原文表述本目录只包含 worker、server、client 三个环节的实现驱动编排代码与完整的运行指导位于 gRPC 官方仓库的tools/run_tests/performance目录属于外部独立维护的部分官方通过这些基准测试持续监控各语言 gRPC 实现的性能并将指标呈现于其性能仪表盘。因此本文所讲述的worker二进制面向的是官方 driver 下发配置的交互协议而bench则是本仓库为便于本地验证而提供的独立入口。理解这一分工就能清楚区分协议实现本仓库的 Rust 部分与场景编排官方 driver的边界也能更准确地解读control.proto中Scenario、ScenarioResultSummary等由 driver 侧消费的数据结构。赞分享后端RPC框架【免费下载链接】grpc-rustA native gRPC client server implementation with async/await support.项目地址https://gitcode.com/GitHub_Trending/to/grpc-rust点击查看免费下载相关推荐终极指南gRPC性能基准测试与主流RPC框架全面对比分析终极指南gRPC性能基准测试与主流RPC框架全面对比分析 gRPC作为现代云原生应用的远程过程调用RPC框架以其跨语言支持、高效二进制协议和强大的生态系后端RPC框架微服务通信2025实测Egg.js性能碾压Express三大Node.js框架基准测试全解析2025实测Egg.js性能碾压Express三大Node.js框架基准测试全解析 你还在为Node.js后端框架选型纠结当Express的轻量、Nest后端Web框架Node.js版本管理实战指南nvm深度解析与最佳实践Node.js版本管理实战指南nvm深度解析与最佳实践 Node.js版本管理是每个JavaScript开发者必须掌握的核心技能之一。nvmNode VerCLI开发工具版本控制上一篇如何快速解决歌词不同步问题LyricsX歌词偏移调整终极指南下一篇KoboldAI-Client实战指南本地AI写作助手深度解析与部署实践创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

柑橘果目标检测实战:labelme数据集转YOLO训练与避坑指南 2026/10/2 2:44:24

柑橘果目标检测实战:labelme数据集转YOLO训练与避坑指南

简介:面向智慧农业与计算机视觉研究的柑橘果目标检测数据集,包含579张真实果园场景JPG图片与580个Labelme JSON标注文件,资源包共1159个文件、约125.72MB。标注目标分为树上柑橘(On-tree)与树下柑橘(Under-…

阅读更多 →
SGD与Adam显存占用差异解析:优化器状态如何影响深度学习训练 2026/10/2 2:44:24

SGD与Adam显存占用差异解析:优化器状态如何影响深度学习训练

在训练深度学习模型的过程中,显存不够用的场景基本人人都经历过。而显存消耗的构成里,除了模型参数、梯度和激活值,优化器的状态往往是被低估的大头。我接触过的不少新手同学,在调参阶段先把SGD换成Adam试了试,结果发现…

阅读更多 →
交通拥堵预测毕设实战:从数据检查到LSTM模型完整流程 2026/10/2 2:44:24

交通拥堵预测毕设实战:从数据检查到LSTM模型完整流程

简介:这份资源是面向计算机、人工智能、通信工程等专业学生与教师的交通拥堵预测毕设项目包,围绕GCM Corridor真实路网数据展开,解决基于历史交通流预测未来30分钟道路拥堵状态的问题。项目已测试可运行,适合课程设计、毕业设计、…

阅读更多 →
Python电商数据分析系统实战:从数据清洗到RFM可视化 2026/10/2 2:44:24

Python电商数据分析系统实战:从数据清洗到RFM可视化

简介:这份资源是面向计算机、自动化等相关专业学生的Python课程大作业电商平台数据分析系统,包含完整实现源码与使用教程说明,可直接用于期末课程设计、课程大作业或毕业设计,也适合作为个人练手项目。项目围绕电商业务展开&#…

阅读更多 →
SpringBoot+Vue汽车4S店车辆管理系统毕设源码解析与运行指南 2026/10/2 2:44:24

SpringBoot+Vue汽车4S店车辆管理系统毕设源码解析与运行指南

简介:面向计算机相关专业毕业设计与Java实战学习,这套基于SpringBootVue的汽车4S店车辆管理系统完整项目源码包,采用前后端分离架构,实现了管理员、销售员、维修员三类角色的权限管理,涵盖客户管理、供应商与保险公司维…

阅读更多 →
DeepSeek Harness实测:从模型到可编排工作流的工程实践 2026/10/2 2:44:11

DeepSeek Harness实测:从模型到可编排工作流的工程实践

最近在给团队搭 AI 工作流,接连踩了几个坑之后,发现一个很有意思的现象:DeepSeek 的模型能力讨论度一直很高,但从模型到真正可用的工作流中间缺了一层。很多人拿到了 API Key,却卡在“怎么把 DeepSeek 接进自己的项目、…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉