brpc 内置指标查询指南:通过 /vars 监控 bvar 计数器与延迟分位数
RPC框架后端微服务网络通信【免费下载链接】brpcbrpc is an Industrial-grade RPC framework using C Language, which is often used in high performance system such as Search, Storage, Machine learning, Advertisement, Recommendation etc. brpc means better RPC.项目地址https://gitcode.com/gh_mirrors/brpc6/brpc点击查看免费下载brpc 默认集成 bvar 计数器库所有进程内暴露expose的 bvar 都可以通过内置服务/vars以 HTTP 方式查询。本文以官方文档 docs/en/vars.md 为主线结合 src/bvar 与 src/brpc/builtin/vars_service.cpp 的源码实现讲解如何用精确名、通配符检索 bvar、查看历史趋势曲线以及如何计算和解读 CDF / 百分位延迟曲线最终帮助你用这些指标定位性能长尾、保障 SLA。bvar 是什么为什么值得监控bvar 是一套面向多线程应用的高性能计数器库用于方便地记录和查看各类统计信息。其核心设计是通过**线程局部存储TLS**降低缓存一致性开销cache bouncing每个线程只写自己私有的数据区不参与全局原子竞争读取时再把所有线程的数据合并。因此在高度竞争的场景下bvar 的写入开销远低于传统原子操作也明显快于百度内部的旧版统计库 UbMonitor。这一设计也决定了它的适用边界bvar 把写入时的竞争转移到了读取端——读取需要合并所有线程写下的数据比普通读取慢得多。所以文档明确指出如果某个计数器的读写都很频繁或者需要基于最新值立刻做决策就不应使用 bvar。它最适合低频率的日志输出、监控展示这类写多读少的场景。brpc 自身大量使用 bvar 暴露内部状态例如bthread_creation_count : 125134 bthread_creation_latency : 3 bthread_creation_latency_50 : 3 bthread_creation_latency_90 : 5 bthread_creation_latency_99 : 7 bthread_creation_latency_999 : 12 bthread_creation_latency_9999 : 12 bthread_creation_latency_cdf : click to view bthread_creation_latency_percentiles : [3,5,7,12] bthread_creation_max_latency : 7 bthread_creation_qps : 100 bthread_group_status : 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 bthread_num_workers : 24 bthread_worker_usage : 1.01056此外 bvar 还默认提供以process_/system_为前缀的进程级、系统级指标见 docs/en/bvar.mdprocess_context_switches_involuntary_second : 14 process_cpu_usage : 0.428 process_cpu_usage_user : 0.286 process_disk_write_bytes_second : 260902 process_memory_resident : 392744960 system_core_count : 12 system_loadavg_1m : 0.000如果你正在为应用寻找一个采集与展示指标的方案bvar 值得优先考虑——brpc 服务天然将其暴露无需额外埋点即可看到大量内部状态。/vars 查询方法精确名、多名称与通配符只要服务是 brpc server内置服务默认开启就可以通过以下 URL 查询 bvar查询方式示例说明列出全部/vars列出所有已暴露的 bvar按名称查询/vars/rpc_socket_count列出名为rpc_socket_count的 bvar按多个名称查询/vars/pid;process_cpu_usage;rpc_controller_count同时列出多个名称用;、,或空格分隔通配符匹配/vars/rpc_server*_count;iobuf_blo$k_*按通配符模式匹配一组 bvar关于通配符有一个易错点$匹配单个字符而?是 URL 中的保留字符不能直接使用。这一点在源码中也有印证——src/brpc/builtin/vars_service.cpp 在构造bvar::DumpOptions时将question_mark显式设置为$white_wildcards则取自 HTTP 请求的未解析路径unresolved_path随后调用bvar::Variable::dump_exposed()完成过滤输出。通配符的过滤行为由 src/bvar/variable.cpp 中的bvar_dump_include/bvar_dump_exclude相关机制同一套代码支撑DumpOptions同时支持白名单与黑名单通配符所以 URL 查询与文件 dump 的匹配语义是一致的。/vars页面左上角还提供了一个搜索框输入名称片段即可实时定位 bvar多个模式之间用,、:或空格分隔搜索请求会实时回发到服务端并刷新列表对应vars_service.cpp中toURL()/search()这段前端逻辑。你可以把带通配符的 URL 直接复制粘贴分享给他人对方会看到与你相同的 bvar 列表数值可能随时间变化。在终端用 curl 查询 /vars/vars同样支持命令行访问。浏览器请求时会返回 HTML 页面服务端通过UseHTML()判断并设置text/html内容类型而 curl 等终端工具默认得到纯文本输出text/plain格式为每行一条name : value$ curl brpc.baidu.com:8765/vars/bthread* bthread_creation_count : 125134 bthread_creation_latency : 3 bthread_creation_latency_50 : 3 bthread_creation_latency_90 : 5 bthread_creation_latency_99 : 7 bthread_creation_latency_999 : 12 bthread_creation_latency_9999 : 12 bthread_creation_latency_cdf : click to view bthread_creation_latency_percentiles : [3,5,7,12] bthread_creation_max_latency : 7 bthread_creation_qps : 100 bthread_group_status : 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 bthread_num_workers : 24 bthread_worker_usage : 1.01056注意上述示例中的brpc.baidu.com:8765是官方演示服务地址实际使用时应替换为你自己的 brpc 服务地址与端口例如127.0.0.1:8000/vars/...。从源码看/vars返回时还会启用 gzip 压缩cntl-set_response_compress_type(COMPRESS_TYPE_GZIP)所以即便 bvar 数量很大传输开销也可控。除了网页与 curl还可以给 URL 追加?series参数VarsService::default_method()会检测到series查询参数后调用bvar::Variable::describe_series_exposed()以application/json返回该 bvar 的时序采样数据这正是前端绘图所依赖的数据接口src/brpc/builtin/vars_service.cpp。查看历史趋势60 秒、60 分钟、24 小时与 30 天大多数数值型 bvar 都是可点击的。点击后页面会展示该指标的历史趋势曲线每个可点击的 bvar 会记录最近60 秒、60 分钟、24 小时、30 天四个时间尺度的采样值合计174个数值。这 174 个数值并非估算而是源码中实实在在的数据布局。在 src/bvar/detail/series.h 中序列数据被保存在定长数组里T _array[60 60 24 30];其中前 60 格存秒级样本接着 60 格存分钟级、24 格存小时级、30 格存天级。正因为内存占用是固定的文档才给出1000 个可点击的 bvar 大约占用 1M 内存的估算每个 bvar 约 1KB174 × 若干字节/样本。这些序列由采样器线程周期驱动bvar::detail::Sampler的take_sample()会被一个专用线程每秒调用一次见 src/bvar/detail/sampler.hReducerSampler会把每秒的快照压入有界队列BoundedQueue后续按窗口尺寸求差值或求和即可得到任意时间窗的统计值。这也解释了为什么Window类指标在极端情况下会有一秒的延迟——它们的数据来自每秒一次的采样。计算与查看百分位数Percentile百分位数的含义x-ilex 百分位指一组有序数值中位于N × x%位置的值。例如时间窗口内有 1000 个延迟样本升序排列后第 500 个值1000 × 50%即 50-ile也就是中位数第 990 个值1000 × 99%是 99-ile第 999 个值1000 × 99.9%是 99.9-ile。相比平均值百分位数能揭示延迟的真实分布对分析系统行为更准确。工业级服务通常对 SLA 有硬性要求——例如百度内部二级服务要求不低于 99.97%一级服务不低于 99.99%——即使平均延迟很好糟糕的长尾区域仍可能击穿 SLA。百分位数正是分析长尾区域最直接的武器。CDF 曲线看分布形状百分位数可以绘制成 CDF累积分布函数曲线或百分位随时间变化曲线。CDF 图的 X 轴是比例排序位置 / 总数Y 轴是对应的百分位值。例如 X50% 对应的 Y 值就是 50-ile。如果系统要求99.9% 的请求要在 Y 毫秒内处理完就应该检查 X99.9% 处的 Y 值。为什么叫 CDF因为任取一个 Yy其对应的 X 表示值 ≤ y 的比例。由于样本是近似均匀随机采样这个比例可以看作值 ≤ y 的概率即 P(values ≤ y)这正是 CDF 的定义。CDF 的导数即 PDF概率密度函数把 CDF 的 Y 轴切分成许多小段取每段两端 X 值的差作为新 X 轴就能得到类似正态分布旋转 90° 的 PDF 曲线。但中位数附近的密度往往远高于其他区域会把长尾压得非常平、难以阅读因此系统更倾向于用 CDF 而非 PDF 展示分布。判断 CDF 曲线好坏的两条简单规则越平越好理想 CDF 是水平直线意味着没有等待、拥塞或停顿——实践中几乎不可能99% 到 100% 之间的面积越小越好99% 右侧就是长尾区域对 SLA 影响显著。实践中缓慢上升且长尾面积小的 CDF 曲线是最理想的形态。百分位随时间曲线定位性能回退百分位随时间曲线包含四条曲线X 轴是时间Y 轴从上到下分别是 99.9%、99%、90%、50% 分位值颜色由橙到黄逐渐变浅。鼠标悬停可以看到对应时刻的值。例如图上 tooltip 的含义是39 秒前的 99% 延迟分位为 330 微秒。该图刻意不包含 99.99-ile 曲线因为它通常显著高于其他曲线会把其他曲线压得难以阅读如需单独查看 99.99-ile可以点击名称以_latency_9999结尾的 bvar。这类图展示了分位数随时间的变化非常适合分析系统的性能回退performance regression。brpc 自动计算的延迟指标brpc 会自动为服务计算延迟分布无需用户手工添加。这些指标会出现在/vars中例如从源码看这套指标由bvar::LatencyRecorder支撑。src/bvar/latency_recorder.h 显示它内部聚合了多个子 bvar_latencyIntRecorder平均延迟_max_latencyMaxerint64_t最大延迟_latency_percentilePercentile分位数原始数据_latency_p1/_p2/_p3/_999/_9999PassiveStatusint64_t50%、75%p2/p3 由bvar_latency_p1/p2/p3三个 gflag 决定具体分位、99.9%、99.99% 分位值_latency_cdfCDF可绘制的 CDF 数据_latency_percentilesPassiveStatusVectorint64_t, 4分位数组。expose(prefix)后会生成以prefix为前缀的一族变量如xxx_latency、xxx_max_latency、xxx_count、xxx_qps、xxx_latency_percentiles、xxx_latency_cdf等见 src/bvar/latency_recorder.h 的注释与实现。百分位底层基于 src/bvar/detail/percentile.h 的PercentileInterval延迟被采样进固定大小的区间查询时升序排序后按下标取值get_sample_at并通过合并时每个样本以近似等概率保留的策略在内存与精度之间取得平衡。bvar::LatencyRecorder可以对任意代码段计算延迟分布用法如下详见 docs/en/bvar_c.md#include bvar/bvar.h ... bvar::LatencyRecorder g_latency_recorder(client); // expose 该 recorder ... void foo() { ... g_latency_recorder my_latency; // 记录一次延迟 ... }如果应用已经启动了 brpc server就可以在/vars中看到client_latency、client_latency_cdf等指标点击即可查看动态刷新的曲线非 brpc server 场景dummy server如果你的程序只使用 brpc client甚至完全不使用 brpc但仍想通过网页查看 bvar 曲线有两种方式见 docs/cn/dummy_server.md仅使用 brpc client在程序运行目录下创建一个名为dummy_server.port的文件内容写一个端口号如 8888。程序启动后会自动在该端口起一个空 serverdummy server进程内所有 bvar 都可以通过其内置服务查看。完全不用 brpc需要手动添加 dummy server。先参考 docs/en/getting_started.md 完成编译接入然后在程序入口加入#include brpc/server.h ... int main() { ... brpc::StartDummyServerAt(8888/*port*/); ... }延伸将 bvar 导出到 Prometheus 与本地文件/vars只是 bvar 消费方式的一种。bvar 还支持把指标导出到 Prometheus将 Prometheus 抓取目标的路径设为/brpc_metrics即可。例如 brpc server 运行在localhost:8080则抓取地址配置为127.0.0.1:8080/brpc_metrics。其实现位于 src/brpc/builtin/prometheus_metrics_service.cpp通过PrometheusMetricsDumper将 bvar 输出为 Prometheus 文本格式。同时 bvar 支持按固定周期把全部已暴露变量写入本地文件默认关闭。控制它的 gflag 定义在 src/bvar/variable.cppgflag默认值作用bvar_dumpfalse开启后台线程周期性 dump 所有 bvar关闭时所有bvar_dump_*均不生效bvar_dump_exclude按逗号分隔的通配符排除某些 bvar空表示不排除bvar_dump_filemonitor/bvar.app.datadump 输出的文件路径bvar_dump_include按逗号分隔的通配符只保留匹配的 bvar空表示全部bvar_dump_interval10两次 dump 之间的间隔秒bvar_dump_prefixapp每个 dump 出的名字附加的前缀bvar_dump_tabslatency*_latency*...按过滤器把 bvar 分到不同的 tab格式tab_namewildcards分号分隔注意这些 gflag 大多注册了校验器/回调validate_bvar_dump、wakeup_dumping_thread建议通过命令行参数-bvar_dumptrue或google::SetCommandLineOption()动态修改而不要直接赋值FLAGS_bvar_dump_file等 std::string 类型的 gflag——前者会触发校验与唤醒 dump 线程后者既存在线程安全问题也不会让导出线程生效。dump 文件与普通日志不同每次导出会覆盖之前的文件而不是追加。总结brpc 默认暴露全部 bvar/vars是统一的查询入口支持精确名、多名称;/,/空格分隔与通配符*多字符、$单字符数值型 bvar 可点击查看 60 秒/60 分钟/24 小时/30 天共 174 个采样点构成的历史趋势数据布局见 src/bvar/detail/series.h延迟类指标由bvar::LatencyRecorder自动计算平均、最大、QPS、count、50%/90%/99%/99.9%/99.99% 分位与 CDF普通代码段也可用同一工具自行埋点长尾99% 之后是 SLA 的最大威胁CDF 越平、长尾面积越小越好只跑 client 或完全不用 brpc 的程序可通过 dummy server 获得同样的可视化能力生产环境还可借助/brpc_metrics对接 Prometheus。赞分享RPC框架后端微服务网络通信【免费下载链接】brpcbrpc is an Industrial-grade RPC framework using C Language, which is often used in high performance system such as Search, Storage, Machine learning, Advertisement, Recommendation etc. brpc means better RPC.项目地址https://gitcode.com/gh_mirrors/brpc6/brpc点击查看免费下载相关推荐brpc /vars 服务与 bvar 计数器实战多线程指标统计、通配符查询与分位值分析指南brpc /vars 服务与 bvar 计数器实战多线程指标统计、通配符查询与分位值分析指南 本文以 brpc 内置的 /vars https://link.后端RPC框架通信网络brpc /vars 监控服务完全指南bvar 查询、历史趋势与分位数CDF分析实战brpc /vars 监控服务完全指南bvar 查询、历史趋势与分位数CDF分析实战 本文以 Apache brpc工业级 C RPC 框架的 d后端RPC框架通信网络brpc 服务性能排查实战基于内置 vars 指标与 rpcz/bvar 定位 CPU-bound 与 IO-bound 瓶颈brpc 服务性能排查实战基于内置 vars 指标与 rpcz/bvar 定位 CPU bound 与 IO bound 瓶颈 本篇技术指南以 brpc 官方后端RPC框架通信网络上一篇DataV 项目推荐下一篇DataV 开源项目常见问题解决方案创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

