brpc学习:bvar

brpc组件bvar源码解析(一)简介、使用和类的关系 bvar是brpc中的一个重要组件,brpc内部有很多builtin监控都是bvar实现的。 brpc文档介绍bvar“几乎不会给程序增加性能开销,也快于竞争频繁的原子操作”。它的原理是:多线程累加一个计数器时,每个线程只累加私有的变量而不参与全局竞争,因此写时没有锁的竞争;在读取时累加所有线程的私有变量。虽然读比之前慢多了,但写就快多了,因此它使用写多读少的场景,例如统计、监控场景。 1.使用 // bvar::Adder<T>用于累加,下面定义了一个统计read error总数的Adder。 阅读详情

一.介绍

bvar是多线程环境下的计数器类库,方便记录和查看用户程序中的各类数值,它利用了thread local存储减少了cache bouncing,相比UbMonitor(百度内的老计数器库)几乎不会给程序增加性能开销,也快于竞争频繁的原子操作。

brpc集成了bvar,http接口下的/vars可查看所有曝光的bvar,/vars/VARNAME可查阅某个bvar,在brpc中的使用方法请查看vars。

brpc大量使用了bvar提供统计数值,当你需要在多线程环境中计数并展现时,应该第一时间想到bvar。

但bvar不能代替所有的计数器,它的本质是把写时的竞争转移到了读:读得合并所有写过的线程中的数据,而不可避免地变慢了。当你读写都很频繁或得基于最新值做一些逻辑判断时,你不应该用bvar。

常用的bvar有:

• bvar::Adder : 计数器,默认0,varname << N相当于varname += N。
• bvar::Maxer : 求最大值,默认std::numeric_limits::min(),varname << N相当于varname = max(varname, N)。
• bvar::Miner : 求最小值,默认std::numeric_limits::max(),varname << N相当于varname = min(varname, N)。
• bvar::IntRecorder : 求自使用以来的平均值。注意这里的定语不是“一段时间内”。一般要通过Window衍生出时间窗口内的平均值。
• bvar::Window : 获得某个bvar在一段时间内的累加值。Window衍生于已存在的bvar,会自动更新。
• bvar::PerSecond : 获得某个bvar在一段时间内平均每秒的累加值。PerSecond也是会自动更新的衍生变量。
• bvar::LatencyRecorder : 专用于记录延时和qps的变量。输入延时,平均延时/最大延时/qps/总次数 都有了。
• bvar::Status:记录和显示一个值,拥有额外的set_value函数。
• bvar::PassiveStatus:按需显示值。在一些场合中,我们无法setvalue或不知道以何种频率setvalue,更适合的方式也许是当需要显示时才打印。用户传入打印回调函数实现这个目的。

二. bvar的导出

最常见的导出需求是通过HTTP接口查询和写入本地文件。前者在brpc中通过内置的http服务提供(即通过/vars/xxx访问),后者则已实现在bvar中,默认不打开。

1. bvar_dump方式

可以通过flag打开:
在这里插入图片描述
当bvar_dump_file不为空时,程序会启动一个后台导出线程以bvar_dump_interval指定的间隔更新bvar_dump_file,其中包含了被bvar_dump_include匹配且不被bvar_dump_exclude匹配的所有bvar。

注意:bvar程序必须要在持续运行中,才会记录下bvar,一闪而过的简单程序,不会记录下bvar值。

三.通过bvar_dump方式导出示例代码

#include <bvar/bvar.h>
#include <gflags/gflags.h>
#include <glog/logging.h>
#include <iostream>

using namespace std;

int main(int argc, char* argv[]) {
    google::ParseCommandLineFlags(&argc, &argv, true);

    bvar::Adder<int> g_read_error;
    g_read_error << 10 << 20;
    g_read_error.expose("add_reader");

   bvar::Status<int> foo_count2;
   foo_count2.expose("foo_count2");
   for(int i=0; i<2000; ++i) {
   		foo_count2.set_value(i);
   		int a;
   		cin >> a;
   		if(a == 0){
   			break;
   		}
	}

    return 0;
}

