一.介绍

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. brpc学习笔记(1)

    文章目录 一.简介及各个文档学习 1.1 bvar 1.2 bthread 1.3 client 1.4 server 1.5 内置服务 1.6 工具 参考 一.简介及各个文档学习 brpc是一款RP ...

  2. brpc源码学习(六)- brpc server 端整体流程

    brpc的使用比较容易上手,以官方demo为例,因为brpc的数据序列化依赖protobuf,所以首先需要定义个proto 然后继承EchoService并实现Echo方法 然后是整体流程 启动还是比 ...

  3. brpc源码学习(五)-IOBuf

    目录 Block BlockRef IOBuf 主要api tls优化 IOPortal protobuf接口 首先放上官方介绍: brpc使用butil::IOBuf作为一些协议中的附件或http ...

  4. brpc源码学习(二)-bthread的创建与切换

    brpc引入m:n的线程模型,固定的内核线程调度运行大量的bthread以避免内核线程上下文切换带来的开销. bthread类似协程,即用户态线程,bthread的切换不会陷入内核,不会进行一系列内存 ...

  5. brpc线程模型学习

    bthread是brpc使用的M:N线程库,目的是在提高程序的并发度的同时,降低编码难度,并在核数日益增多的CPU上提供更好的scalability和cache locality. "M:N ...

  6. brpc源码学习(一)-butex

    由于brpc中引入了bthread,如果在bthread中使用了mutex,那么将会挂起当前pthread,导致该bthread_worker无法执行其他bthread,因此类似pthread和fut ...

  7. 百度开源RPC框架brpc

    9 月 14 日,百度正式在 GitHub 上基于 Apache 2.0 协议开源了其 RPC 框架 brpc.brpc 是一个基于 protobuf 接口的 RPC 框架,在百度内部称为" ...

  8. 2021SC@SDUSC BRPC代码分析(七) —— bthread综述、Butex及mutex详解

    2021SC@SDUSC 文章目录 一.bthread的背景知识学习 二.代码分析 总结 一.bthread的背景知识学习 经过前面6篇代码分析,我将BRPC一个极其实用的工具--bvar做了全面系统 ...

  9. 这可能是东半球最保姆级的后台服务器开发学习路线

    作者 | 编程指北 来源 | 编程指北(id :cs_dev) 前言 这一篇的主题是「Linux C/C++ 服务器/后台开发学习路线」. 这样的文章相信大家都见得不少了,写之前也非常忐忑,能不能和其 ...

最新文章

  1. js 自动关闭html页面,JS关闭窗口或JS关闭页面的几种代码分享
  2. 何谓程序员?何谓中国的程序员?
  3. Java 中使用反射来创建对象、调用方法
  4. 动静分离-静态资源缓存控制
  5. AJAX框架衣柜内部布局,​最合理的衣柜内部布局解析,3大细节不容小觑
  6. linux mysql general_利用mysql general log 写shell 可行性简要分析
  7. 【KDD20】TAdaNet: 用于图增强元学习的任务自适应网络
  8. 源码剖析panic与recover,看不懂你打我好了!
  9. [PTA]7-24 约分最简分式
  10. c语言switch例题注释,switch语句例子大全 C语言switch语句例题
  11. CodeForces - 140C New Year Snowmen
  12. 【目标定位】基于matlab粒子滤波的定位算法【含Matlab源码 2161期】
  13. 快手二面:a==1 a==2 a==3 是 true 还是 false?
  14. Mac恢复被修改的文档
  15. python运维脚本简书_通过python+selenium3实现浏览器刷简书文章阅读量
  16. nnet3-chain-copy-egs用于chain模型输入数据
  17. 网络安全入门实验04:病毒专杀工具的制作
  18. UReport2 - 套打实现
  19. 【案例】“1GB1年1毛钱“——使用 Backup exec 基于阿里云OSS 实现企业数据异地备份 【服务器管理】【云备份】
  20. 本原多项式和不可约多项式

热门文章

  1. 电话交换机和网络交换机_网络中交换机的介绍和工作
  2. 【每日最爱一句】2013.07.18
  3. java jmf播放mp3_关于jmf不能播放mp3的问题解决
  4. 什么是消费者需求研究
  5. 市场复苏下:报复性消费,了解一下~
  6. 无法识别usb设备如何解决
  7. vue2.0自学教程(一):走进vue2.0大观园
  8. linux制作deepin启动盘制作工具,深度启动盘制作工具(Deepin Boot Maker)下载_深度启动盘制作工具(Deepin Boot Maker)官方下载-太平洋下载中心...
  9. leetcode回溯算法
  10. sim7600ce 拨号上网测试_SIM7600CE TCP/IP连接与PPP拨号上网 4G上网