3个血泪坑:图解慕容雪配置报错,环境卡半天全因它

3个血泪坑:图解慕容雪配置报错,环境卡半天全因它

3个血泪坑:图解慕容雪配置报错,环境卡半天全因它 刚接手新项目,导入依赖后终端直接转圈卡死,报错信息长得像乱码。这种配置环境就卡半天的经历,谁懂?别急,今天不整虚的,直接上 图解原理…

2026/9/22 9:50:00 阅读更多 →
后盖新手避坑:3个致命错误让你多花1万块

后盖新手避坑:3个致命错误让你多花1万块

后盖新手避坑:3个致命错误让你多花1万块 官方文档那厚厚几百页,翻两页就头晕,核心逻辑反而被淹没在细节里。很多新手一上来就照着 Wiki 里的伪代码硬写,结果在真机上跑崩了,还得自己慢慢猜哪里出了问题。 这就是典型的 新手避坑…

2026/9/22 9:50:00 阅读更多 →
3天搞定绵阳论坛完整示例,面试不再卡壳

3天搞定绵阳论坛完整示例,面试不再卡壳

3天搞定绵阳论坛完整示例,面试不再卡壳 面试被问原理答不上来,这行字戳中了多少转岗新人的肺管子?你背了八股文,却在实战项目里栽了跟头。今天不讲虚的,直接上 绵阳论坛…