编译:

cc_binary(
    name = 'bvar',
    srcs = 'bvar.cpp',
    deps = [
    	'#brpc',
	'#gflags',
	'#glog'
    ]
)

flag文件bvar.gflags:

-bvar_dump=true
-bvar_dump_interval=1

运行后,在当前目录会生成monitor文件夹,进入后会产生两个文件:

bvar.bvar.data
bvar.bvar.system.data

带system的bvar记录了系统监控值,第一个文件里记录了add_reader和foo_count2值:

bvar_add_reader : 30
bvar_bthread_key_count : 0
bvar_bthread_keytable_count : 0
bvar_bthread_keytable_memory : 0
bvar_bthread_stack_count : 0
bvar_bvar_dump_interval : 1
bvar_bvar_sampler_collector_usage : 0.000225182
bvar_foo_count2 : 4

默认bvar_dump_interval是10s,即每10s更新一次文件,可以设置短一点,看出效果,每执行一次循环,bvar_foo_count2值就加1。

四.http获取bvar示例代码

当然也可以通过brpc内置的http服务获取bvar。
如果你的程序只使用了brpc的client或根本没有使用brpc,但你也想使用brpc的内置服务,只要在程序中启动一个空的server就行了,这种server称为dummy server。

只要在程序运行目录建立dummy_server.port文件,填入一个端口号(比如8888),程序会马上在这个端口上启动一个dummy server。在浏览器中访问它的内置服务,便可看到同进程内的所有bvar。

示例代码:

#include <bvar/bvar.h>
#include <iostream>
#include <brpc/server.h>

using namespace std;

int main(int argc, char* argv[]) {
   brpc::StartDummyServerAt(8080);

   bvar::Status<int> foo_count2;
   foo_count2.expose("foo_count2");
   for(int i=0; i<2000; ++i) {
   		foo_count2.set_value(i);
   		int a;
   		cin >> a;
   		if(a == 0){
   			break;
   		}
	}

    return 0;
}

编译文件与上面一样,运行后,就可以像brpc那样,通过访问http接口就可以访问所有的bvar了。
如访问foo_count2这个bvar,就通过下面的url访问:
http://192.168.12.32:8080/vars/foo_count2

brpc源码解析(十)—— 核心组件bvar详解(1)简介和整体架构 目录1. 主要核心类及其作用2. 类变量和初始化3. push函数4. pop函数5. steal函数6. atomic_thread_fence(butil::memory_order_seq_cst)的必要性7. volatile_size函数 Bvar是Brpc使用的多线程环境下的计数器类库,作为一个完善的rpc框架,在实际生产环境中统计诸如qps、连接数等各种数值是必须的,是服务监控的很重... 阅读详情

相关推荐

【项目学习】brpc

小菜learning 这些内容全部摘自https://github.com/apache/incubator-brpc/ 1.bvar bvar是多线程环境下的计数器类库,方便记录和查看用户程序中的各类数值,它利用了thread local存储减少了cache bouncing,相比UbMonitor(百度内的老计数器库)几乎不会给程序增加性能开销,也快于竞争频繁的原子操作。brpc...

o小菜的博客 2713

brpc源码分析--bvar组件(五)

bvar中很重要的一个组件,bvar除了是一个性能优秀的计数器,设计的最重要的使用场景就是监控,通过了解bvar::Adder和bvar::LatencyRecorder两个类,基本就能比较好的掌握其设计。从源码也能看出为了追求高性能做了很多优化。

qq_18447271的博客 1734

【brpc学习实践八】bvar及其应用

bvar是多线程环境下的计数器类库,支持单维度bvar和多维度mbvar,方便记录和查看用户程序中的各类数值,它利用了thread local存储减少了cache bouncing,相比UbMonitor(百度内的老计数器库)几乎不会给程序增加性能开销,也快于竞争频繁的原子操作。brpc集成了bvar,/vars可查看所有曝光的bvar,/vars/VARNAME可查阅某个bvar,在brpc中的使用方法请查看vars。

