变量

qianmoQqianmoQ· 更新于 2026-10-05· 阅读 10 分钟· 0 次阅读

登录后可跨设备保存划线和私人笔记登录

vars

了解 vars 服务。

bvar 是一组计数器,用于在多线程应用中方便地记录和查看各类统计信息。其实现通过将数据存放在线程本地存储(TLS)中来减少缓存弹跳,在高竞争场景下比 UbMonitor(百度内部的旧式计数库)甚至原子操作都要快得多。brpc 默认集成了 bvar,也就是说服务器中所有暴露的 bvar 都可以通过 /vars 访问,单个 bvar 则可通过 /vars/VARNAME 访问。阅读 bvar 可了解如何为你的程序添加 bvar。brpc 大量使用 bvar 来暴露内部状态。如果你正在寻找用于收集和展示应用指标的工具,请优先考虑 bvar。bvar 并不能取代所有的计数器,本质上它只是把写入时发生的竞争转移到了读取时:读取时需要汇总所有线程写入的数据,因此比普通读取要慢得多。如果对计数器的读写都很频繁,或者需要根据最新值做出决策,就不应使用 bvar。

查询方法

/vars:列出所有暴露的 bvar

/vars/NAME:列出名为 NAME 的 bvar

/vars/NAME1,NAME2,NAME3:列出名称为 NAME1、NAME2 或 NAME3 的 bvar。

/vars/foo*,b$r:列出名称匹配给定通配符模式的 bvar。注意 $ 匹配单个字符,而不匹配 ?,因为后者是 URL 中的保留字符。

下面的动画演示了如何使用通配符模式查找 bvar。你可以将该 URL 复制粘贴给其他人,他们看到的 bvar 与你看到的相同。(数值可能会变化)

img

/vars 页面的左上角有一个搜索框,你可以在其中输入名称的一部分来定位 bvar。不同的模式之间用 , : 或空格分隔。

img

/vars 也可以从终端访问:

$ 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

查看历史趋势

点击大多数数值型 bvar 可以查看其历史趋势。每个可点击的 bvar 会记录最近 60 秒、60 分钟、24 小时和 30 天 的数值,共计 174 个数。1000 个可点击的 bvar 大约占用 1M 内存。

img

计算并查看百分位

x-ile(x 百分位的简称)是指在一组有序数值中排在 N * x% 位置上的数值。例如,若某个时间窗口内有 1000 个值,先将其升序排序,有序列表中的第 500 个值(1000 * 50%)即为 50-ile(也称中位数),第 990 个值(1000 * 99%)为 99-ile,第 999 个值为 99.9-ile。相比均值,百分位能提供更多关于延迟分布的信息,有助于更精确地分析系统行为。工业级服务通常要求 SLA 不低于 99.97%(百度内部二级服务的要求,一级服务要求 >=99.99%),即使系统的平均延迟表现良好,糟糕的长尾区域仍可能使 SLA 不达标。百分位确实有助于分析长尾区域。

百分位可以绘制成 CDF 曲线或随时间变化的百分位曲线。

下图将百分位绘制为 CDF,其中 X 轴是比例(排序位置/总数),Y 轴是对应的百分位值。例如,X=50% 对应的 Y 值即为 50-ile。如果一个系统要求“99.9% 的请求必须在 Y 毫秒内处理完成”,你就应该查看 99.9% 处对应的 Y 值。

img

为什么称之为 CDF?当选定一个 Y=y 时,对应的 X 表示“小于等于 y 的数值所占的百分比”。由于数值是随机(且均匀)采样的,X 可以看作是“数值小于等于 y 的概率”,即 P(values <= y),这正是 CDF 的定义。

CDF 的导数即 PDF。如果将 CDF 的 Y 轴划分成许多小区间,计算每个区间两端 X 值的差值,并以该差值作为新的 X 轴数值,就可以绘出一条 PDF 曲线,看起来就像顺时针旋转 90 度的正态分布。然而在 PDF 中,中位数处的密度往往远高于其他位置,可能导致长尾区域非常平缓、难以读取。因此,系统更倾向于用 CDF 而非 PDF 来展示分布。

下面给出两条简单的规则,用于判断一条 CDF 曲线的好坏:

  • 越平缓越好。一条水平线是理想的 CDF 曲线,意味着不存在等待、拥塞或停顿,但这在实践中几乎不可能出现。
  • 99% 到 100% 之间的面积应尽可能小:99% 右侧即为长尾区域,对 SLA 有显著影响。

在实践中,一条上升平缓且长尾区域面积较小的 CDF 曲线是很理想的。

下图将百分位绘制为随时间变化的曲线,共包含四条曲线。X 轴是时间,Y 轴从上到下依次为 99.9%、99%、90%、50% 的百分位,颜色由浅至深(从橙色到黄色)绘制。

img

将鼠标悬停在曲线上可显示对应时刻的数值。上图中的提示信息表示“39 秒之前的延迟第 99 百分位数为 330 微秒”。该图未包含 99.99 分位数曲线,因为它通常明显高于其他曲线,会使其他曲线难以阅读。你可以点击以“_latency_9999”结尾的 bvar,单独查看 99.99 分位数曲线。该图展示了各百分位数随时间的变化情况,有助于分析系统的性能退化问题。

brpc 会自动计算服务的延迟分布,无需用户手动添加。相关指标如下:

img

bvar::LatencyRecorder 能够计算任意代码的延迟分布,如下所示(详情请参阅 bvar-c++]):

#include <bvar/bvar.h>

...
bvar::LatencyRecorder g_latency_recorder("client");  // expose this recorder
...
void foo() {
    ...
    g_latency_recorder << my_latency;
    ...
}

如果应用程序已经启动了 brpc server,则可以从 /vars 中以如下方式查看 client_latency、client_latency_cdf 等值。点击它们即可查看(动态更新的)曲线:

img

非 brpc server

如果您的程序只使用了 brpc client,甚至完全没有使用 brpc,但又想查看这些曲线,请参阅此处。


最后修改于 2022 年 5 月 17 日:update brpc users page (devlive-community/knowforge#71) (a31ce10d3)

评论

登录后参与评论

正在加载评论…