2026/9/22 9:49:00 阅读更多 →

最新新闻

基于YOLOv11的电力巡检无人机绝缘子缺陷检测实战指南

基于YOLOv11的电力巡检无人机绝缘子缺陷检测实战指南

简介:这份PDF教程面向电力巡检领域的技术人员、无人机应用开发者以及目标检测方向的初学者,围绕YOLOv11在绝缘子缺陷检测中的落地实践展开。内容从电力巡检的重要性与传统方法局限切入,系统梳理绝缘子裂纹、破损、污秽、老化等缺陷类型&#…

2026/9/23 15:02:30 阅读更多 →
3步搞定百度年龄计算器:从入门到精通的实战指南

3步搞定百度年龄计算器:从入门到精通的实战指南

3步搞定百度年龄计算器:从入门到精通的实战指南 版本升级后 API 全变了,这大概是每个写代码的人最崩溃的时刻。你精心调好的接口,突然返回 404…

2026/9/23 15:02:30 阅读更多 →
共享单车预测与调度实战:基于LSTM的PyTorch毕业设计完整方案

共享单车预测与调度实战:基于LSTM的PyTorch毕业设计完整方案

简介:面向毕业设计的共享单车预测与调度深度学习解决方案,提供完整Python源码及数据文件。方案针对共享单车区域供需不平衡问题,以神经网络构建需求量与时间段、地理画像的关联,实现分区域需求预测,并采用蚁群算法求解…