qq_42936727的博客 1031

2021SC@SDUSC BRPC代码分析(一) —— bvar综述、variable类详解

2021SC@SDUSC 文章目录一、bvar的背景知识学习二、框架功能简介三、下载编译四、项目分工总结 一、bvar的背景知识学习 bvar是多线程环境下的计数器类库,方便记录和查看用户程序中的各类数值,它利用了thread local存储减少了cache bouncing,相比UbMonitor(百度内的老计数器库)几乎不会给程序增加性能开销,也快于竞争频繁的原子操作。brpc集成了bvar,/vars可查看所有曝光的bvar,/vars/VARNAME可查阅某个bvar,在brpc中的使用方法请查

m0_46306466的博客 1015

bvar:贝叶斯VAR模型

变种 贝叶斯FAVAR模型 这些代码适用于用Scipy和Numpy用Python编写的贝叶斯因子增强VAR代码。 该规范的目的是分析韩国的工业生产率溢出效应。

向量自回归

这一章所讲述的向量自回归模型(Vector Auto regression, VAR)以及向量误差修正模型(Vector Error Correction, VEC)的估计与分析。同时也给出一些检验几个非稳定变量之间协整关系的工具

brpc 全景指南:从 RPC 核心原理到工业级 C++ 框架实战

brpc(better RPC)是百度内部孵化并开源的工业级 C++ RPC 框架,本文以官方 [docs/en/overview.md](https://link.gitcode.com/i/3a30977a0cfc2d11a52aec65e9974b76) 为主线,系统讲解 RPC 解决的核心问题、brpc 的能力边界与适用场景,并结合仓库源码深入剖析其 "三个头文件" 的极简 API 设计、

gitblog_00551的博客 220

【5G NB-IoT NTN】3GPP R17 NB-IoT NTN介绍_nbiot ntn

在3GPP R17协议中,将NB-IoT集成到了NTN(非陆地网络,即卫星通信)中,并定义了一个系统架构。在这个架构中包括一个可配置再生payload的低轨道(LEO)卫星,这意味着该卫星可以执行传统基站的全部或部分功能。该系统架构还可以适配同步轨道(GEO)卫星,这些卫星与LEO卫星类似,也可以配置再生payload。系统高度范围轨道波束覆盖范围LEO300~1500km绕地球转100~1000kmGEO35786km与地球自转同步200~3500km。

2401_84010302的博客 3567

brpc 框架构建部署:4 步从源码编译到跑通第一个 RPC 服务

brpc 是百度开源的工业级 C++ RPC 框架,解决高性能系统中的服务间通信问题,广泛用于搜索、存储、机器学习等场景。本文带你走一遍 brpc 框架编译部署的完整路径:装好依赖、编译源码、用最小 echo 示例验证、并给出上线前的关键取舍,全程约 4 个步骤。 ## 项目速览 - **定位**:C++ 编写的生产级 RPC 框架,单端口可同时承载 HTTP/HTTPS、h2/gRPC、Th

gitblog_00442的博客 486

Python学习24:中国古代数学问题——物不知数(Python123)

意思是说有一些物品,不知道有多少个,3个3个数的话,还多出2个;5个5个数则多出3个;7个7个数也会多出2个。题目为‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬:今有物不知其数,三三数之剩二,五五数之剩三,七七数之剩二,问物几何?现假设物品总数不超过n (n

weixin_60530224的博客 2万+

如何利用VS2017创建一个简单的窗口

#如何利用VS2017创建一个简单的窗口 1、新建->Windows桌面向导 2、应用程序类型->桌面应用程序,点击确定 3、点击调试->开始调试 可建立如下图的窗口 4、可以在生成的项目文件的中找到windows17_2的应用程序,打开界面如下: 注:新建空白项目也可以,注意在解决方案资源器中添加.cpp文件,如源.cpp文件,下载代码见博文 ...

weixin_46894139的博客 2914

brpc 服务端故障排查实战指南:从工作线程、CPU 指标到 rpcz 与 bvar 的定位方法论

brpc 服务在线上出现"卡顿""超时""QPS 上不去"时,往往很难直接判断瓶颈在 CPU 还是在 IO。本文以 brpc 官方运维文档 `docs/cn/server_debugging.md` 为骨架,给出从宏观指标(工作线程数、CPU 使用率)到微观手段(rpcz 时间线、bvar 计数器、profiler)的一整套排查流程:先看 `/vars` 面板判定线程与 CPU 是否够用,再区分

gitblog_00563的博客 1067

电池管理系统(BMS)技术全景解析:从基础原理到智能未来

《BMS技术演进与核心功能解析》摘要: 电池管理系统(BMS)作为新能源系统的智能中枢,已从基础保护电路发展为具备预测能力的智能系统。文章系统梳理了BMS三大技术时代:1.0保护时代(1990-2000)采用硬件保护电路;2.0智能时代(2000-2020)引入SOC算法;3.0云脑时代(2020后)实现AI预测。详细解析了BMS三大核心模块:AFE感知系统(±2mV精度)、功率驱动模块(10μs级保护)和均衡技术(效率提升至85%),并对比了主动/被动均衡技术差异。同时阐释了SOC/SOH等关键参数定义与

bother3000的博客 2982

告别性能盲区:brpc bvar统计系统实战指南

你是否还在为RPC服务的性能瓶颈发愁?当系统并发量飙升时,如何快速定位性能卡点?作为百度开源的高性能RPC框架,brpc内置的[bvar统计系统](https://link.gitcode.com/i/2533c2e69e0fc5a716b2bada34dde050)提供了零侵入的性能监控方案。本文将带你从零掌握bvar的核心用法,通过实战案例学会用性能计数器构建全方位监控体系,让服务性能问题无所...

gitblog_00532的博客 993

【100%通过率】华为od 机试真题 C语言 实现【补种未成活胡杨】

近些年来,我国防沙治沙取得显著成果。某沙漠新种植N棵胡杨(编号1-N),排成一排。一个月后,有M棵胡杨未能成活。现可补种胡杨K棵,请问如何补种(只能补种,不能新种),可以得到最多的连续胡杨树?

MISAYAONE的博客 1653

js逆向实战:爬取淘宝男装商品

本文介绍了一个淘宝商品数据爬取程序的技术实现方案。该程序通过分析淘宝H5页面接口,实现了商品名称、价格、销量等关键信息的抓取,并支持图片下载功能。核心内容包括:1. 使用Request库发送HTTP请求获取数据;2. 通过逆向分析淘宝的签名算法(MD5加密)生成合法请求;3. 解析JSON数据并提取商品信息;4. 处理分页参数实现多页数据爬取;5. 将数据保存为CSV文件并下载商品图片。程序还实现了反爬虫绕过、错误处理、文件管理等辅助功能,完整展示了从数据采集到存储的全过程。

那些看似不起波澜的日复一日,会在某天让你看到坚持的意义 1572

空格键秒开文件:Windows 上的免费 QuickLook 完整指南

QuickLook 是一款免费的开源工具,把 macOS 上"选中文件、按一下空格"的预览体验搬到了 Windows。不打开任何应用,文件内容立刻浮现在你眼前。下面带你快速上手,再挖几个进阶用法。 ## 你是不是也被这些场景卡住过 客户发来 30 张设计图让你确认,传统做法是逐张双击,等看图软件加载完,再看下一张。 想核对一份 400 页 PDF 的版本,翻到目录页就够,却要等阅读器整个打开

gitblog_00964的博客 201

SAP-ABAP:SAP HANA性能神器FDA:是极速查询的引擎,也是CPU过载的元凶

在SAP S/4HANA的世界里,有一个被ABAP开发者们既爱又怕的特性——Fast Data Access(FDA),它能将性能提升百倍,也能让CPU瞬间飙升。本文将带您全面解剖这一核心机制。

baidu_35680696的博客 847

brpc bvar 指标库完全指南:基于 TLS 的高性能计数器、监控导出与 Prometheus 集成

**导读**:bvar 是 brpc 内置的一套面向多线程应用的多功能计数器(counter)体系,通过线程本地存储(TLS)大幅消除写路径上的缓存抖动与锁竞争,让开发者在几乎不影响性能的前提下全面采集业务与系统指标。本指南将讲解 bvar 的设计原理、七种常用计数器类、命名与暴露规范、brpc 内置的 process_/system_ 系列指标、落盘 dump 监控方案,以及通过 `/brpc_

gitblog_00948的博客 444

用Python爬取大连商品交易所期货实时行情:从入门到实战

python复制编辑# utils.py"豆粕": "M0","铁矿石": "I0","聚乙烯": "L0","玉米": "C0","聚丙烯": "PP0","棕榈油": "P0"本项目展示了:✅ 如何从新浪财经 API获取主力合约实时数据✅ 使用Python异步爬虫技术) 提升效率✅ 利用pandas和matplotlib进行结构化分析与可视化✅ 具备良好的扩展性,可对接金融、农业、能源等数据需求场景✅ 可作为期货量化策略数据源✅ 可嵌入自动化报告系统。

2201_76125261的博客 1246

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

brpc bvar C++ 使用指南:从计数器定义、注册导出到线程安全与性能权衡

> **导读**:bvar 是 brpc 内置的高性能多线程计数器库,用于在多线程程序中便捷地记录与查看各类统计指标。本文以 [docs/en/bvar_c++.md](https://link.gitcode.com/i/f9161718664600f30ce1c1c9ce364d7a) 为骨架,系统讲解 brpc 中 bvar 的 C++ 使用方式:从 7 大类常用变量的定义与用法、全局注册(

gitblog_00295的博客 753

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

brpc 内置指标查询指南:通过 /vars 监控 bvar 计数器与延迟分位数

brpc 默认集成 bvar 计数器库,所有进程内暴露(expose)的 bvar 都可以通过内置服务 `/vars` 以 HTTP 方式查询。本文以官方文档 [docs/en/vars.md](https://link.gitcode.com/i/779b834e61938b811da4c0349c1ebb2f) 为主线,结合 [src/bvar](https://link.gitcode.co

gitblog_07333的博客 499

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

brpc Dummy Server 完全指南:为纯客户端程序开启内置服务与 bvar 监控

brpc 是一个工业级的 C++ RPC 框架,它的强大不仅体现在服务端与客户端的高性能通信上,还体现在丰富的**内置服务**(built-in services)上——例如 `/status`、`/vars`、`/flags`、`/connections` 等 HTTP 页面,可以实时观测进程的延迟、QPS、连接状态与各类 bvar 指标。但如果你在程序中只使用了 brpc 的 client,甚

gitblog_00106的博客 264

brpc组件bvar源码解析(二)AgentGroup和AgentCombiner

上一篇:brpc组件bvar源码解析(一)简介、使用和类的关系 1.AgentGroup AgentGroup中通过tls数据实际保存了bvar在每个线程中的统计值。 AgentGroup类的定义: 模板参数Agent实际传入的是AgentCombiner::Agent这个结构体;对于Agent相同的bvar,例如两个bvar::Adder< int >,在AgentGroup中实际的存储空间是同一块buffer,通过AgentId定位(类似一个数组的不同下标)。 成员变量都是static的,

华秋实的专栏 881
上一篇: 使用tcpcopy导线上流量
下一篇: mysql多行记录合并为一行
okiwilldoit
博客等级 码龄17年 86粉丝 283原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值