2026/9/23 15:02:30 阅读更多 →
科技行业职场生存法则:高绩效老将的突然陨落

科技行业职场生存法则:高绩效老将的突然陨落

1. 职场生存现状:高绩效老将的突然陨落在科技行业打拼13年的资深员工,54岁时遭遇裁员,从CEO亲自表扬的明星员工到"最差绩效"的突然转变,价值1200万美元的股票期权瞬间归零——这个案例揭示了科技行业残酷的生存法则。作…

2026/9/23 15:02:30 阅读更多 →
3天搞定在线商城系统性能图解原理

3天搞定在线商城系统性能图解原理

3天搞定在线商城系统性能图解原理 凌晨两点,监控大屏突然变红。CPU 飙到 95%,QPS 从稳定的 2000 跌到 500,订单接口平均响应时间从 80ms 暴涨到…

2026/9/23 15:02:30 阅读更多 →
默纳克11KW底座原理图详解:从主回路到IGBT驱动与故障检修

默纳克11KW底座原理图详解:从主回路到IGBT驱动与故障检修

简介:汇川默纳克十一千瓦底座原理图是一份专供电路板维修使用的PDF电路图,面向变频器、电梯驱动及伺服控制设备的维修与技术支持人员,用于理解十一千瓦电机驱动系统中各电气组件和连接方式。图中详细标注了电容、电阻、二极管、晶体管、电感、…

2026/9/23 15:01:29 阅读更多 →

日新闻

3招搞定手机怎么下载微信面试难题实战项目解析

3招搞定手机怎么下载微信面试难题实战项目解析

3招搞定手机怎么下载微信面试难题实战项目解析 面试被问“手机怎么下载微信”背后的原理,90%的人答不上来。别笑,这看似弱智的问题,实则是考察你对移动应用分发机制、安全校验及网络协议理解的试金石。我带过不少校招新人,他们背了八股文,却连一个A…

2026/9/23 0:00:23 阅读更多 →
2k显示屏性能优化踩坑:版本升级后API全变了,这份源码解析救了我

2k显示屏性能优化踩坑:版本升级后API全变了,这份源码解析救了我

2k显示屏性能优化踩坑:版本升级后API全变了,这份源码解析救了我 刚把开发环境的显示器从1080P换到2K,跑老项目直接报错,版本升级后 API…

2026/9/23 0:01:25 阅读更多 →
3步搞定美眉图实战项目,告别官方文档抓不住重点

3步搞定美眉图实战项目,告别官方文档抓不住重点

3步搞定美眉图实战项目,告别官方文档抓不住重点 官方文档翻了三遍还是云里雾里?别急,美眉图在实战项目中常被用来做数据可视化,但它的原理比你想的简单。今天咱们直接上手,用一个完整的小项目把美眉图跑通,不再死磕那些冗长的理论说明。…

2026/9/23 0:01:25 阅读更多 →

周新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡…

2026/9/23 4:55:02 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/23 4:49:06 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&…

2026/9/23 9:53:41 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/23 9:53:40 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/23 9:53:40 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/23 9:53:40 阅读更多 →